PDA

View Full Version : سوال: اجرای نخ در رویداد Tick تایمر



aminaltavista
چهارشنبه 18 مرداد 1391, 16:26 عصر
سلام
دستوراتم رو جوری نوشتم که از طریق اینترفیس تایمر متد رو صدا بزنه (مثل progress bar) .داخل دکمه تایمر رو صدا میزنه! بعد تو تایمر یه progress bar هست که اجرا میشه و یه متد دیگه فرضا show رو باز صدا میزنه . حالا تازمانی که طول بکشته progress هم همزمان با اون میره جلو. (صرفا جهت درک بیشتر پست گفتم)

حالا وقتی برنامه رو اجرا میکنم مشکلی دیده نمیشه اما زمانی که برنامم داره پورسس میکنه مثلا سیو تو دیتابیس ، سرعت سیستم به طور نسبی کاهش پیدا میکنه (البته بستگی به حجم داده هام داره)به همین خاطر میخام از thread استفاده کنم .اما وقتی که تو رویداد tick کنترل تایمر اون رو به کار میبرم برنامه ازم خطا میگیره!

چه طور باید کارش کنم! روش درستی هست!:متفکر:

Mahmoud.Afrad
چهارشنبه 18 مرداد 1391, 17:17 عصر
نیاز به تایمر نیست. از backgroundworker استفاده کن. در رویداد progress changed میتونی پروگرس بار رو آپدیت کنی.

the king
چهارشنبه 18 مرداد 1391, 23:51 عصر
رجوع شود به :

BackGround Worker (http://barnamenevis.org/showthread.php?353379)

متوقف شدن برنامه هنگام فراخوانی فرم جدید !! (http://barnamenevis.org/showthread.php?354331)

حرکت دادن یک کنترل با روشی غیر از تایمر (http://barnamenevis.org/showthread.php?354365)

قرار دادن تابعی که ورودی دارد در یک Thread (http://barnamenevis.org/showthread.php?353405)

aminaltavista
پنج شنبه 19 مرداد 1391, 10:01 صبح
نیاز به تایمر نیست. از backgroundworker استفاده کن. در رویداد progress changed میتونی پروگرس بار رو آپدیت کنی.

حالا باید دستورات ذخیره رو هم تو همین رویداد بنویسم یا در رویداد یه دکمه؟

the king
پنج شنبه 19 مرداد 1391, 15:31 عصر
حالا باید دستورات ذخیره رو هم تو همین رویداد بنویسم یا در رویداد یه دکمه؟
شما در رویداد دکمه صرفا دکمه ها رو غیر فعال می کنید و بعد BackgroundWorker رو با RunWorkerAsync اجرا می کنید، فقط همین،
هر کار دیگه ای که مربوط به خود روال ئه، مثل ذخیره شدن رو به DoWork و ProgressChanged و هر کاری که باید بعد از تموم شدن
روال انجام بشه به RunWorkerCompleted واگذار می کنید.

تا حد امکان همه کار ها رو در رخداد DoWork انجام می دهید تا در Thread مجزا انجام بشه و روال عادی فرم مختل نشه. صرفا کار هایی
رو در ProgressChanged انجام می دهید که مجبور هستید اونجا انجام بدهید، فرضا عوض شدن مقدار ProgressBar.Value
عوض کردن مقدار کنترلی که روی فرم ئه نمی تونه در Thread مجزا انجام بشه و خطا میده، به همین جهت باید در ProgressChanged
انجام بشه که Thread اصلی اجرایش می کنه.

اغلب عملیاتی که مربوط به کنترل های روی فرم میشه رو باید در ProgressChanged یا RunWorkerCompleted انجام بدهید چون در Thread فرعی
که DoWork رو اجرا می کنه دسترسی بهشون نیست. ProgressChanged و RunWorkerCompleted توسط Thread اصلی فرم اجرا می شوند و
به همین جهت به فرم و کنترل های رویش دسترسی کامل دارند.

اما تا حد امکان برای انجام عملیات هایی که نیازی به دسترسی به فرم ندارند از ProgressChanged استفاده نکنید چون شما از BackgroundWorker
استفاده می کنید که روال سریعتر بشه و فرم قفل نکنه، اگر قرار باشه بیشتر کار رو Thread اصلی انجام بده این Thread فرعی بی خودی اجرا شده و
BackgroundWorker و Thread فرعی کمکی به سریعتر شدن کار و روال فرم نمی کنه.

aminaltavista
پنج شنبه 19 مرداد 1391, 16:05 عصر
صحیح! :متفکر: راهنماییاتون خیلی به دردم خورد . ازتون ممنونم.