PDA

View Full Version : سوال: چرا پس از اتمام برنامه پروسه برنامه تموم نمیشه ؟



bita_naz
چهارشنبه 26 آبان 1389, 20:50 عصر
سلام دوستان

من یک برنامه نوشتم که یک پروسه طولانی رو با یک حلقه for اجرا میکنه . برنامه هم فقط یک فرم داره . حالا وقتی وسط اجرای پروسه فرم رو میبندم اجرای پروسه تموم نمیشه و تا آخر ادامه پیدا میکنه. در ضمن از چند نخی هم استفاده نکردم.

لطفا بفرمایید چرا این اتفاق میافته و چطور باید جلوشو گرفت ؟

ممنون:لبخندساده:

محسن شامحمدی
چهارشنبه 26 آبان 1389, 21:07 عصر
چرا این اتفاق میافته؟
بنده نمی دونم


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


Application.ExitThread();

hadi-z
چهارشنبه 26 آبان 1389, 21:52 عصر
لطفا بفرمایید چرا این اتفاق میافته و چطور باید جلوشو گرفت ؟

ممنون:لبخندساده:

من فکر میکنم بهترین کار اینه که برنامتونو trace کنید تا اشکال کارو پیدا کنید

محسن شامحمدی
چهارشنبه 26 آبان 1389, 22:09 عصر
من فکر میکنم بهترین کار اینه که برنامتونو trace کنید تا اشکال کارو پیدا کنید
خیر اینطور نیست.!
خانم bita_naz (http://barnamenevis.org/forum/member.php?u=36205) درست می گن.
اصلا خودتون می تونید امتحان کنید.
این کد رو روی یک دکمه بنویسین.برنامتون رو ببندید.خواهید دید که برنامه از توی رم خارج نمی شه


for (int i = 0; i < 111111111; i++)
{

this.Text = "09111111111";
Application.DoEvents();
}

bita_naz
چهارشنبه 26 آبان 1389, 23:19 عصر
می تونید توی رویداد FormClosed از این دستور استفاده کنید.


Application.ExitThread();[/quote]

اینم جواب نداد . مشکل همچنان باقی است:عصبانی++:

محسن شامحمدی
چهارشنبه 26 آبان 1389, 23:35 عصر
اینم جواب نداد . مشکل همچنان باقی است:عصبانی++:
متاسفم این کد توی وی بی نت مشکل رو رفع کرد فکر کردم توی سی شارپ هم بشه.
عیبی نداره این رو خودم تست کردم 100٪ جواب داد.


System.Diagnostics.Process.GetCurrentProcess().Kil l();منبع (http://stackoverflow.com/questions/612188/c-program-process-will-not-unload)

bita_naz
چهارشنبه 26 آبان 1389, 23:48 عصر
مشکل حل شد ولی بالاخره دلیلش رو نفهمیدم.
احتمالا این حالت زمانی پیش میاد که از dll ها و توابع سیستمی استفاده میکنیم.
من تو برنامه از user32.dll استفاده کرم . تو نمونه کدی که گذاشتید هم این کارو کرده

kamran00f
پنج شنبه 27 آبان 1389, 12:54 عصر
سلام دوستان

من یک برنامه نوشتم که یک پروسه طولانی رو با یک حلقه for اجرا میکنه . برنامه هم فقط یک فرم داره . حالا وقتی وسط اجرای پروسه فرم رو میبندم اجرای پروسه تموم نمیشه و تا آخر ادامه پیدا میکنه. در ضمن از چند نخی هم استفاده نکردم.

لطفا بفرمایید چرا این اتفاق میافته و چطور باید جلوشو گرفت ؟

ممنون:لبخندساده:

چون از چند نخی استفاده نکردی این اتفاق می افته. وقتی کل برنامه تو یه نخ باشه تمام اتفاقات باید به ترتیب و پشت سر هم اجرا شن و کارایی که تو صف هستن، تا انجام نشن نمیره سراغ کار بعدی. پس باید صبر کنی تا پروسه مورد نظرت انجام شه و بعد بتونی فرم رو ببندی.



خیر اینطور نیست.!
خانم bita_naz (http://barnamenevis.org/forum/member.php?u=36205) درست می گن.
اصلا خودتون می تونید امتحان کنید.
این کد رو روی یک دکمه بنویسین.برنامتون رو ببندید.خواهید دید که برنامه از توی رم خارج نمی شه


for (int i = 0; i < 111111111; i++)
{

this.Text = "09111111111";
Application.DoEvents();
}

با این کاری که تو این کد انجام شده ترتیب اجرای کد ها به هم میریزه و وقتی حلقه در حال لوپ زدن هست فرم بسته میشه. من دقیق مطمئن نیستم که چرا برنامه از رم خارج نمیشه ولی فکر میکنم اینجوری چون فرم زودتر بسته میشه برنامه به متد هایی که application رو به طور کامل میبندن نمیرسه (خودتون بهتر از من میدونین که بسته شدن یه فرم به تنهایی باعث بسته شدن کل برنامه و آزاد شده حافظه ی اشغال شده نمیشه)



متاسفم این کد توی وی بی نت مشکل رو رفع کرد فکر کردم توی سی شارپ هم بشه.
عیبی نداره این رو خودم تست کردم 100٪ جواب داد.


System.Diagnostics.Process.GetCurrentProcess().Kil l();منبع (http://stackoverflow.com/questions/612188/c-program-process-will-not-unload)

اینجوری که من حس میکنم این کار مثل این میمونه که از توی task manager برنامه رو end process کنیم که درسته جواب میده ولی راه منطقی و اصولی ای نیست.


مشکل حل شد ولی بالاخره دلیلش رو نفهمیدم.
احتمالا این حالت زمانی پیش میاد که از dll ها و توابع سیستمی استفاده میکنیم.
من تو برنامه از user32.dll استفاده کرم . تو نمونه کدی که گذاشتید هم این کارو کرده

سعی کن وقتی به یه مشکل بر می خوری یه راه حل منطقی براش پیدا کنی و دقیقا متوجه شی که اون راه چطوری داره مشکلتو حل میکنه تا به علم برنامه نویسیت اضافه شه و بعدا بتونی با خلاقیت بیشتری مشکلاتتو حل کنی. این راهی که اینجا ارائه شد به نظرم راه حل منطقی و درستی نیست. نظر من اینه که برای حل این مشکل بهتره از چند نخی استفاده کرد، ولی اگه برای انجام این کار با یک نخ اصرار داری اینجوری انجام میشه که البته سرعت برنامه رو کمی کاهش میده





bool boolCancelFlag = false;
private void btn1_Click(object sender, EventArgs e)
{
for (int i = 0; i < int.MaxValue; i++)
{
Application.DoEvents();
if (boolCancelFlag)
break;
// code hayi ke mikhay too halghe ejra shan

}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
boolCancelFlag = true;
}



فک کنم کد ساده و قابل فهم باشه که داره چیکار میکنه. نیازی به توضیح نیست.

FastCode
پنج شنبه 27 آبان 1389, 13:25 عصر
اولاً که این تگها همه اشتباهه.اصلاً مشکل این نیست.
چرا برنامه رو اینطوری میترکونید؟
فقط کافیه که یک شرط برای خروج از حلقه بنویسید و توی OnClosing فرمتون شرط رو معکوس کنید تا از حلقه خارج بشه.

میتونید از manualresetevent یا یک متغیر بولین همراه با non-blocking lock استفاده کنید.
بستگی به شرایط کدتون.(اگر کد را بگزارید اینجا نه کسی به شما میخندد نه کسی کپی میکند.لطفاً عین کد را بگزارید.)