PDA

View Full Version : سوال: Multi Threading



mj_developer
سه شنبه 12 بهمن 1389, 22:01 عصر
من یک روال به نام main دارم که یک سری پردازش توش انجام میشه. حالا می خوام در لحظه شروع برنامه دو عدد Thread ایجاد کنم که هر دو از همین روال (main) استفاده کنند. آیا قطعه کد زیر درست هست؟


private void Form1_Load(object sender, EventArgs e)
{
t = new Thread(new ThreadStart(main));
t.Start();

t = new Thread(new ThreadStart(main));
t.Start();
}

mj_developer
پنج شنبه 14 بهمن 1389, 23:05 عصر
پس چرا کسی کمک نمیکنه؟

hossin.esm
جمعه 15 بهمن 1389, 00:29 صبح
شما با یک ابجکت نخ دو تا نخ را ایجاد کردید شاید مشکل به وجود نیاید ولی دسترسی به نخ اول از بین می رود و نمی توانید نخ اول را کنترل کنید. مثلا لغو کنید.
چرا از دو نخ استفاده نمی کنید.


private void Form1_Load(object sender, EventArgs e)
{
t = new Thread(new ThreadStart(main));
t.Start();

t2 = new Thread(new ThreadStart(main));
t.Start();
}
در این صورت اگر تداخلی در استفاده از متغییر ها و ... به وجود نیاید مشکلی ندارد.

mj_developer
جمعه 15 بهمن 1389, 02:35 صبح
به کد زیر دقت کنید:


private void Form1_Load(object sender, EventArgs e)
{
t = new Thread(new ThreadStart(main));
t.Start();

Thread.Sleep(1000);

t = new Thread(new ThreadStart(main));
t.Start();
}

public void main()
{
int x, y, a, b;
double selectY;
Random rnd = new Random();

x = rnd.Next(0, lblEnvironment.Width - 20);

Thread.Sleep(100);
y = rnd.Next(0, lblEnvironment.Height - 20);

if ((x > -20) && (x < lblEnvironment.Width))
{
Thread.Sleep(100);
selectY = rnd.NextDouble();

if (selectY < 0.5)
y = -20;
else
y = lblEnvironment.Height;
}

a = rnd.Next(-5, 5);
Thread.Sleep(100);
b = rnd.Next(-5, 5);

while (a == 0) a = rnd.Next(-5, 5);
while (b == 0) b = rnd.Next(-5, 5);

Pen pen = new Pen(Color.Red, 10);
Graphics g = lblEnvironment.CreateGraphics();

while (true)
{
if (cancelThread)
{
cancelThread = false;
t.Abort();
}

g.DrawEllipse(pen, x, y, 20, 20);

Thread.Sleep(100);
g.Clear(Color.White);

if (((x < 0) && (a < 0)) || ((x == lblEnvironment.Width) && (a > 0)))
a *= -1;
x += a;

if (((y < 0) && (b < 0)) || ((y == lblEnvironment.Height) && (b > 0)))
b *= -1;
y += b;

if ((x > lblEnvironment.Width - 25) || (x < 5))
{
t = new Thread(new ThreadStart(main));
t.Start();

Thread.CurrentThread.Abort();
}

if ((y > lblEnvironment.Height - 25 && b > 0) || (y < 5 && b < 0))
{
b *= -1;
}
}
}

قضیه از این قراره که من میخوام دو عدد گوی در ابتدای برنامه در قالب Thread بوجود بیان و هر کدوم جداگانه واسه خودشون شروع به حرکت به جهت های مختلف کنن و هر وقت که هر یک از گوی ها به دیواره سمت چپ یا راست برخورد میکنه باید از بین بره و یک گوی دیگه در قالب یک Thread جدید ایحاد بشه و این روال تا آخر ادامه داشته باشه. همه چیز الآن درست هست و تنها یک مشکل مونده و اون هم اینه که انگاری هر دو گوی از یک منبع استفاده می کنن و انگاری که منابع بین دو گوی تقسیم میشه و گوی ها بصورت چشمک زن در میان. برای حل این مشکل باید چیکار کنم؟

خواهشن کمک کنید.
مرسی.