PDA

View Full Version : برنامه ای که با ترد نوشتم همش جواب اشتباه میده



root88
یک شنبه 10 بهمن 1389, 14:24 عصر
با سلام ، تورو خدا یکی به داد من برسه دیونه شدم،
من یه تابع دارم که توسط تردها فراخوانی میشه اما تو اجراش دچار مشکل شدم. یه ماتریس دارم که ماتریس مجاورت هست اگر گره ای با گره دیگری همسایه باشه مقدار خونه متناظر رو یک میذاره. و همین طور یک لیست به نام L هر گره شناسه خودشو به این لیست اضافه میکنه و این لیست رو به گره های همسایه اش انتقال میده و ...

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

مشکل اینجاست که مثلا گره صفر که برای دو گره همسایه اش ترد تولید کرده دیگه مجاز نیست برای انها تردی تولید کنه چون شرط!l.Contains(j) در درستور if نقض میشه اما این اتفاق می افته. یا فقط برای نودهایی که همسایه اش هستند مجازه گره تولید کنه اولین قسمت دستور if (m[NodeID, j]== 1) اما برای گره چهار که همسایه اش هم نیست گره میسازه.







public void Quering()
{
int j = 0;
l.AddLast(NodeID);
state[FrmID] = 'Q';
Console.WriteLine(Thread.CurrentThread.Name);
while (j < N && FindFrm[l.First.Value] != 'O' )//تا زمانی که همه همسایه ها را بررسی نکرده و قطعه، قطعه دیگری نیافته ادامه بده
{

if (m[NodeID, j]== 1 && ccccc && counter < Maxim && (FRMID[j] == FRMID[l.First.Value] || FRMID[j] == 100))
{
Console.WriteLine(l.First.Value+" "+j+" *** ");
Flood f = new Flood();
f.counter = counter + 1;
f.l = l;
f.NodeID = j;
//ResFrm[j] = l.First.Value;
ThreadStart str = new ThreadStart(f.Quering);
Thread t1 = new Thread(str);
t1.Start();
}

else if (m[NodeID, j]== 1 && !l.Contains(j) && FRMID[j] != FRMID[l.First.Value] && FRMID[j] != 100)
{
Console.WriteLine(Thread.CurrentThread.Name + "T");
state[l.First.Value] = 'T';
FindFrm[l.First.Value] = 'O';//فرزندان این قطعه دیگر تردی ایجاد نکنند.
l.AddLast(j);
Reserve();
prefFrag[l.First.Value] = FRMID[j];
Quering2();
}
else if (m[NodeID, j] == 1 && counter >= Maxim && counter < N)
{
Maxim++;
j--;
if (Maxim == N - 1 || size == 1)
{
Console.WriteLine("Y");
foreach (int e in l)
Console.WriteLine(e);
//Thread.CurrentThread.Abort();
}
}
int temp = ++j;
j = temp;
}
}