Как правильнее реализовать паузу и остановку потока в моей программке? - 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(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д