PDA

View Full Version : سوال: کار با thread (کمک فوری!!!)



barnamenevisjma
یک شنبه 12 دی 1389, 02:04 صبح
سلام
یه مشکلی برام پیش اومده. و متاسفانه وقت کافی ندارم که براش کتاب بخونم(کنکور ارشد هم دارم.). ممنون میشم اگه دوستان همینجا راهنماییم کنن. با تشکر

توی فرم اصلی برنامه من، با دستور کاربر، بایدیه سری کار انجام بشه.

دستور کاربر به این صورت که از یه لیست، یه آیتم رو انتخاب میکنه. ایتم ها از یه نوع (کلاس) می باشند که هر کدوم مقادیر متفاوتی (تنظیمات مختلف) دارن. و لذا نتیجه کار هر کدوم، متفاوته. کاربر باید بتونه بدون متوقف کردن آیتم فعلی یا آیتم های قبلی (که احتمالا قبلا کارشون رو شروع کردن!)، ایتم دیگه ای رو هم فعال کنه ( در کنار بقیه، این هم اضافه شه).
حالا میخوام کار هر یک از این ایتم ها، در یه thread جدا باشه. سوال من اینه که چجوری باید این thread ها رو بسازم، تا در آینده بتونم اون thread رو متوقف کنم.(مثلا کاربر ممکنه بعد از مدتی برگرده و یه ایتم رو که قبلا فعال
کرده بوده، حالا غیرفعال کنه.)


باز هم از توجهتون ممنونم.

tooraj_azizi_1035
یک شنبه 12 دی 1389, 07:35 صبح
سلام،

Worker یکی از آیتم های لیست باکس شماست:

using System;
using System.Threading;

public class Worker
{
// This method will be called when the thread is started.
public void DoWork()
{
while (!_shouldStop)
{
Console.WriteLine("worker thread: working...");
}
Console.WriteLine("worker thread: terminating gracefully.");
}
public void RequestStop()
{
_shouldStop = true;
}
// Volatile is used as hint to the compiler that this data
// member will be accessed by multiple threads.
private volatile bool _shouldStop;
}

public class WorkerThreadExample
{
static void Main()
{
// Create the thread object. This does not start the thread.
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);

// Start the worker thread.
workerThread.Start();
Console.WriteLine("main thread: Starting worker thread...");

// Loop until worker thread activates.
while (!workerThread.IsAlive);

// Put the main thread to sleep for 1 millisecond to
// allow the worker thread to do some work:
Thread.Sleep(1);

// Request that the worker thread stop itself:
workerObject.RequestStop();

// Use the Join method to block the current thread
// until the object's thread terminates.
workerThread.Join();
Console.WriteLine("main thread: Worker thread has terminated.");
}
}


More: http://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx

barnamenevisjma
یک شنبه 12 دی 1389, 14:03 عصر
:گیج::گیج:

میشه توضیح بدین این کد چیکار میکنه؟

اجازه بدید منظورم رو واضح تر بیان کنم:
به این تصویر نگاه کنید. برای هر آیتمی که انتخاب میشه، ممکنه یکی از دکمه هی start یا stop زده بشه. که در این صورت،باید کار مناسب، انجام شه. یعنی اگه Start کلیک شه، باید یه thread جدید ایجاد شه و اگه Stop کلیک شد، باید threadی که برای این آیتم شروع به کار کرده بود، متوقف شه. راستی این رو یادم رفته بود که بگم: ایتم های این لیست، ممکنه تغییر کنن(چوا از یه دیتابیس گرفته میشن.)

64438

آیتم ها همگی آبجکت های یه کلاس اند.(البته آبجکت وقتی باید ساخته شه که کاربر بخواد -یعنی Start رو کلیک کنه-) و برای شروع کارشون، یه متد دارن به اسم Run() که در کلاس تعریف شده. این کلاس یه سری propertyداره که برای هر آیتم، مقادیرش متفاوته. کار thread جدیدی که برای هر آیتم درست میشه، اینه که متد Run رو از آبجکت مورد نظر، فراخونی کنه. چجوری باید با کلیک روی Start ، برای آیتم انتخاب شده، یه آبجکت بسازم.

از اینکه لطف کردین و مطلب رو خوندین، صمیمانه سپاسگذارم. منتظر راهنماییتون هستم.

Reza_Yarahmadi
یک شنبه 12 دی 1389, 16:01 عصر
ميتونيد از ديكشنري بصورت زير استفاده كنيد(به جاي int ميتونيد نوع كلاس خودتون رو بذاريد

Dictionary<int, Thread> threads = new Dictionary<int, Thread>();
private void btnStart_Click(object sender, EventArgs e)
{
if (!threads.ContainsKey(listBox1.SelectedIndex)||thr eads
[listBox1.SelectedIndex].ThreadState == ThreadState.Aborted)
{
threads.Add(listBox1.SelectedIndex, new Thread(Run));
threads
[listBox1.SelectedIndex].Start();
}
}
void Run()
{
//Do somethings
}

private void btnStop_Click(object sender, EventArgs e)
{
if (threads
[listBox1.SelectedIndex] != null && threads
[listBox1.SelectedIndex].ThreadState == ThreadState.Running)
threads
[listBox1.SelectedIndex].Abort();
}