Пауза потока - C# (238480)
Формулировка задачи:
Интересует как работает ManualResetEvent
чето копался копался,а до конца так и не понял как тормознуть поток по нажатию кнопки ,
если я правильно понял
ManualResetEvent re = new ManualResetEvent(true);
чтобы ставить потоки на паузу ,в нужных мне местах ,я прописываю re.WaitOne();
и нажав на кнопочку re.Reset(); ,чтобы потоки остановились.
ни у кого нет примерчиков или дельных советов?Заранее спасибо .
Решение задачи: «Пауза потока»
textual
Листинг программы
namespace WindowsFormsApplication7 { using System; using System.Threading; using System.Windows.Forms; public partial class Form1 : Form { ThreadsExample thEx; public Form1 () { InitializeComponent(); thEx = new ThreadsExample(10, listBox1); } private void btnStart_Click ( object sender, EventArgs e ) { if (thEx.Stopped) thEx.Start(); else thEx.Resume(); } private void btnPause_Click ( object sender, EventArgs e ) { if (!thEx.Paused) thEx.Pause(); } private void btnStop_Click ( object sender, EventArgs e ) { thEx.Stop(); } } class ThreadsExample { int count; ListBox lst; object syncObj; volatile bool pause; volatile bool stop; public ThreadsExample ( int count, ListBox list ) { this.count = count; lst = list; syncObj = new object(); stop = true; } public void Start () { if (stop) { stop = false; lst.Items.Clear(); for (int i = 0; i < count; ++i) { new Thread(DoWork).Start(); } } } public void Stop () { if (!stop) { stop = true; lock (syncObj) { Monitor.PulseAll(syncObj); } } } public void Pause () { pause = true; } public void Resume () { if (!stop && pause) { lock (syncObj) { Monitor.PulseAll(syncObj); } } } void DoWork () { AddText("Thread start, ID #" + Thread.CurrentThread.ManagedThreadId); int sleep = new Random(DateTime.Now.Millisecond).Next(500, 1500); while (!stop) { if (pause) { AddText("Thread paused, ID #" + Thread.CurrentThread.ManagedThreadId); lock (syncObj) { Monitor.Wait(syncObj); } pause = false; if (stop) break; AddText("Thread resume, ID #" + Thread.CurrentThread.ManagedThreadId); } AddText(string.Format("Update, ID #{0} [{1}]", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToLongTimeString())); Thread.Sleep(sleep); } AddText("Thread end, ID #" + Thread.CurrentThread.ManagedThreadId); } void AddText ( string text ) { MethodInvoker mi = () => { lst.Items.Add(text); lst.SelectedIndex = lst.Items.Count - 1; }; if (lst.InvokeRequired) lst.Invoke(mi, null); else mi(); } public bool Paused { get { return pause; } } public bool Stopped { get { return stop; } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д