Как правильнее реализовать паузу и остановку потока в моей программке? - C#
Формулировка задачи:
Итак, писал я, писал... И под конец столкнулся с проблемой
Есть форма, с кнопками Run, Pause, Stop и настройками параметров поиска пути.
Есть класс PathFinder, который реализует сам поиск в его методе void getPath().
С самого начала параметры(старт, финиш,карта с проходимостями для каждой точки) передавались в конструкторе PathFinder. И в этом же конструкторе поиск пути запускался в отдельном потоке.
В обработчике кнопки Run создавался объект PathFinder (что, естественно, приводило к запуску getPath в отдельном потоке), что в данной ситуации на мой взгляд вполне логично.
Наконец-то добрался до кнопок Pause и Stop.(назначение, думаю, ясно из названий).
В классе PathFinder для паузы и останова поиска ввёл свойства .
А дальше возникла проблема! Ума не приложу как мне теперь управлять этими свойствами.
Ведь объект PathFinder создаётся в обработчике кнопки Run. И, не имея объекта, я не могу обращаться к свойствам PauseSearch и StopSearch в обработчиках кнопок Pause и Stop.
Что делать?
Как вариант вижу переписать весь запуск поиска, а именно параметры передавать методу getPath. Вызывать его в отдельном потоке в форме в обработчике кнопки Run.(то есть вырезать из конструктора PathFinder запуск в потоке). Сам объект pathfinder создавать в конструкторе формы, имея таким образом доступ к его свойствам из обработчиков кнопок Pause и Stop.
Решение задачи: «Как правильнее реализовать паузу и остановку потока в моей программке?»
textual
Листинг программы
using System;
using System.Threading;
using System.Windows.Forms;
namespace TempWinFormProject {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
Thread tr1 = null;
private void foo(object o) {
if (textBox1.InvokeRequired) {
MethodInvoker mi = delegate {
for (int i = 0; ; i++) {
textBox1.Text = i.ToString();
Application.DoEvents();
}
};
try {
textBox1.Invoke(mi);
} catch (ThreadInterruptedException) {
MessageBox.Show("Thread was stopped");
}
} else {
for (int i = 0; ; i++) {
textBox1.Text = i.ToString();
}
}
}
private void buttonStart_Click(object sender, EventArgs e) {
if (tr1 == null) {
tr1 = new Thread(new ParameterizedThreadStart(foo));
} else {
tr1.Interrupt();
tr1 = new Thread(new ParameterizedThreadStart(foo));
}
tr1.Start();
}
private void buttonPause_Click(object sender, EventArgs e) {
if (tr1.ThreadState == ThreadState.Running) {
tr1.Suspend();
} else if (tr1.ThreadState == ThreadState.Suspended) {
tr1.Start();
} else {
MessageBox.Show(tr1.ThreadState.ToString());
}
}
private void buttonStop_Click(object sender, EventArgs e) {
tr1.Interrupt();
}
}
}