Как правильнее реализовать паузу и остановку потока в моей программке? - 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();
        }
    }
}

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


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

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

8   голосов , оценка 3.875 из 5
Похожие ответы