91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212
1

Запуск и отключение потоков по кнопке

17.03.2016, 12:27. Показов 8834. Ответов 62
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я пишу небольшую программу для опроса прибров по COM-порту и запихиваю все полученное в базу. Опрос каждого прибора решено вывести в отдельный поток. Для опроса создан свой класс 'СОМ'.
Подскажите как например button_1 запускать все потоки, а button_2 останавливать
вот немного кода:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.IO.Ports;
namespace WindowsFormsApplication5
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Thread a = new Thread(Potok1); // Объявление нового потока
            a.Start();                     // Выполнить Potok1 в новом потоке
            Thread b = new Thread(Potok2); // Объявление нового потока
            b.Start();                     // Выполнить Potok2 в новом потоке
 
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
            
       }
        
       public static void Potok1()
        {
                COM COM1 = new COM();  //объявление объекта класса 'COM'
                COM1.num_COM = "COM1"; //применение полю 'num_COM' значения 'COM1'
                COM1.ID = 0x31;        //Применение полю ID значения "1"
                COM1.Inic_COM();       //Инициализация COM порта
                while (true)
                {
                    COM1.Opros();      //Запуска метода 'Opros'
                    Thread.Sleep(100); //Задержка 0.1сек
                }
        }
 
       public static void Potok2()
        {
            COM COM2 = new COM();  //объявление объекта класса 'COM'
            COM2.num_COM = "COM2"; //применение полю 'num_COM' значения 'COM1'
            COM2.ID = 0x32;        //Применение полю ID значения "1"
            COM2.Inic_COM();       //Инициализация COM порта
            while (true)
            {
                COM2.Opros();      //Запуска метода 'Opros'
                Thread.Sleep(100); //Задержка 0.1сек
            }
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2016, 12:27
Ответы с готовыми решениями:

Запуск потоков
На Qt не смотрите, ошибка в _beginthreadex namespace Ui { class MainWindow; } class...

Запуск скрипта по кнопке
есть страница index.php в ней скрипт &lt;iframe src='p_h.php' width='990px' height='990px'&gt; как...

Запуск времени по кнопке
Добрый день, помогите разобраться, пожалуйста. Нужно в поле ввода вывести время, с компьютера,...

Запуск программы по кнопке
Ребят, подскажите- как мне сделать запуск моей программы по кнопке, к примеру по Enter или Shift....

62
112 / 99 / 68
Регистрация: 21.04.2014
Сообщений: 1,403
17.03.2016, 12:50 2
malkot, Вот тут очень подробно объясняется как работать с потоками, в том числе и как его останавливать: https://www.youtube.com/watch?v=D9qcKV4j75U
0
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
17.03.2016, 14:43 3
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
   void ReadData(string portName, int id)
        {
            // здесь бы я проверку вставил, имется ли порт в системе
            bool comOK = false;
            string[] comArray = new string[System.IO.Ports.SerialPort.GetPortNames().Length];
            comArray = System.IO.Ports.SerialPort.GetPortNames();
 
            foreach (var it in comArray)
            {
                if (it == portName)
                    comOK = true;
            }
 
            if (!comOK)
                return;
 
            // дальше ваш код (думаю что нужно проверять занятость порты)
            COM com = new COM();                
            com.num_COM = portName; 
            com.ID = id;            
            com.Inic_COM();         
            while (true)
            {
                com.Opros();        
                Sleep(100);         
            }
        }
 
        Thread OneTh = new Thread(delegate() { ReadData("com1", 1); });
        Thread TwoTh = new Thread(delegate() { ReadData("com2", 2); });
 
 
        /// вот так запускаем
        OneTh.IsBackground = true;
        OneTh.Start(ps);
 
        TwoTh.IsBackground = true;
        TwoTh.Start(ps);
 
        // вот так убить поток 
        OneTh.Abort();
        TwoTh.Abort();
Добавлено через 13 минут
Ошибки в 35 и 38 строках (только увидел) TwoTh.Start(); OneTh.Start();
1
91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212
17.03.2016, 18:08  [ТС] 4
Ой спасибо за подсказки. Буду учиться кодить правильно, а не говнокодить)))
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,664
Записей в блоге: 14
17.03.2016, 18:31 5
malkot, Литература по C# для начинающих и не только
Шилдт, главы 23 и 24. Там учитесь, а не здесь. Ибо здесь нет правильного варианта.
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
17.03.2016, 18:49 6
Цитата Сообщение от Sanya_sa Посмотреть сообщение
// вот так убить поток
C#
1
2
OneTh.Abort();
TwoTh.Abort();
Жестоко. Да вы маньяк.
0
91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212
20.03.2016, 10:32  [ТС] 7
А если портов допустим будет 8, можно ли сделать массив потоков и потом в цикле их запустить и в каждый поток передать свои данные, например - имя порта в виде "COM1","COM2"... и номер прибора "1","2"....
количество портов и их имена читаются из текстового файла
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,664
Записей в блоге: 14
20.03.2016, 10:43 8
Реальный пример :
Надо найти, к какому из com портов подключён прибор.
Запускаю через PLINQ опрос каждого порта в отдельном потоке, собираю ответы. Тот из портов, на котором найден правильный (ожидаемый) ответ и есть нужный порт.
0
91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212
20.03.2016, 11:14  [ТС] 9
Вы меня не совсем поняли похоже.
Все приборы подключены и со всеми идёт непрерывный "опрос". Вот я хочу каждый "опрос" с прибором вынести в отдельный поток т.к. при удовлетворительном ответе нужна задержка допустим 10сек.

