PDA

View Full Version : مشکل در متوقف کردن thread



hoax3r
دوشنبه 11 خرداد 1388, 15:30 عصر
سلام
می خوام یه دیباگر کوچیک بسازم برای اینکه در ساخت برنامه های Win32 مهارت پیدا کنم
برنامه به این صورته که یک Thread کار دیباگ کردن برنامه رو به عهده گرفته
یه دگمه هم گزاشتم که اگه زده شد برنامه از حالت دیباگ خارج بشه در واقع Thread متوقف بشه
ولی مشکلم اینجاست که Thread متوقف نمیشه اینکارو با یه متغییر عمومی انجام میدم
ولی متاسفانه نمیدونم چرا درست کار نمیکنه
اگه یه لطفی کنید یه نگاه بهش بندازین ممنون میشم

Nima_NF
دوشنبه 11 خرداد 1388, 17:50 عصر
ابتدا فکر می کردم مشکلی هست و واقعا thread بسته نمی شود، در حالی که برنامه شما به درستی کار می کند. احتمالا به خاطر چند thread اضافی که ساخته می شود فکر کردید که بسته نمی شود. وقتی شما از Open Dialog استفاده می کنید چند thread خودکار برای آن ساخته می شود و در دست ما نیست که آن ها کی از بین می روند. برای اطمینان از اینکه ببینید thread پاک می شود به جای open Dialog مستقیم مسیر اجرایی فایلی را به thread بفرستید و دیالوگ را باز نکنید.

hoax3r
دوشنبه 11 خرداد 1388, 22:07 عصر
ممنون از پاسختون خوب من به صورت مستقیم هم مسیر رو دادم اون فایل انتخابی در حالت دیباگ رفت ولی باز وقتی دگمه
Stop Debugging که خودم در دیالوگ قرار دادم میزنم از حلقه ی داخل thread خارج نمیشه
چون اگه بشه اون پروسه در حال دیباگ باید بسته بشه ولی نمیشه حتی یه در محیط ویژوال استادیو یک
بریک پوینت بعد حلقه ی داخل thread قرار میدم ولی اصلا به اون قسمت نمیرسه
نمیدونم چرا:متفکر:
شما یعنی بعد اینکه برنامه منو تست کردین و Stop Debugging رو زدین پروسه اجرا شده بسته شد، گیج شدم واقعا،
به نظرتون آیا روشی که من برای کنترل thread استفاده کردم روش مناسبی هست؟
ممنون میشم بیشتر راهنمایی کنید
با تشکر

Nima_NF
سه شنبه 12 خرداد 1388, 01:53 صبح
تابع WaitForDebugEvent تا زمانی که خطایی رخ ندهد مقدار بر نمی گرداند و در همان خط می ماند. در نمونه برنامه من فورا برنامه تمام می شد و کد حلقه هم فورا کارش تمام می شد.
اما در مورد شما پروسه چون فورا بسته نمی شود پس برنامه در خط WaitForDebugEvent منتظر می ماند تا خطایی دریافت شود. پس اصلا حلقه دور بعدی نخواهد داشت تا thread را با دستور false شما ببندد.

با اجرای کد زیر EXIT_PROCESS_DEBUG_EVENT به آن ارسال می شود و حلقه دوربعدی را انجام می دهد چون پروسه بسته می شود و چیزی برای debug نیست. در نتیجه خود Thread هم با false شدن inDebug بسته می شود:



case IDC_STOP_DBG:
ThradStart = FALSE;
TerminateProcess( pi.hProcess, 0);
break;

دقت کنید که :
- حتما باید چک کنید که pi.hProcess وجود داشته باشد بعد ببندید.
- متغیر pi را به صورت عمومی تعریف کنید تا در هر دو thread شما قابل فراخوانی و دسترسی باشد.

hoax3r
سه شنبه 12 خرداد 1388, 11:26 صبح
اصلا این نکته رو دقت نکرده بودم که پارامتر دوم اون تابع بی نهایت باشه خطا نباشه اصلا بر نمیگرده
ممنون بابت راه حل و وقتی که گزاشتین