PDA

View Full Version : مشکل در Multithreading



unrealword
دوشنبه 23 تیر 1393, 17:28 عصر
با عرض سلام و احترام
من یه مشکلی در ترد دارم اینه که من از یه لیست
Threadlist
استفاده کردم بعد می خام برنامه رفرش بشه هر 30 ثانیه باید چک کنه اگر ترد کارش تموم شده بود دوباره تزد رو اجرا کنه راهی که به ذهنم رسید کد زیره
مشکل الان اینه وقتی تردی که داخل لیست هست رو می خام دوباره استارت کنم خطا می ده
121108




foreach (var items in Threadlist)
{
if (items.IsAlive!=true)
{

items.IsBackground = true;
items.Start();

}

}

abbas.oveissi
دوشنبه 23 تیر 1393, 17:44 عصر
وقتی ترد کارش رو کامل انجام بده،میمیره و دیگه نمیتونی از اول Start بکنیش.نمیدونم مثلا یک حلقه While بینهایت توی ترد بذار که هر بار به آخرش میشه بره توی Waiting تا تو دوباره بری ببریش توی حالت Runnable.
یا اینکه کلا ترد جدید ایجاد کن

unrealword
دوشنبه 23 تیر 1393, 18:01 عصر
ممنون از جواب سریعتون
من الان دارم اطلاعات یه سایت رو می خونم
هر یه دقیقه پست رو می خونم تعداد سایتی که می خونم چند تاست و برای هر کدوم یه ترد جدا گزاشتم
بعد ممکنه عملیاتی که رو خوندن پست هست بیشتر از 1 دقیقه باشه طول بکشه با تایمر اومدم هر یک دقیقه کل ترد ها رو بستم دوباره ترد جدید باز کردم زیاد جالب نشد
راهی نیست من توضیحات بالا شما رو راستشو بخاید متوجه نشدم دقیق

abbas.oveissi
دوشنبه 23 تیر 1393, 18:27 عصر
ممنون از جواب سریعتون
من الان دارم اطلاعات یه سایت رو می خونم
هر یه دقیقه پست رو می خونم تعداد سایتی که می خونم چند تاست و برای هر کدوم یه ترد جدا گزاشتم
بعد ممکنه عملیاتی که رو خوندن پست هست بیشتر از 1 دقیقه باشه طول بکشه با تایمر اومدم هر یک دقیقه کل ترد ها رو بستم دوباره ترد جدید باز کردم زیاد جالب نشد
راهی نیست من توضیحات بالا شما رو راستشو بخاید متوجه نشدم دقیق

من منظورم این بود که از سیگنالها برای کنترل ترد ها استفاده کن.الان این نمونه کد رو برات آماده کردم که یدونه ترد هست هر بار اجرا میشه و 3 تا MessageBox نشون میده،بعد منتظر میشه تا روی دکمه کلیک بشه و دوباره راه میافته تا 3 تا MessageBox نشون بده.
AutoResetEvent waitHandle = new AutoResetEvent(false); Thread thread;
public Form1()
{
InitializeComponent();
thread = new Thread(delegate()
{
while (true)
{
for (int i = 0; i < 3; i++)
MessageBox.Show(i.ToString()+Environment.NewLine);
waitHandle.WaitOne();
}
});
thread.Start();


}
private void button2_Click(object sender, EventArgs e)
{
waitHandle.Set();
}زمانی که به WaitOne برسه تا اون WaitHandle دوباره Set بشه منتظر میمونه.

unrealword
دوشنبه 23 تیر 1393, 19:28 عصر
ممنون این برای مولتی چطوری ست بشه
چون الان با مولتی نتونستم جواب بگیرم

abbas.oveissi
دوشنبه 23 تیر 1393, 21:31 عصر
ممنون این برای مولتی چطوری ست بشه
چون الان با مولتی نتونستم جواب بگیرم
اگر تردها محدود هست به ازای هرکدوم یدونه از این هندل ها تعریف کن دیگه.

unrealword
دوشنبه 23 تیر 1393, 21:35 عصر
foreach (var VARIABLE in chlstsites.CheckedItems)
{
string items = VARIABLE.ToString();
if (items.Contains("freshwap"))
{
Thread t = new Thread(() =>
{
while (true)
{
waitHandle = new AutoResetEvent(false);

freshwap tac = new freshwap();
tac.readlink(VARIABLE.ToString());
foreach (var item in tac.Links)
{
if (generals.FountPost(item) == true)
{
break;
}
else
{
tac.readpost(item);

}
}

waitHandle.Reset();


}
});

Threadlist.Add(t);

}
}
اینطوری تغریف کردم بعد از اینکه ترد تموم می شه خطا می ده
همین waitHandle.Reset واسه ترد تکیکه دادید زدم جواب داد

abbas.oveissi
دوشنبه 23 تیر 1393, 22:09 عصر
دوست عزیز شما اومدید توی while اون هندل رو تعریف کردید.هربار که while اجرا میشه یه هندل جدید تعریف میشه،در صورتی من خارج از ترد تعریف کردم.واسه همین برای شما خطا میده.
میتونید مثلا یک کلاس تعریف کنید که توی اون ترد و هندل رو قرار بدید بعد از اون کلاس شی بسازید و توی لیست بریزید