172 / 118 / 57
Регистрация: 08.01.2013
Сообщений: 653
1

Запуск и остановка потока

13.10.2018, 13:47. Показов 4964. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Правильная ли реализация управления потоком была приведена в программе? Или же есть более эффективные методы чтобы реализовать управление потоком.
Также в чем отличие между 1 и 2 строкой которая ниже?
  1. C#
    1
    2
    
    th1 = new Thread(new ThreadStart(Start_Server));
    th1 = new Thread(Start_Server);
кнопка "Start" поименована как "bStart", а кнопка "Stop" поименована как "bStop". а также добавлены 2 label: первый счетчик, второй оповещение пользователя.
Код программы вложен в спойлер.
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using System.Windows.Forms;
using System.Threading;
using System.ComponentModel;
 
namespace Buttleship_Server
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Start();
        }
        Thread th1;
        int x = 0;// счетчик, чтобы отображать на label1
        int wn = 1;// знак, чтобы можно было остановить цикл в потоке
 
        private void Start()
        {
            th1 = new Thread(new ThreadStart(Start_Server));
            th1.IsBackground = true;// выполнение потока в фоне
        }
 
        private void Start_Server()
        {
            while(0<wn)
            {
                x++;
                Thread.Sleep(1000);// Приостановка действий на 1 сек
                if (!label1.InvokeRequired)// Условие, нужно чтобы можно было иметь доступ к контролу(label1) из другого потока
                {// чтобы не возникала ошибка
                    label1.Text = x.ToString(); // если бы оставили только эту строчку, после sleep
                }
                else
                {
                    label1.Invoke(new Action(() => label1.Text = x.ToString()));// доступ к контролу(label1) из другого потока
                }
            }
        }
 
        private void bStart_Click(object sender, EventArgs e)// обработчик собития клик, на кнопке "Start"
        {
            if (!th1.IsAlive)// если поток не запущен
            {
                wn = 1;// присваимваем 1, чтобы цикл мог работать в функции Start_Server
                label2.Text = "Поток работает!!!";// поток пока не запущен, можем иметь пока доступ к контролу
                th1 = new Thread(new ThreadStart(Start_Server));// повторная инициализация потока, на запуск функции Start_Server
                th1.IsBackground = true;// выполнение в фоне, функции Start_server
                th1.Start();// Запуск потока
            }
            else
            {// оповещение пользователя, что поток уже запущен, и нельзя снова его запустить, пока он не завершит работу
                if (!label2.InvokeRequired)
                {
                    label2.Text = "Поток уже работает!!!";
                }
                else
                {
                    label2.Invoke(new Action(() => label2.Text = "Поток уже работает!!!"));
                }
            }
        }
 
        private void bStop_Click(object sender, EventArgs e)// обработчик события на кнопке Stop
        {
            wn = 0;// Цикл чтоб не выполнялся
            if(th1.IsAlive)
            {// Оповещение пользователя, о том что поток завершен
                if (!label2.InvokeRequired)
                {
                    label2.Text = "Поток не работает!!!";
                }
                else
                {
                    label2.Invoke(new Action(() => label2.Text = "Поток не работает!!!"));
                }
                th1.Abort();// Вызываем завершение потока                
            }
            else
            {// оповещение пользователя, что поток уже завершен, и нельзя снова его завершить, пока он не будет запущен
                if (!label2.InvokeRequired)
                {
                    label2.Text = "Поток уже не работает!!!";
                }
                else
                {
                    label2.Invoke(new Action(() => label2.Text = "Поток уже не работает!!!"));
                }
            }
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2018, 13:47
Ответы с готовыми решениями:

Запуск и остановка потока
Всем привет! private void btnRotate_Click(object sender, EventArgs e) { Thread thread...

Остановка потока
Доброго времени суток. Есть таймер, работающий в отдельном от основного потоке(Program.Check() -...

Корректная остановка потока
есть код формы using System; using System.Collections.Generic; using System.ComponentModel;...

Остановка паралельного потока
Есть программа. Работает в 2 потока. когда первый поток нашёл нужную строку в тексте он выводит...

1
Эксперт .NET
6505 / 4082 / 1605
Регистрация: 09.05.2015
Сообщений: 9,544
13.10.2018, 15:01 2
Лучший ответ Сообщение было отмечено bloomder как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System;
using System.Threading;
using System.Windows.Forms;
 
namespace WindowsFormsApp6
{
    public partial class Form1 : Form
    {
        private bool _working;
        private int _counter;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Start();
        }
 
        private void btnStart_Click(object sender, EventArgs e)
        {
            Start();
        }
 
        private void btnStop_Click(object sender, EventArgs e)
        {
            Stop();
        }
 
        private void Start()
        {
            if (_working)
            {
                label2.Text = "Поток уже работает!";
                return;
            }
 
            Thread t = new Thread(Worker) { IsBackground = true };
 
            IProgress<int> progress = new Progress<int>((i) => label1.Text = $"Counter: {i}");
 
            _working = true;
 
            label2.Text = "Поток работает!";
 
            t.Start(progress);
        }
 
        private void Stop()
        {
            if (!_working)
            {
                label2.Text = "Поток уже не работает!";
                return;
            }
 
            _working = false;
 
            label2.Text = "Поток не работает!";
        }
 
        private void Worker(object arg)
        {
            IProgress<int> progress = (IProgress<int>)arg;
 
            while (_working)
            {
                progress.Report(_counter++);
 
                Thread.Sleep(1000);
            }
        }
    }
}
2
13.10.2018, 15:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2018, 15:01
Помогаю со студенческими работами здесь

Принудительная остановка и приостановка потока
Как принудительно остановить и приостановить поток? такой код: public void CreateThreads(int...

Остановка потока из потока
Здравствуйте. Нужна ваша помощь с такой вот задачей Class1 c1 = new Class1(); Thread thread =...

Потоки - их создание, запуск и остановка
Доброго времени суток! Начал работать с потоками, по идее разобрался как поток запускать. Теперь...

Перезапуск, запуск и остановка служб
Всем привет. Хочу реализовать перезапуск нескольких служб, использую для этого следующий код: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru