Пауза потока - 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; } }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.417 из 5