View Full Version : سوال: کند شدن برنامه بعد از استفاده از thread
hadisalahi2
دوشنبه 04 شهریور 1392, 12:12 عصر
با سلام به دوستان عزیز
یک مشکل واقعا تعجب انگیز در برنامم بعد از استفاده از ترد پیدا کردم که خودم هم دلیلش رو متوجه نمیشم
من یک برنامه اتوماسیون دارم که در اون در چندین زمان مختلف و در داخل تایمر ، چند جدول رو برای وجود پیام یا ارجاع جدید بررسی میکنه.
دیروز اومدم تا به حساب خودم ، برنامه رو با thread بنویسم و اون چک کردن ها رو به جای تایمر بزارم توی ترد
اما متاسفانه نه تنها سرعت بهتر نشد
بلکه خیلی هم بد تر شد و حتی در مواردی برنامه قفل میکند.
من داخل برنامه 8 تا ترد دارم که هر کدام وظیفه بررسی یک کار رو دارند
ولی مدت زمانهای چک کردن اونها یکی نیست
از 10 ثانیه تا 5 دقیقه مدت زمان اجرای هر ترد هستش
من برای استفاده از ترد ها از کامپوننت BMDThread استفاده میکنم
در ضمن داخل چند تا از ترد ها هم کار چک کردن قفل سخت افزاری رو انجام میدم.
حالا به نظر شما مشکل پایین اومدن سرعت برنامه و قفل کردن چی میتونه باشه:
1- استفاده زیاد از تردها (مثلا همین 8 تردی که من استفاده کردم)
2- استفاده از این کامپوننتی که اسم بردم
3- چک کردن قفل داخل ترد
4- یا اینکه دلایل دیگه ای میتونه داشته باشه
ممنون میشم اگه دوستان اطلاعات خودشون رو در این باره بیان کنند
BORHAN TEC
دوشنبه 04 شهریور 1392, 16:21 عصر
سلام
لطفاً کدتون رو قرار بدین. اگر هم نمیتوانید این کار رو انجام بدین کدی مشابه بنویسید که بتوانیم آنرا تست و بررسی کنیم.
موفق باشید...
hadisalahi2
سه شنبه 05 شهریور 1392, 12:30 عصر
من از کامپوننت BMDThread استفاده میکنم
و برنامه اصلی خیلی سنگین هستش و فرم های زیادی داره و اصلا امکان قراردادن کد وجود نداره
اشکال کند شدن برنامه تقریبا دستگیرم شد
یک تکه از چک کردن قفل بود که بعد از چند بار چک شدن ، برنامه روی همون قسمت قفل میکنه
حالا نمیدونم مشکل از قفل هستش و یا از کامپوننتی که استفاده می کنم.
اما حالا یک مشکل جدید و تعجب بر انگیز تر پیدا کردم !!! :متعجب::متعجب:
ترد بعد از چند بار اجرا دیگه اجرا نمیشه و هنگامی که بریک پوئینت میزارم ، دیگه برنامه متوقف نمیشه
حالا این یکی رو موندم که کامپوننت BMDThread مشکل داره ، یا کلا تردها در دلفی
دوستان خواهش میکنم اگه با تردها یا این کامپوننت کار کردند ، حتما اطلاعاتشون رو در اختیار قرار بدند. :اشتباه:
خیر سرمون اومدیم سرعت اجرای برنامه رو ببریم بالا ، کلا برنامه از بیخ قفل کرد :عصبانی:
Mask
سه شنبه 05 شهریور 1392, 14:04 عصر
دوست عزیز.
خود دلفی به این قشنگی و راحتی پیاده سازی ترد رو در اختیارتون میزاره. نیازی به کامپوننت نیست که.
من اگه بودم کل پیاده سازی رو خودم انجام میدادم.
یوسف زالی
سه شنبه 05 شهریور 1392, 14:32 عصر
سلام.
من نمی دونم دلیل مشکل شما چیه ولی تجربم رو می گم بلکه به کارتون بیاد.
در کار با یک برنامه ارسال انبوه اس ام اس از ترد استفاده کرده بودم که در شرایطی که غیر قابل تریس بود (18 تا ترد) برنامه روی بعضی از ترد ها "قفل" می شد و Resume نمی شد.
با گذاشتن قفل ها و Critical های مختلف و کاستن متغیر ها بالاخره فهمیدم که ایراد از کجاست:
در کار با ترد ها اگر تردی رو دارید بیش از یک بار استارت می کنید (بنا به دلایل گوناگون) ویندوز در لحظه ای که بهش می گید فلان ترد رو Suspend یا Resume کن لزوما همون لحظه به حرفتون گوش نمی کنه.
دلیل این کار رو به صورت خیلی دقیق نمی دونم ولی فهمیدم که برمی گرده به اولویت بندی کارهای ویندوز، وقتی تردی رو ران می کنید، اگر اون رو ساسپند کنید، حتما می دونید که به تعداد دستورات ساسپند باید دوباره ریسام کنید تا شمارش گر صفر بشه، وقتی تردی رو ساسپند می کنید، ویندوز ممکنه در همون لحظه این کار رو نکنه و وقتی اون ترد رو ریسام می کنید اون شمارنده دست می خوره..
یک اشکال دیگه که سبب کندی می شد این بود که از Sleep در حلقه استفاده می کردم، در حالی که همون تایم رو با GetTickCount پیاده کردم و سرعت تکون اساسی خورد.
حالا اگر اشکال از همون ساسپند و ریسام بود براش راه حل هست.
امکان داره اصلا کامپوننت مورد استفاده تون مشکل رو داشته باشه.
بررسی کنید بگید.
hadisalahi2
سه شنبه 05 شهریور 1392, 17:01 عصر
با تشکر از دوست عزیز
من اصلا به هیچ عنوان در کدی که استفاده می کنم ، ترد رو Suspend نمیکنم که بعدا لزومی به Resume داشته باشه
من ترد رو در اول اجرای برنامه و در فرم اصلی استارت میکنم و این دیگه به هیچ عنوان ترد رو Suspend نمیکنم
مگر در زمانی که برنامه به اتمام برسه یا در چک کردن کد ، قفل از سیستم حذف شده باشه که اون موقع ترد رو Stop میکنم.
در مورد این اولویت بندی هم ، اتفاقا خودم هم به این موضوع پی برده بودم ، چون موقعی که از برنامه خارج میشم ، چند ثانیه طول میکشه تا همه ترد ها Stop بشند
این کامپوننتی که استفاده میکنم ، خودش یک گزینه برای تعیین اولویت داره
البته من ازش استفاده نکردم . یعنی فکر میکردم شاید دلیلی برای این کار نباشه.
حالا واقعا موندم که کامپوننت مشکل داره یا مشکل از جای دیگه ای هستش
اگه صلاح بدونید ، من کامپوننت رو قرار بدم تا شما هم یک بار تست کنید ؟
وست عزیز.
خود دلفی به این قشنگی و راحتی پیاده سازی ترد رو در اختیارتون میزاره. نیازی به کامپوننت نیست که.
من اگه بودم کل پیاده سازی رو خودم انجام میدادم.
آخه این کامپوننت کار کردن با ترد ها رو خیلی راحت انجام میده
احتیاجی هم به ذخیره ترد در یک یونیت جدا نیست
و همچنین تنظیمات ترد رو به صورت ویژوال میتونی انجام بدی
در کل یک برنامه نویس ، برای راحت تر شده کارش از کامپوننت استفاده میکنه
من هم به همین منظور از این کامپوننت استفاده کردم
ولی این طور که باد میاد و شاخه می جنبه ، باید به سراغ همون ترد دلفی برم (البته اگه اونجا هم مشکل نداشته باشه) :افسرده:
یوسف زالی
سه شنبه 05 شهریور 1392, 20:21 عصر
بگذارید ببینیم خب!
hadisalahi2
چهارشنبه 06 شهریور 1392, 09:41 صبح
خدمت شما
برای دلفی 7 و 2007 پکیج داره
برای دنسخه های دیگه هم خودتون میتونید بسازید
منتظر نتیجه هستم
یا علی
hadisalahi2
پنج شنبه 07 شهریور 1392, 16:33 عصر
دوستان هنوز نتیجه نگرفتند؟
hadisalahi2
یک شنبه 10 شهریور 1392, 08:50 صبح
کس از دوستان این کامپوننت رو تست نکرده هنوز؟
یوسف زالی
یک شنبه 10 شهریور 1392, 09:16 صبح
راستش من یه کلی نگاه انداختم، چیز خاصی دستگیرم نشد.
احتمال می دم در نحوه استفاده از ترد در برنامتون مشکل وجود داشته باشه.
hadisalahi2
یک شنبه 10 شهریور 1392, 16:32 عصر
یک سوال کلی
آیا به نظر شما تعداد ترد های برنامه در سرعت اینترفیس اصلی برنامه تاثیر میزاره یا نه؟
در اصل موضوع ، این موضوع نباید اتفاق بیوفته
چون اساس استفاده از ترد ، همین هستش که سرعت اینترفیس نیاد پایین
اما شما که عملا با این مدل کار کردید ، نظرتون چیه؟
یوسف زالی
یک شنبه 10 شهریور 1392, 16:47 عصر
استفاده از ترد در برنامه ای که پروسس های مستقل از اینترفیس نداره، هیچ تاثیری روی سریع تر شدن واکنش برنامه به اینترفیس نداره.
استفاده از ترد برای واکشی اطلاعات از دی بی تاثیری روی سریع تر شدن برنامه نداره مگر اینکه چندین واکشی رو روی چندین ترد بصورت موازی انجام بدید.
در حقیقت همین کار می شه پروسس مستقل از اینترفیس ..
تا اینجاش رو که خودتون هم بهتر از من می دونستید،
اما گاهی پیش میاد که با گذاشتن پروسس های موازی روی ترد های دیگه، ترد اصلی برنامه هم کند می شه،
دلیلش می تونه این باشه که اولویت ترد هاتون رو خیلی بالا بردید،
یکی از دلایلش هم این می تونه باشه که روی لااقل یکی از ترد ها، حلقه ای دارید که تعداد لوپ اجرایی بالایی داره، بی اینکه حتی یک لحظه هم اون رو Sleep کرده باشید.
همون طور که داشتن Sleep در حلقه برای ساخت DelayTime بالا سرعت رو به شدت کاهش می ده، همون طور هم نذاشتنش در حلقه های ترد باعث کندی شدید MainThread می شه.
توصیه من در این حالت اینه که پس از هر لوپ، لااقل یک Sleep به مدت زمان 1 میلی ثانیه داشته باشید تا در این حین که این ترد ساسپند می شه، ویندوز خنگ بفهمه که تردهای دیگری هم هستند.
اگر اشکال برنامه شما این باشه، به راحتی آب خوردن قابل رفع هست و اصلا نگرانی نداره.
موفق باشید.
hadisalahi2
یک شنبه 10 شهریور 1392, 17:10 عصر
استفاده از ترد در برنامه ای که پروسس های مستقل از اینترفیس نداره، هیچ تاثیری روی سریع تر شدن واکنش برنامه به اینترفیس نداره.
اساسا وقتی یک ترد رو اجرا میکنه ، مستقل از اینترفیس اجرا میشه
البته به غیر از این کامپوننتی که گذاشتم یا کامپوننت های مشابه
به نظر شما ممکنه ، ترد وابسه به اینترفیس باشه ؟
اگه ممکنه ، میشه یه مثال بزنید
استفاده از ترد برای واکشی اطلاعات از دی بی تاثیری روی سریع تر شدن برنامه نداره مگر اینکه چندین واکشی رو روی چندین ترد بصورت موازی انجام بدید.
اکثر برنامه هایی که نوشته میشه ، یک جوری با بانک اطلاعاتی در ارتباطه و اساسا شاید بالای 80 درصد برنامه ها یک جوری با بانک اطلاعاتی درگیر هستند.
من موقعی که با تایمر ، یک مقدار از بانک رو چک میکنم ، هیچ تاثیری روی سرعت برنامه نداره
اما موقعی که همین کار رو با ترد انجام میدم ، متاسفانه احساس میکنم سرعت پایین تر میاد.
دلیلش می تونه این باشه که اولویت ترد هاتون رو خیلی بالا بردید،
اولویت همه تردهای استفاده شده من Normal هستش و احتیاجی به بالا بردن اولویت ندارم
یکی از دلایلش هم این می تونه باشه که روی لااقل یکی از ترد ها، حلقه ای دارید که تعداد لوپ اجرایی بالایی داره، بی اینکه حتی یک لحظه هم اون رو Sleep کرده باشید.
اجرای ترد بدون Sleep که کلا برنامه رو می خوابونه
مسلما از Sleep استفاده میکنم
مثلا این کد رو نگاه کن
procedure TForm3.E1(Sender: TObject; Thread: TBMDExecuteThread;var Data: Pointer);
begin
while true do
begin
SleepEx ( 10000, false );
if ( Thread.Terminated ) then
begin
hadi1.Stop();
hadi1.OnTerminate := NIL;
break;
end;
Thread.Synchronize ( AKr );
end;
end;
ویندوز خنگ بفهمه که تردهای دیگری هم هستند.
خداییش این یکی رو خوب اومدی
در کلا من به این نتیجه رسیدم که استفاده از ترد ، در برنامه هایی که فشار زیادی همزمان به CPU وارد نمیکنه ، نه تنها باعث بالا رفتن سرعت نمیشه ، بلکه اون رو کند تر هم میکنه
به نظر من ترد ، فقط در مواردی کاربرد داره که اینترفیس یا کدهای اصلی ، فشار زیادی رو به CPU وارد میکنند
و ترد میتونه توی این موارد موثر باشه
البته این نظر شخصی و در حد استفاده من از ترد ها هستش
دوستان اگه نظر جامع تر و کامل تری دارند ، حتما ارئه بدند
Felony
یک شنبه 10 شهریور 1392, 19:05 عصر
ویندوز خنگ بفهمه که تردهای دیگری هم هستند.
خداییش این یکی رو خوب اومدی
:)))))))))))))))
در کلا من به این نتیجه رسیدم که استفاده از ترد ، در برنامه هایی که فشار زیادی همزمان به CPU وارد نمیکنه ، نه تنها باعث بالا رفتن سرعت نمیشه ، بلکه اون رو کند تر هم میکنه
به نظر من ترد ، فقط در مواردی کاربرد داره که اینترفیس یا کدهای اصلی ، فشار زیادی رو به CPU وارد میکنند
و ترد میتونه توی این موارد موثر باشه
البته این نظر شخصی و در حد استفاده من از ترد ها هستش
دوستان اگه نظر جامع تر و کامل تری دارند ، حتما ارئه بدند
لزوما نیازی به فشار همزمان یا ... نیست :)
در کل کارهای زمانبر رو باید به ترهای جداگانه بسپارید ، این یک سناریو کلی هست ، اینکه چطور این کارهای سنگین رو به کارهای کوچکتر تقسیم کنید ، به تردها بسپارید ، بین تردها ارتباط برقرار کنید ، تردها رو منتظر پاسخ هم بزارید و ... و ... همگی بستگی به سناریو شما ، نوع برنامه و تخصص برنامه نویس داره .
چیزی که اینجا عیان هست نا آشنایی شما با مباحث Synchronization تردها و نحوه رفتار ویندوز با تردها و ... هست ، اینکه برنامه شما درست کار نمیکنه دلیلش باگ ویندوز یا خنگ بودن ویندوز نیست ( یا یکی از تاپیک های قدیمی تر افتادم :))) ) مباحثی مثل تردها جز مباحث سنگین و پیچیده ای هستند ، نه فقط در ویندوز بلکه تو هر سیستم عامل دیگه ، کلاس TThread دلفی یا اون کامپوننتی که ازش استفاده کردید همچین آش دهن سوزی نیستن که توقع معجزه ازشون داشته باشید ، شما میتونید Omani Thread رو دانلود کنید و سمپل هاش رو بررسی کنید تا به خیلی از نکات پی ببرید .
این کامنتی که برنامه نویس اون کتابخونه اولش گذاشته :
This software is provided 'as-is', without any express or
implied warranty. In no event will the author be held liable
for any damages arising from the use of this software.
:)
هیچ وقت از کامپوننت و کتابخانه هایی که امتحان خودشون رو پس ندادن در پروژه استفاده نکنید ، وقتی از یه چیز درست و درمون استفاده کنی تکلیفتو میدونی که اون محصول بی نقص هست ( 99% ) ، ویندوز هم که باگ این مدلی نداره و خنگ نیست ( 99% ) :) ، پس در آخر میفهمی کدی که نوشتی ...
یوسف زالی
یک شنبه 10 شهریور 1392, 20:29 عصر
به نظر شما ممکنه ، ترد وابسه به اینترفیس باشه ؟
همین که Synchronize می کنید یعنی وابستگی دیگه!
Synchronize تردتون رو منتظر ترد اصلی می گذاره و همین ترده که مسئول اینترفیس هم هست.
ویندوز هم که باگ این مدلی نداره و خنگ نیست
آّره، ولی من واقعا دلیل اینکه بدون Sleep باقی ترد ها می خوابند رو نمی فهمم، ولی موافقم که خیلی مواقع عدم دانش کافی باعث می شه فکر کنیم نرم افزار یا سیستم عاملی باگ داره!
hadisalahi2
دوشنبه 11 شهریور 1392, 11:14 صبح
چیزی که اینجا عیان هست نا آشنایی شما با مباحث Synchronization تردها و نحوه رفتار ویندوز با تردها و ... هست
بله کاملا درسته
من هم برای همین سوال کردم و دنبال نتیجه هستم ، تا یک مقدار سطح معلوماتم رو در این زمینه ببرم بالا.
اینکه برنامه شما درست کار نمیکنه دلیلش باگ ویندوز یا خنگ بودن ویندوز نیست ( یا یکی از تاپیک های قدیمی تر افتادم :))) )
این فقط یک مزاح بود ، کسی که یک مقدار برنامه نویسی کرده باشه ، این موضوع رو درک میکنه ، که سیستم عامل ها خیلی مسائل پیچیده ای رو بررسی میکنند و همیشه سیستم عامل نامبر وان و 100% وجود نداره.
مباحثی مثل تردها جز مباحث سنگین و پیچیده ای هستند ، نه فقط در ویندوز بلکه تو هر سیستم عامل دیگه ، کلاس TThread دلفی یا اون کامپوننتی که ازش استفاده کردید همچین آش دهن سوزی نیستن که توقع معجزه ازشون داشته باشید
من توقع معجزه ندارم ، فقط به اندازه ای که کار من رو راه بندازن ازشون توقع دارم . (که البته الان دیگه ندارم) :ناراحت:
شما میتونید Omani Thread رو دانلود کنید و سمپل هاش رو بررسی کنید تا به خیلی از نکات پی ببرید .
از کجا میشه دانلود کرد ؟ رایگانه؟
در ضمن در مورد کامپوننت های Jedi نظری ندارید؟
این کامنتی که برنامه نویس اون کتابخونه اولش گذاشته :
این رو اصلا متوجه نشده بودم.
هیچ وقت از کامپوننت و کتابخانه هایی که امتحان خودشون رو پس ندادن در پروژه استفاده نکنید ، وقتی از یه چیز درست و درمون استفاده کنی تکلیفتو میدونی که اون محصول بی نقص هست ( 99% ) ، ویندوز هم که باگ این مدلی نداره و خنگ نیست ( 99% ) :) ، پس در آخر میفهمی کدی که نوشتی ...
این نصیحت رو از این به بعد آویزه گوشم میکنم . چون خودم به وضوح تجربه کردم
hadisalahi2
دوشنبه 11 شهریور 1392, 11:17 صبح
آّره، ولی من واقعا دلیل اینکه بدون Sleep باقی ترد ها می خوابند رو نمی فهمم
من هم دقیقا همین قسمت رو درک نمیکنم
ولی موافقم که خیلی مواقع عدم دانش کافی باعث می شه فکر کنیم نرم افزار یا سیستم عاملی باگ داره!
این رو من هم موافقم
علت راه انداختن این بحث ها و دنبال نتیجه گشتن هم برای همینه که یک مقدار دانش رو بالا ببریم
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.