PDA

View Full Version : نحوه خروج از حلقه بینهایت و ترد



mohamad0098
سه شنبه 02 آبان 1396, 00:34 صبح
سلام
من در سی شارپ یک برنامه ویندوز فرم نوشتم که شامل حلقه بینهایت و thread هستش مشکلی که دارم اینه که وقتی رو دکمه اجرای حلقه یا thread کلیک میکنم برنامه هنگ میکنه و هیچ دکمه ای روی فرم قابل کلیک کردن نیست و خود فرم هم هنگ میکنه میخاستم بدونم آیا راه حلی هست که بدون پایین اومدن سرعت اجرای حلقه ها اشیای روی فرم و خود فرم هنگ نکنه ؟ که بتونم یه دکمه توقف حلقه روی فرم تعبیه کنم؟

danialafshari
سه شنبه 02 آبان 1396, 03:48 صبح
با سلام
این متدها رو برای Start و Stop کردن ترد قرار میدید

private static Thread thread;
public void startProgress()
{
CheckForIllegalCrossThreadCalls = false;
thread = new Thread(new ThreadStart(ShowfrmProgress));
thread.Start();
}
public void endProgress()
{
thread.Abort();
thread = null;

}

این هم به عنوان مثال از while هست:

int i = 0;
public void ShowfrmProgress()
{
while (true)
{
i = i + 1;
this.Text = i.ToString();
}
}

دکمه Start:

private void btnStart_Click(object sender, EventArgs e)
{
startProgress();
}

دکمه Stop :

private void btnStop_Click(object sender, EventArgs e)
{
endProgress();
}

با اینکار فرم هیچ هنگی نمیکنه

میتونید از BackgrounWorker هم استفاده کنید
قبلش خاصیت WorkerSupportsCancellation رو True کنید

int i = 0;
private void btnStart_Click(object sender, EventArgs e)
{
if (!backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync();
}
}

private void btnStop_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy)
{
backgroundWorker1.CancelAsync();
}
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
if (backgroundWorker1.CancellationPending)
{
e.Cancel = true;
return;
}
i = i + 1;
//this.Text = i.ToString();
}
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Complete...");
}


موفق باشید

mohamad0098
سه شنبه 02 آبان 1396, 21:41 عصر
ممنون اگه ما از ترد استفاده نکنیم و بخایم فقط یک حلقه بینهایت رو متوقف کنیم تنها راه استفاده از BackgrounWorker هستش ؟

danialafshari
چهارشنبه 03 آبان 1396, 06:50 صبح
ممنون اگه ما از ترد استفاده نکنیم و بخایم فقط یک حلقه بینهایت رو متوقف کنیم تنها راه استفاده از BackgrounWorker هستش ؟
با سلام
در حلقه بی نهایت بهتره از backgroundWorker یا Thread استفاده کنید
حلقه while (https://www.dotnetperls.com/while)
backgroundworker یک کلاس هست می تونید به صورت کد نویسی هم ازش استفاده کنید
https://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(System.ComponentModel.BackgroundWorker);k(Targ etFrameworkMoniker-.NETFramework
موفق باشید