PDA

View Full Version : سوال: توقف ظاهر برنامه هنگام عملیات



alireza.tabesh
دوشنبه 15 مهر 1392, 13:40 عصر
سلام .
برنامه هایی که می نویسم وقتی یک عملیات مثل محاسبه یا ایمپرت کردن دیتا رو انجام میده ظاهر برنامه هنگ میکنه ولی کار انجام میشه . البته progress bar فعالیت میکنه ولی اینکه دکمه ها کار بکنن یا پنجره جابجا بشه نیست . مشکل کار کجاست؟ از چه شیوه برنامه نویسی باید استفاده کرد؟

mehrdad1991h
دوشنبه 15 مهر 1392, 13:41 عصر
سلام .
برنامه هایی که می نویسم وقتی یک عملیات مثل محاسبه یا ایمپرت کردن دیتا رو انجام میده ظاهر برنامه هنگ میکنه ولی کار انجام میشه . البته progress bar فعالیت میکنه ولی اینکه دکمه ها کار بکنن یا پنجره جابجا بشه نیست . مشکل کار کجاست؟ از چه شیوه برنامه نویسی باید استفاده کرد؟

محاسبه عملیات یا ایمپورت کردن و ... را با بک گراند ورکر انجام بدهد اوکی میشه . . .
(بک گراند ورکر یا نخ هر دو میتونی استفاده کنی)

alireza.tabesh
دوشنبه 15 مهر 1392, 17:12 عصر
نمونه برنامه ای نداری که با این ها کار کرده باشه ؟

pedram.11
دوشنبه 15 مهر 1392, 17:29 عصر
سلام این کار با ترد رو نمایش میده، که اگه متد Run رو همینطور اجرا کنی برنامت گیر میکنه، اما اگه با thread(نخ) باشه نه:
private void Form1_Load(object sender, EventArgs e)
{
new System.Threading.Thread(new System.Threading.ThreadStart(Run)).Start();
}

void Run()
{
for (int i = 0; ; i++)
{
System.Threading.Thread.Sleep(10);
SetThisText(i.ToString());
}
}
delegate void StrHandler(string str);
void SetThisText(string text)
{
if (InvokeRequired)
BeginInvoke(new StrHandler(SetThisText), new object[] { text });
else
this.Text = text;
}

mehrdad1991h
دوشنبه 15 مهر 1392, 17:35 عصر
نمونه برنامه ای نداری که با این ها کار کرده باشه ؟
راحت ترین روش برای شما استفاده از بک گراند ورکر هستش
برای این کار هم از ابزار های موجود سمت چپ بک گراند ورکر را بنداز رو فرمت
در قسمت پروپرتیز 3 تا گزینه داره
1- دو ورک (برای شروع کار)
2- پروگرس (نیازی بهش نداری برای پیشرفت کار)
3- کمپلت (وقتی کار تموم شد)

وقتی این را گذاشتی در مکانی که میخوای بک گراند شروع بشه میزنی
backgrandworker.runwork....;
اگر هم خواستی ارگومانتی بهش بفرستی
backgrandworker.runwork....(argumant);
بعدش هم که این کار را کردی میره و دو ورک شروع میشه دیگه....

توی دو ورک ارگومانت را دریافت کن
مثلا اگر ارگومانت ارسالی رسته بود اینجوری
string st_arg = (string)e.argument;

اینجوری دریافت میکنی
اینجوریه دیگه روش کلی بعد هم که دو ورک تموم شد اگر خواستی ارگومانتی به برنامه برگرده دوباره اینجوری میزنی
مثلا اگر بخوای دوباره به برنامه یه رشته برگردونی
e.result(string_result);
در قسمت ران ورک کمپلت هم این ارگومانت را دریافتش میکنی
string st_result = (string)e.result;

خوب همین ها بود دیگه
بقیه اش را خودت برو جلو کل اموزش همین بود !
قسمتی که باعث هنگ شدن میشه را در دو ورک do_work بزار و نهایتا یه ارگومانت برگردون که وقتی میره تو ران ورک کمپلت ارگومانی که برگردانده میشه را ازش استفادده کنه و بقیه کار ها را انجام بده.

نکته : در دو ورک به صورت عادی نمیتونی از کنترل های روی فرم استفاده کنی هرچی میخوای باید بریزی تو یه ارگومانت وقتی کار تموم شد و ران ورک کمپلیت شد ارگومان را برگردونی به کنترل
همین دیگه
موفق باشی

نکته (همه اینا را همینجا تایپ کردم ممکنه غلط املایی داشته باشه)

alireza.tabesh
یک شنبه 05 آبان 1392, 10:20 صبح
دست همتون درد نکنه کاملا مشکلم حل شد .