PDA

View Full Version : مشكل با Thread



reza_mostafavi63
سه شنبه 21 دی 1389, 17:40 عصر
با سلام خدمت دوستان من توي برنامه ام به يه مشكل برخوردم ، اگه ميشه راهنمايي كنيد :

شرح :





namespace ThreadProblem
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
Thread thread1 = new Thread(new ThreadStart(working));
thread1.IsBackground = true;
thread1.Start();
}
public void working()
{
Form2 f = new Form2();
f.Show();

while (true) Thread.Sleep(1000);
}
}
}




وقتي Form2 شو ميشه نميشه باش كار كرد يعني قفل ميشه اگه هم حلقه while رو ننويسم كار ترد تموم ميشه و فرم 2 بسته ميشه .
من چي كار كنم كه تا زماني كه فورم 2 برنامه بازه كار thread تموم نشه .

البته ميخوام وقتي فرم اصلي رو ميبندم همه thread ها از بين برن. پس بايد thread1.IsBackground = true باشه ..
راه حلي داريد ؟

با تشكر.:قلب:

shuriken
چهارشنبه 22 دی 1389, 09:12 صبح
یکی از آسون ترین کارهایی که میتونین انجام بدین اینه که داخل کلاس Form2 تون یه متغییر boolean از نوع استاتیک
بذارین و موقع لود شدن فرم اونو true کنین و بعد از بسته شدن اونو false کنین
و تو حلقتون این متغییر رو چک کنین.

فقط من دقیقا هدفتون از این کارو نفهمیدم اگه بگین بهتر میشه راهنماییتون کرد.
بازم اگه سوالی بود در خدمتم.

reza_mostafavi63
چهارشنبه 22 دی 1389, 14:30 عصر
اين كار كمكي نميكنه . چون بازم در اينصورت form2 قفل ميشه .


فقط من دقیقا هدفتون از این کارو نفهمیدم اگه بگین بهتر میشه راهنماییتون کرد.

من ميخوام فرم2 كه داخل ترد ساخته شده ، با بستن فرم2 از بين بره و نه با تمام شدن كار ترد .

tooraj_azizi_1035
چهارشنبه 22 دی 1389, 14:38 عصر
سلام،
شما بعد از Show کردن فرم 2 نخ را در داخل یک حلقه بی پایان برای همیشه به خواب فرو بردی و این باعث همان قفل کردن می شود که نمی دونم چرا این کار رو کردی.
باید برای رویداد FormClosed فرم 2 کدی یک EventHandler بنویسی و در اون بگی که نخ باید Abort بشه.

shuriken
چهارشنبه 22 دی 1389, 14:39 عصر
اگه میخواین کدتون رو آپ کنید تا یه نگاهی بهش بندازیم.

دقیقا منظورتون از قفل کردن چیه؟

reza_mostafavi63
چهارشنبه 22 دی 1389, 15:34 عصر
64938

اين فايل برنامه است

من ميخوام داخل ترد ، فرم 2 رو شو كنم. ولي مشكل اينه كه با تموم شدن دستورات ترد فرم از بين ميره . من ميخوام نره و براي همين يك حلقه گذاشتم.

اصلا آيا ميشه به جاي اين كه ترد ورودي نام تابع بگيره به جاش يك فرم بگيره يعني من يك "ترد فرم" داشته باشم ؟؟

tooraj_azizi_1035
چهارشنبه 22 دی 1389, 15:42 عصر
ببین بعد از اینکه Form2 رو نمایش دادی Thread رو Suspend کن و همونطور که گفتم تو رویداد FormClosed فرم 2 Thread رو Abort کن.

Reza_Yarahmadi
چهارشنبه 22 دی 1389, 15:49 عصر
بجاي Show از ShowDialog استفاده كنيد و اون حلقه While رو حذف كنيد. توي رويداد Form_Closed فرم اصلي هم از Application.ExitThread استفاده كنيد.
اصلا آيا ميشه به جاي اين كه ترد ورودي نام تابع بگيره به جاش يك فرم بگيره يعني من يك "ترد فرم" داشته باشم ؟؟ اين رو متوجه نشدم ولي فكر كنم منظورتون كد زير باشه
public void working() { Application.Run(new Form2()); }

reza_mostafavi63
چهارشنبه 22 دی 1389, 18:42 عصر
ببین بعد از اینکه Form2 رو نمایش دادی Thread رو Suspend کن و همونطور که گفتم تو رویداد FormClosed فرم 2 Thread رو Abort کن.

اون كار رو كردم ولي بعد از Suspend كردن T، فرم2 بازم قفل ميشه .

دوما چگونه ميتونم ترد رو به عنوان آرگومان به فرم2 بفرستم ؟ يعني چطوري ميتونم اشاره گر ترد رو به فرم2 بفرستم ؟(Call by Refrence)

reza_mostafavi63
چهارشنبه 22 دی 1389, 18:54 عصر
بجاي Show از ShowDialog استفاده كنيد و اون حلقه While رو حذف كنيد.


Application.Run(new Form2());

اين دو تقريبا مشابه هم عمل ميكنن .فكر كنم بتونم با ShowDialog كارمو راه بندازم . ولي با كد دوم Application.Run نميشه به اجزاي فرم2 دسترسي داشته باشم چون داخل برنامه هندلي نداره !!! يا نه ؟؟ (نام متغيير نداره)

Reza_Yarahmadi
چهارشنبه 22 دی 1389, 21:20 عصر
اين دو تقريبا مشابه هم عمل ميكنن
در ظاهر کار شبیه هستند ولی در زیر ساخت با هم تفاوت های زیادی دارند.

ولي با كد دوم Application.Run نميشه به اجزاي فرم2 دسترسي داشته باشم چون داخل برنامه هندلي نداره !!! يا نه ؟؟ (نام متغيير نداره)
نمیدونم به چه دلیل نیاز دارید با نام متغیر کار کنید ولی کد بالا رو بصورت زیر هم میشه نوشت.

Form2 f = new Form2();
Application.Run(f);