Добавлено через 3 минуты
Как прочитать из файла всё разобрался, массив поток создал.
А вот как каждому потоку задать параметры порта не могу разобраться.

Добавлено через 22 минуты
Ещё нашёл такую тему как ParameterizedThreadStart, но она параметризирует один поток, а мне нужно каждый отдельный поток в массиве. о как
Есть ещё вариант сделать через Case, т.к. приборов точно не будет больше 10, но это вроде называется лепить горбатого))))
0
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
20.03.2016, 12:08 10
Цитата Сообщение от malkot Посмотреть сообщение
А вот как каждому потоку задать параметры порта не могу разобраться.
Не потоку а методу который будет выполнен в отдельном потоке, я же пример кода выложил в третьем посте данной темы.
строки 29 и 30.

Добавлено через 2 минуты
C#
1
Thread OneTh = new Thread(delegate() { ReadData("com1", 1); });
В потоке OneTh выполнить метод ReadData с параметрами "СОМ1" и 1.
(точнее сказать создать поток OneTh и выполнить в нем метод ReadData с параметрами "СОМ1" и 1.)
0
91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212
20.03.2016, 12:11  [ТС] 11
С этим я вроде разобрался, а если массив потоков ?
Я только разбираюсь в С# и с многопоточностью столкнулся впервые. Не ругайтесь если я чепуху пишу)
0
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
20.03.2016, 12:12 12
Цитата Сообщение от malkot Посмотреть сообщение
С этим я вроде разобрался, а если массив потоков ?
Ну пусть массив будет, а что с ним не так?
0
91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212
20.03.2016, 12:36  [ТС] 13
Вот я создаю массив потоков и запускаю их
C#
1
2
3
4
5
6
 for (int i = 0; i < 5; i++)
        {
            Thread myThread = new Thread(Count);
            myThread.Name = "Potok " + i.ToString();
            myThread.Start();
        }
Они все запускают метод "Count" если я правильно понимаю. Как мне в методе определить какой поток его выполняет и задать свои параметры?

Добавлено через 15 минут
Ой это не массив, это просто 5 потоков))) сорри

Добавлено через 3 минуты
Вот так во если:
C#
1
2
3
4
5
6
7
List<Thread> myThread = new List<Thread>(Count);
for (int i = 0; i < 5; i++)
        {
            Thread myThread = new Thread(Count);
            myThread.Add(new Thread(Count));
            myThread[i].Start();
        }
0
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
20.03.2016, 13:27 14
Цитата Сообщение от malkot Посмотреть сообщение
Как мне в методе определить какой поток его выполняет
А для чего? Ну можно в Вашем случаи по индексу потока в списке, еще по ID. Только для чего?
У Вас например 5 портов, как Вы писали ранее необходимо создать 5 потоков, чтобы данные с каждого порта обрабатывались в отдельном потоке.
Посмотрите на мой код что я привел, там я запускаю 2 потока
C#
1
2
3
4
5
6
/// вот так запускаем
        OneTh.IsBackground = true;
        OneTh.Start();
 
        TwoTh.IsBackground = true;
        TwoTh.Start();
