0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 18
1

Как корректно завершить поток

03.07.2014, 12:16. Показов 1393. Ответов 3
Метки нет (Все метки)

Написал программу-терминал для работы с последовательным портом с учетом нашей специфики работы.
По сути программа читает порт и выводит содержимое прочитанного в ListBox.

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
// Вывод данных в ТекстБокс
        private void SetText(string text)
        {
 
            if (this.textBox1.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
              
                textBox1.AppendText(text + "\r\n");
 
            }
        }
 
        // Чтение порта
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int byteRecieved=0;
            byte[] messByte;
            
            if (serialPort1.IsOpen)
            {
                byteRecieved = serialPort1.BytesToRead;
                messByte = new byte[byteRecieved];
                serialPort1.Read(messByte, 0, byteRecieved);
                             
                string s01 = DateTime.Now.TimeOfDay.ToString();
                if (s01.Length > 10) s01 = s01.Substring(0, 10);
                InputData = s01 + ":  RX: " + BitConverter.ToString(messByte);
                
                if (byteRecieved != 0)
                {
                    SetText(InputData);
 
                }
            }
        }
Столкнулся со с следующей проблемой:


В программе есть кнопка выход в которой выполняется следущее:

C#
1
2
3
4
5
6
        // Выход из программы
        private void button5_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            Application.Exit();
        }
Дак вот если кнопку выход нажать в момент получения телеграммы по порту, то программа зависает.
Я понимаю что нужно по идее дождаться пока выполнится поток приема данных, а потом выйти, но не знаю как это сделать. Скорее всего лучше этот поток вообще каким то образом грохнуть и благополучно закрыть программу.
Подскажите , как это сделать?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2014, 12:16
Ответы с готовыми решениями:

Как завершить созданный поток?
Вопрос такой , при помощи класса Thread создается второй поток , он работает , все хорошо , но...

Как завершить поток из другой формы?
Имеется поток запущенный в Form1: Thread Worker = new Thread(Work); ...

Как завершить рабочий поток создаваемый при подключении к серверу?
Идет запуск соединения с сервером (кнопка старт) client = new SimpleTcpClient(); ...

Как из одной программы корректно завершить другую?
Добрый день! Возникла проблема: одна программа запускает другую, а когда завершает свою работу...

3
39 / 39 / 16
Регистрация: 07.08.2012
Сообщений: 187
03.07.2014, 12:21 2
Заверни в try-catch

Добавлено через 59 секунд
serialPort1_DataReceived
1
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 18
03.07.2014, 12:46  [ТС] 3
Пробовал, не помогает.
Программа зависает без возникновения всяких исключений.

Добавлено через 8 минут
Хотя нет, обманул.
Когда весь serialPort1_DataReceived завернул в try-catch, вроде помогло.

Спасибо.

Добавлено через 12 минут
Хотя осталось непонимание.
Если раньше зависание происходило без возникновения исключений, то почему помог механизм try-catch?
0
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 18
12.03.2015, 06:46  [ТС] 4
Вернулся к старой проблеме.

Завернув serialPort1_DataReceived в try-catch, помогло не полностью.
Когда по последовательному порту летят много телеграмм, и если в этот момент попытаться закрыть порт кнопкой с Form1 serialPort1.Close();, всё зависает, и после того как в диспетчере задач снимешь мою задачу, вылетает следующий ексепшен:
Миниатюры
Как корректно завершить поток  
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2015, 06:46
Помогаю со студенческими работами здесь

Как завершить поток, в котором исполняется чужой код?
имеется сторонний асинхронный метод. Как получить дескриптор потока, который запускает этот метод?...

Определить, что программа запущена и корректно её завершить.
Здравствуйте! Есть вопрос. Возможно ли как нибудь определить, что программа запущена? Например мне...

Не могу завершить поток с бесконечным циклом (Сокет сервер)
Привет, в потоках полный новичок, как впрочем и в сокетах, надо реализовать сокет сервер, так вот...

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


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

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

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