|
Модераторы: gambit, Partizan |
|
Курсант |
|
|||
Опытный Профиль Группа: Участник Сообщений: 338 Регистрация: 21.2.2009 Где: Балашиха или Воро неж Репутация: нет Всего: 4 |
Всем доброго времени суток!
У меня следующая проблема: у меня есть программа, которая считывает данные из COM-порта и выводит их в массив. У меня было две проблемы: при попытке вызвать метод Close объекта serialPort происходило зависание программы, и при попытке завершить программу происходило зависание программы. Закрытие COM-порта я вылечил, для этого при нажатии кнопки "Закрыть порт" я не вызывал метод serialPort1->Close(), а присваивал значение переменной. И уже в другом месте, когда я точно знал, что не производится обработка события DataReceived, по значению этой переменной я делаю serialPort1->Close(); Это первая часть марлезонского балета. Вторая часть - проблемы при закрытии пользователем окна - осталась. Я не знаю, как проигнорировать щелчок пользователя на кнопке "закрыть программу" (x) в левом верхнем углу окна. И программа виснет. Кто-нибудь может подсказать, как проигнорировать нажатие кнопки (x) и закрыть программу после, когда закроется COM-порт? Спасибо за внимание. |
|||
|
||||
jsharp36 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 8.10.2011 Репутация: 1 Всего: 1 |
Игнорировать не надо. Это WinForms? У формы есть событие FormClosing и FormClosed. Первое вызывается перед закрытием (в том числе и мышкой на крестик), а второе после.
Напишите обработчик нужного события. Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
Курсант |
|
|||
Опытный Профиль Группа: Участник Сообщений: 338 Регистрация: 21.2.2009 Где: Балашиха или Воро неж Репутация: нет Всего: 4 |
Спасибо за ответ! Дело в том, что события FormClosing и FormClose я использую, но они мне не очень подходят. Точнее, наверное, нужно изменить организацию работы с COM-портом, создать отдельный поток, в котором обрабатывать приходящие данные. Но у меня сейчас используется функция-делегат. И когда я закрываю окно при открытом COM-порте, если там есть какие-то данные (т.е. если управление передано обработчику окна), то программа виснет. Сейчас у меня мысль такая: по команде "закрыть окно" закрыть порт, дождаться его закрытия, и только после этого завершить работу программы. Как-то так... Соответственно, события FormClosing и FormClose для этого не подходят. |
|||
|
||||
jsharp36 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 8.10.2011 Репутация: 1 Всего: 1 |
так вы в FormClosing можете и отменить закрытие. И делать что хотите.
такую обработку надо делать в другом потоке. Программа виснет, догадываюсь почему. Не потому что не подходит нажатие крестика. А потому что нажатия не происходит. У вас похоже цикл в программе. Он захватывает гуи поток. Виндовс программа на нижнем уровне, это такой бесконечный цикл, который проверяет очередь сообщений от винды (в том числе и нажатия мышкой) и далее включает обработчик, в котором где-то ваш код начинает работать. Но по идеологии он должен работать или недолго, или отдать задание в другой поток. Потому что иначе он занимает главный поток, в котором должна происходить обработка событий и обработка больше не происходит. Это не только крестика касается, а любой реакции окна. На кнопку тыкаете,"программа не отвечает". Поэтому делайте цикл в своем потоке, а выключайте и включайте с помощью Invoke (передавая сообщения между потоками) Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
jsharp36 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 8.10.2011 Репутация: 1 Всего: 1 |
Т.е. подведу итоги точнее. Там где у вас стоит бесконечный цикл со считыванием данных с ком-порта, поместите в отдельный метод. Его запустите в отдельном потоке. Он в этом потоке будет получать какие-то данные. Безопасно их ложить в класс (формы например), вызывая у нее из другого потока метод Invoke. Этот метод ждет гуипоток, когда у его дойдет до него очередь. Таким образом, не будет одновременного доступа к данным с разных потоков.
А когда надо закрыть, убиваете поток и делаете Close. Должно работать. Очень давно я уже и с компортом и с винформами работал. Но идеология где-то такая. А сейчас у вас на обработчик закрытия формы не получиться навесить закрытие ком-порта и дождаться завершения его работы, просто потому, что главный поток занят и не обрабатывает события, и не зайдет вообще выполнять код в обработчике закрытия. Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
Курсант |
|
|||
Опытный Профиль Группа: Участник Сообщений: 338 Регистрация: 21.2.2009 Где: Балашиха или Воро неж Репутация: нет Всего: 4 |
Спасибо! По событию FormClosing я отменяю закрытие окна и записываю значение в переменную, и по значению переменной в обработчике COM-порта я закрываю порт Костыльное программирование, но сейчас весь код перелопачивать не хочется, да я и не готов. Пока должно работать (завтра доберусь до девайса и проверю). Позже, когда буду переписывать софт, работу с портом реализую в отдельном потоке.
Это сообщение отредактировал(а) Курсант - 17.9.2015, 08:15 |
|||
|
||||
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |