PDA

View Full Version : چرا حواس برنامه‌ام پرت می‌شود؟



A.Farzin
جمعه 18 خرداد 1386, 01:14 صبح
با سلام

فرض کنید نمائی از کار در حال انجام برنامه (در درون یک Do ... Loop) را روی فرم از طریق یک Progressbar و یا نمایش یک درصد و یا حرکت خودکار نشانگر سطر روی گرید، به کاربر نشان داده‌ایم. در حین اجرای این قطعه کد چنانچه کاربر روی هر جائی از صفحه کلیک کند، نشانگر انجام کار (خواه نوار پیشرفت کار باشد و یا هرچیز دیگر) از حرکت می‌ایستد و به کاربر این مطلب را می‌رساند که انگار کامپیوترش هنگ کرده و باعث می‌شود تا او پشت سر هم به کلیک روی این ور و اون ور ادامه دهد.
این در حالیست که برنامه واقعا در حال اجراست و مشکلی برایش پیش نیامده و وقتی لوپ تمام شود برنامه وارد کار بعدی خود می‌شود. فقط می‌توان گفت ظاهراً حواس برنامه پرت شده است.
این مشکل در پنجره‌های خود ویندوز پیش نمی‌آید. مثلا اگر شما فایلی را کپی کنید و در همین لحظه برنامه دیگری را هم اجرا کنید نوار پیشرفت کپی بدون مشکلی به کارش ادامه می‌دهد.

به نظر شما مشکل از کجاست؟

ممنون

CodeMasterX
جمعه 18 خرداد 1386, 01:22 صبح
مشکل در ساختار کدنویسی شما است!
بله در این حالا برای برنامه شما مشکلی پیش نیومده و بعد از اتمام کار حلقه ها دوباره راه میافته، درست مقل فرم های ویندوز.ولی دوست عزیز یه جستجو کنید 100 تا تاپیک داریم تو همین بخش و کل سایت درباره "چند ریسمانی" یا MultiThreading.
جوابتون رو پیدا می کنید.

A.Farzin
جمعه 18 خرداد 1386, 01:24 صبح
از سرنخی که دادید ممنونم

CodeMasterX
جمعه 18 خرداد 1386, 02:00 صبح
خواهش می کنم.
یه چیزی رو باید اشاره کنم اونم اینکه سعی کنید در برنامه هاتون اگر قراری حلقه هایی بصورت نامتناهی اجرا بشن، برای مثال فکر کنید یه کلقه تا پایان اجرای برنامه چک میکنه که فلان فایل وجود داره یا نه، این حلقه ها رو بصورت یک سرویس ویندوز بنویسید چون اگر جزئی از بدنه اصلی برنامه باشن خیلی بار برنامه سنگین میشه.البته این مشکلات در حیطه ابزاری مثل وی بی 6 هست، دات نت خیلی بهینه شده است.

mpmsoft
شنبه 19 خرداد 1386, 09:01 صبح
دوست عزیز یه Doevents قبل از Loop بذار دیگه سیستمت هنگ نمی کنه البته سرعت حلقه تو می یاره پایین

CodeMasterX
یک شنبه 20 خرداد 1386, 01:17 صبح
دوست عزیز یه Doevents قبل از Loop بذار دیگه سیستمت هنگ نمی کنه البته سرعت حلقه تو می یاره پایین

باز هم ربطی نداره.اگر حلقه شما سنگین باشه و بسته به کاری که انجام میده باز هم نیاز به چند ریسمانی هست.

MM_Mofidi
یک شنبه 20 خرداد 1386, 14:53 عصر
باز هم ربطی نداره.اگر حلقه شما سنگین باشه و بسته به کاری که انجام میده باز هم نیاز به چند ریسمانی هست.

من لزومی به وجود چند ریسمانی برای حلقه های ولو سنگین نمیبینم. در صورت امکان توضیحات تکمیلی ارائه دهید.
ایراد بروز نشدن صفحه بواسطه عدم پاسخ APP به Windows Message است که با پاسخ به آنها مطلب حل خواهد شد. چند ریسمانی بیشتر به درد موازی کاری را میخورد برای مواردی که شما چند کار را با حیطه داده اختیاری خود وشبیه به هم میخواهید در یک پرازه مورد پردازش قرار دهید برای یک حلقه ...!!!!؟؟؟؟؟

mpmsoft
یک شنبه 20 خرداد 1386, 15:59 عصر
من فکر می کنم مثلا دو تا حلقه رو به صورت همزمان با هم در حال اجرا اگر بخواهیم قرار بدیم از چند ریسمانی استفاده می کنیم ولی دوست ما اصلا منظورش اینکه برنامه چرا هنگ می کنه زمانی که میره تو Loop

CodeMasterX
دوشنبه 21 خرداد 1386, 01:06 صبح
جواب دسوتمون که برای حلقه مشکل دارن و آقای مفیدی دقیقا چند ریسمانی هست.
درسته که شاید استفاده از چند ریسمانی برای حلقه ها خیلی حیاتی و لازم نباشه، ولی به هر حل اگر قرار هست یک حلقه به مدت زمان بی نهایت و یا مدتی طولانی به اجرا در بیاد بهتره در یک پروسه مجزا اجرا بشه تا همونجور که شما هم گفتید برنامه هنگ نکنه.در غیر اینصورت خودتون هم اشاره کردید، WindowsMessages ها درست انتقال داده نمیشن، یعنی بین انتقال هاشون وقفه زمانی می افته.