Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Windows Forms
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2023, 23:59   #1
Morozus
Новичок
Джуниор
 
Регистрация: 20.01.2021
Сообщений: 2
По умолчанию Как остановить многопоточное приложение

Было дано задние найти корни уравнения и приложение, которое должно выводить данные из
дополнительного потока в элемент управления основного потока. Ответы выводятся мгновенно и не загораться клавиша "остановить" , а необходимо чтобы должно выводится промежуточные результаты и при помощи кнопки стоп можно остановить вычисления в любой момент (и был показан результат да же если он не окончательный)
Подскажите пожалуйста как это сделать, буду очень благодарна
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
 
namespace WindowsFormsApp66
{
    public partial class Form1 : Form
    {
        // Объявить переменные класса Form1
        private Calculator calculator; //Калькулятор для выполнения вычислений
        private Thread calculationThread; //поток для выполнения вычислений
 
        //Конструктор класса Form1
        public Form1()
        {
            InitializeComponent();
        }
        // Метод Form1_Load, вызывается при загрузке формы
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        // Метод, вызывается при нажатии кнопки "Start"
        private void buttonStart_Click(object sender, EventArgs e)
        {
            // Создать новый калькулятор и запустить его в отдельном потоке
            calculator = new Calculator(textBox1);
            calculationThread = new Thread(calculator.Calculate);
            calculationThread.Start();
        }
 
        // Метод, вызывается при нажатии кнопки "Stop"
        private void buttonStop_Click(object sender, EventArgs e)
        {
            if (calculationThread != null && calculationThread.IsAlive)
            {
                calculator?.Cancel();
            }
        }
 
        // Метод, вызывается при изменении текста в текстовом поле
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
 
        }
 
 
        // Внутренний класс Calculator, выполняющий вычисления
        public class Calculator
        {
            // Константы, используемые при вычислениях
            private const double EPSILON = 0.001;
            private const double INTERVAL_START = -1.0;
            private const double INTERVAL_END = 0.0;
 
            // Поля класса Calculator
            private readonly TextBox outputTextBox; // Элемент управления, в который выводятся результаты
            private CancellationTokenSource cancellationTokenSource;// Токен отмены, используемый для отмены вычислений
 
            // Конструктор класса Calculator
            public Calculator(TextBox outputTextBox)
            {
                this.outputTextBox = outputTextBox;
            }
 
            // Метод Calculate, выполняющий вычисления
            public void Calculate()
            {
                try
                {
                    // Инициализировать токен отмены
                    cancellationTokenSource = new CancellationTokenSource();
 
                    // Выполнить вычисления
                    double x0 = INTERVAL_START;
                    double x1 = x0 + EPSILON;
                    double fx0 = Function(x0);
                    double fx1 = Function(x1);
                    double x = x1 - fx1 * (x1 - x0) / (fx1 - fx0);
 
                    while (Math.Abs(x - x1) > EPSILON && !cancellationTokenSource.IsCancellationRequested)
                    {
                        x0 = x1;
                        x1 = x;
                        fx0 = fx1;
                        fx1 = Function(x1);
                        x = x1 - fx1 * (x1 - x0) / (fx1 - fx0);
 
                        // Вывести результаты в элемент управления на главном потоке
                        outputTextBox.Invoke(new Action(() =>
                        {
                            outputTextBox.AppendText($"x = {x:F3}\r\n");
                        }));
                    }
 
                    // Вывести сообщение о завершении вычислений
                    outputTextBox.Invoke(new Action(() =>
                    {
                        outputTextBox.AppendText("Вычисления завершены\r\n");
                    }));
                }
                catch (OperationCanceledException)
                {
                    // Вывести сообщение об отмене вычислений
                    outputTextBox.Invoke(new Action(() =>
                    {
                        outputTextBox.AppendText("Вычисления отменены\r\n");
                    }));
                }
            }
 
            public void Cancel()
            {
                // Отменить вычисления, отправив запрос на отмену
                cancellationTokenSource?.Cancel();
            }
 
            private static double Function(double x)
            {
                return 5 * x * x * x + 4 * x * x + 4 * x + 3;
            }
        }
    }
}
Изображения
Тип файла: jpg Снимок экрана (34).jpg (66.7 Кб, 2 просмотров)
Morozus вне форума Ответить с цитированием
Старый 14.04.2023, 20:34   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

например
Код:
Thread.Sleep(999);
if (cancellationTokenSource.IsCancellationRequested)
    throw new OperationCanceledException();
в конце цикла
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточное приложение devzik111 Помощь студентам 13 03.08.2017 09:07
Многопоточное приложение Usov Работа с сетью в Delphi 5 10.02.2014 17:32
многопоточное приложение Vistar Общие вопросы .NET 1 26.08.2011 16:25
многопоточное приложение favorite Общие вопросы Delphi 0 26.05.2011 19:47
Многопоточное приложение MaXoN66613 Помощь студентам 0 07.06.2010 12:36