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