PDA

View Full Version : سوال: متوقف کردن یک فانکشن در حال اجرا



mosi20
سه شنبه 06 مرداد 1394, 10:22 صبح
سلام
برنامه ای دارم که ۲ کلاس در آن هست
یکی کلاس اصلی و دیگری کلاس دارای فانکشن ها
در یکی از فانکشن ها اطلاعات را از دیتایس گرفته و در حلقه عملیات انجام میدهد
foreach (DataRow list_setting in recipe.Rows)
{
//عملیات مورد نظر
}
حال قصد دارم در کلاس اصلی با یک فانکشن این عملیات متوقف شود.
لطفا راهنمایی کنید
کلاس اصلی : public partial class mainform : Form
کلاس فانکشم : public class class_tg
فانکشن در حال اجرا : public bool get_data_from_server()

esafb52
سه شنبه 06 مرداد 1394, 10:32 صبح
با سلام

این کنسل کردن در حالت اتفاق میافته مثلا زمانی که کاربر بخواهد این کار رو بکنه یا خود برنامه اگر خود برنامه هست که خیلی آسونه فقط تو اون حلقه ای که گفتی یه شرط بذار و بعد بریک
اما اگر کاربر میخواهد عملیاتی لغو بشه از بگپراندر ورکر یا تردها استفاده کنه و اون کار رو کنسل کن
موفق باشی

mosi20
سه شنبه 06 مرداد 1394, 10:47 صبح
ببخشید من چون زیاد وارد نیستم اگه مثال بزنید ممنون میشم
من یک متغیر توی کلاس اولم گذاشتم
public static int is_sending_start=0;
و در یک فانکشن هم مقدارش را تغییر دادم
mainform.is_sending_start = 1;

توی حلقه هم شرط گذاشتم
if (mainform.is_sending_start == 0)
{
return false;
}
اما کار نمیکنه
جایی از کارم اشکال داره؟ یا همین کاری کردم درسته؟

محمد رضا فاتحی
سه شنبه 06 مرداد 1394, 10:53 صبح
روش خوبیه...
یه متغیر سراسری تعریف کنید و در هنگام اجرا و قبل از حلقه مقدار 1 بهش بدید و توی حلقه چک کنید وقتی صفر بود از حلقه خارج یا return بشه...
در رویداد دکمه توقف هم مقدار اون متغیر رو صفر می کنید...
نباید مشکلی داشته باشه

mosi20
چهارشنبه 07 مرداد 1394, 17:01 عصر
مشکلش را فهمیدم اما نمیتونم حلش کنم
چون get_data_from_server در حال اجرا هست تغییر متغیر را متوجه نمیشه یه جوری مثل اینکه باید تا ته این فانکشن را انجام بده که کارش تموم شد و دو مرتبه صداش زدم متوجه میشه که متغییر تغییر کرده
یعنی در حال انجام کار متوجه نمیشه
کسی میتونه راهنمایی کنه؟

behzadkhan
چهارشنبه 07 مرداد 1394, 21:26 عصر
سلام
برنامه ای دارم که ۲ کلاس در آن هست
یکی کلاس اصلی و دیگری کلاس دارای فانکشن ها
در یکی از فانکشن ها اطلاعات را از دیتایس گرفته و در حلقه عملیات انجام میدهد
foreach (DataRow list_setting in recipe.Rows)
{
//عملیات مورد نظر
}
حال قصد دارم در کلاس اصلی با یک فانکشن این عملیات متوقف شود.
لطفا راهنمایی کنید
کلاس اصلی : public partial class mainform : Form
کلاس فانکشم : public class class_tg
فانکشن در حال اجرا : public bool get_data_from_server()

با سلام

دوست عزیز

وقتی اجرای برنامه به حلقه می رسد.

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

و

شما نمی توانید آنرا متوقف کنید.


مگر اینکه شما این حلقه را به یک Thread دیگری واگذار کنید.

حالا ما فرض می کنیم که کار حلقه یک دقیقه طول می کشد.

و

شما یک دکمه ای در فرم دارید که با زدن آن می خواهید کار حلقه خاتمه پیدا کند.

شما باید مقدار آن متغیر که شرط خروج از حلقه هست را در رویداد کلیک آن دکمه تنظیم کنید.

در اینصورت اجرای آن حلقه خاتمه می یابد.

با تشکر

mosi20
چهارشنبه 07 مرداد 1394, 22:38 عصر
چجوری بفرستمش توی یه ترد دیگه؟

از Thread thread = new Thread(() => get_data_from_server());
thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
thread.Start();
استفاده کردم
درسته؟

Mahmoud.Afrad
پنج شنبه 08 مرداد 1394, 10:31 صبح
اگر در متد حلقه داری ، خارج از متد یک متغیر bool تعریف کن. در حلقه چک کن اگر مقدار متغیر برابر true بود از حلقه خارج شو. در دکمه کنسل هم کافیه متغیر رو true کن.
البته میتونی از BackgroundWorker استفاده کنی (اگر در متد حلقه نداری). جستجو کن قبلا آموزش داده شده.