PDA

View Full Version : قطع thread



mtsoft
سه شنبه 25 مهر 1391, 15:39 عصر
سلام خدمت همه استاتید محترم

فرض کنید من یک thread دارم که توسط یک دکمه start میشه چه جوری میشه این thread رو با یه دکمه دیگه abort کردش

veniz2008
سه شنبه 25 مهر 1391, 15:49 عصر
سلام.
تعریف ترد :

Thread animation;
فعال کردن ترد :

animation.Start();
توقف ترد :

animation.Abort();

mtsoft
چهارشنبه 26 مهر 1391, 07:56 صبح
مرثی ولی منظور من دستوراتش نبود ببینید من ترد رو در رویداد کلیک یک دکمه تعریف کردم و می خوام با زدن یک دکمه دیگه تردم قطع بشه یعنی یه جورایی ترد من باید سراسری باشه و من با این مشکل دارم.

RED-C0DE
چهارشنبه 26 مهر 1391, 08:03 صبح
اون بخش سورستون رو اینجا بذارید

ولی شما ترد تون رو در سطح کلاس تعریف می کنید و باهاش کار می کنید، چ مشکلی با این دارین؟

mtsoft
چهارشنبه 26 مهر 1391, 08:36 صبح
private void openclose()
{
try
{
decimal c = count.Value;
for (int i = 0; i < count.Value; i++)
{
foreach (string d in drvs.CheckedItems)
{
mciSendString("open " + d + ": type CDAudio alias drive" + d, null, 0, IntPtr.Zero);
mciSendString("set drive" + d + " door open", null, 0, IntPtr.Zero);
}

foreach (string d in drvs.CheckedItems)
{
mciSendString("open " + d + ": type CDAudio alias drive" + d, null, 0, IntPtr.Zero);
mciSendString("set drive" + d + " door closed", null, 0, IntPtr.Zero);
}
}
MessageBox.Show("Finish...");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}




private void btn_start_Click(object sender, EventArgs e)
{
try
{
btn_stop.Enabled = true;
Thread tr = new Thread(openclose);
tr.Start();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}


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

حسین شهریاری
چهارشنبه 26 مهر 1391, 09:02 صبح
Thread tr = new Thread(openclose);

اگه سراسری(قبل از تمامی روال ها)تعریفش کنی چطور؟
فکر کنم حل میشه.

mtsoft
چهارشنبه 26 مهر 1391, 09:11 صبح
این رو هم امتحان کردن ولی واسه پارامترش رویداد opnenclose رو نمیشناسه متاسفانه

حسین شهریاری
چهارشنبه 26 مهر 1391, 09:23 صبح
خب بیاین اینا:

Thread tr;
سراسری تعریف کنین و new کردنشا در باتن:

tr = new Thread(openclose);

mtsoft
چهارشنبه 26 مهر 1391, 10:02 صبح
مرثی از راهنمایتون ولی بازم فایده نداشت تردم استاپ نشد اخه اگه دقت کنید شما بازم دارید یه نمونه جدید ازش می سازید که تو دکمه استارت تعریف میشه و دکمه استاپ یه نمونه جدید دیگه و اینا به هم ارتباط ندارن.بهترین راه اینه که ترد رو به صورت سراسری تعریف کنم و همون جا تو پارامترش رویدادم رو بدم اما مشکلم همینه که وقتی سراسری تعریفش می کنم دیگه رویداد من رو نمیشناسه مگه اینکه رویدادم رو به صورت استاتیک تعریف کنم که باز اونم مشکلای خودش رو داره چون به متغیر های تو رویدادم خطا میده.

mtsoft
چهارشنبه 26 مهر 1391, 10:05 صبح
وقتی رویدا رو سراسری تعریف می کنم این پیغام رو میده

An object reference is required for the non-static field, method, or property 'Optic.Form1.drvs

drvs یه چک لیست باکس هستش که تو فرمم دارم

morteza271
چهارشنبه 26 مهر 1391, 10:30 صبح
به این مثال توجه کنید :

private Thread MyThread = null;

private void button1_Click(object sender, EventArgs e)
{
if (MyThread == null)
{
MyThread = new Thread(new ThreadStart(FuncThread));
MyThread.Start();
}
}

private void FuncThread()
{
while (true)
{
MessageBox.Show("");
Thread.Sleep(2000);
}
}

private void button2_Click(object sender, EventArgs e)
{
MyThread.Abort();
MyThread = null;
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (MyThread != null)
MyThread.Abort();
}

این مثال وفتی کلید 1 رو بزنید ترد رو استارت میکنه و ترد هم هر 2 ثانیه یک پیام نشون میده!
وقتی هم که کلید 2 رو بزنید ترد رو abort میکنه!
موفق باشید

mtsoft
چهارشنبه 26 مهر 1391, 10:45 صبح
اقا یه دنیا ازتون متشکرم کاملا درست کار کرد
مرثی از راهنماییتون