и пусть себе тарахтят потихоньку))))

Цитата Сообщение от malkot Посмотреть сообщение
и задать свои параметры?
Никак у Вас метод Count не имеет параметров.
1
91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212
20.03.2016, 13:48  [ТС] 15
Совсем я запутался уже))))
Вот такой вопрос - Что если каждому потоку задать имя как я писал ранее
C#
1
2
3
4
5
6
for (int i = 0; i < 5; i++)
        {
            Thread myThread = new Thread(Count);
            myThread.Name = "Potok " + i.ToString();
            myThread.Start();
        }
а потом в методе его проверять и в зависимости от имени задавать параметры?

Добавлено через 2 минуты
Спасибо Вам огромное Sanya_sa, что помогаете мне. Я сам похоже всё усложняю)))

Добавлено через 18 минут
Я не хочу указывать явно порты, а хочу читать их количество и имена из текствого файла т.к. программа будет использоваться не в одном месте. А в разных местах разное количество приборов
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,664
Записей в блоге: 14
20.03.2016, 15:44 16

Не по теме:

Давайте *нокодить вместе!)


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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
 
namespace ParallelComPorts
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] ports = new string[] { "com1", "com2", "com3" };//SerialPort.GetPortNames();
 
            CancellationTokenSource tokenSource = new CancellationTokenSource();
 
            // start tasks
            IEnumerable<Task> tasks = ports
                .Select(portname =>
                    Task.Factory.StartNew(
                        (object ct) => Count((CancellationToken)ct, portname),
                        tokenSource.Token,
                        tokenSource.Token,
                        TaskCreationOptions.LongRunning,
                        TaskScheduler.Default))
                .ToArray();
 
 
            Thread.Sleep(1000);
 
            // stop tasks
            try
            {
                tokenSource.Cancel();
                Task.WaitAll(tasks.ToArray());
            }
            catch (AggregateException)
            {
            }
            catch (Exception)
            {
            }
        }
 
        private static void Count(CancellationToken token, string portname)
        {
            int counter = 0;
 
            while (true)
            {
                token.ThrowIfCancellationRequested();
 
                token.WaitHandle.WaitOne(100);
 
                Console.WriteLine("{0}: {1}", portname, counter++);
            }
        }
    }
}
1
91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212
20.03.2016, 15:51  [ТС] 17
ОГО, я тут вообще ничего не понимаю)))
попробую разобраться)
0
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
20.03.2016, 15:54 18
Так не стоит делать но зато проще не куда.
Вложения
Тип файла: rar Thread.rar (47.8 Кб, 9 просмотров)
1
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,664
Записей в блоге: 14
20.03.2016, 16:08 19
Цитата Сообщение от malkot Посмотреть сообщение
ОГО, я тут вообще ничего не понимаю)))
попробую разобраться)
Получаем список портов.
Создаём флаг отмены.
Для каждого порта запускаем отдельную задачу (не из пула потоков). В задаче выполняется функция Count.
Ждём 1000 мс. Здесь может быть любое другое условие, например закрытие программы.
Потом устанавливаем флаг отмены и ждём завершения всех задач.

В бесконечном цикле функции Count проверяется флаг отмены.
Если он установлен, выбрасывается исключение для завершения задачи.
0
91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212
20.03.2016, 16:19  [ТС] 20
Спасибо Вам, но пока это очень сложно для меня. Буду разбираться и делать попроще )
0
20.03.2016, 16:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2016, 16:19
Помогаю со студенческими работами здесь

Запуск потока по кнопке
if (e.KeyCode == Keys.W) { Socket socket = new...

Отключение и запуск скрипта по времени
Нужно исключить выходные дни из работы скрипта. Пробовал использовать конструкцию, но она работает...

Запуск потоков по таймеру
Задача следующая, нужно запускать потоки в разное время, они будут парсить определенные сайты,...

Повторный запуск потоков
Добрый день всем. Необходима ваша помощь в следующем вопросе. Есть некий гипотетический код: ...

Запуск нескольких потоков
По отдельности каждый поток запускается, как мне сделать так, чтобы при нажатии кнопки 1 у меня...

Запуск потоков из цикла
Добрый день. Пытаюсь реализовать много поточное движение неких объектов. В классе объекта: ...


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

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

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