Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как выполнить действия перед завершением программы 
V
    Опции темы
Курсант
Дата 16.9.2015, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



Всем доброго времени суток!

У меня следующая проблема: у меня есть программа, которая считывает данные из COM-порта и выводит их в массив. У меня было две проблемы: при попытке вызвать метод Close объекта serialPort происходило зависание программы, и при попытке завершить программу происходило зависание программы. Закрытие COM-порта я вылечил, для этого при нажатии кнопки "Закрыть порт" я не вызывал метод serialPort1->Close(), а присваивал значение переменной. И уже в другом месте, когда я точно знал, что не производится обработка события DataReceived, по значению этой переменной я делаю serialPort1->Close(); Это первая часть марлезонского балета.
Вторая часть - проблемы при закрытии пользователем окна - осталась. Я не знаю, как проигнорировать щелчок пользователя на кнопке "закрыть программу" (x) в левом верхнем углу окна. И программа виснет. Кто-нибудь может подсказать, как проигнорировать нажатие кнопки (x) и закрыть программу после, когда закроется COM-порт? 

Спасибо за внимание.
PM ICQ Skype   Вверх
jsharp36
Дата 16.9.2015, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2011

Репутация: 1
Всего: 1



Игнорировать не надо. Это WinForms? У формы есть событие FormClosing и FormClosed. Первое вызывается перед закрытием (в том числе и мышкой на крестик), а второе после.

Напишите обработчик нужного события.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Курсант
Дата 16.9.2015, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



Цитата(jsharp36 @ 16.9.2015,  13:57)
Игнорировать не надо. Это WinForms? У формы есть событие FormClosing и FormClosed. Первое вызывается перед закрытием (в том числе и мышкой на крестик), а второе после.

Напишите обработчик нужного события.

Этот ответ добавлен с нового Винграда - http://vingrad.com

Спасибо за ответ!

Дело в том, что события FormClosing и FormClose я использую, но они мне не очень подходят. Точнее, наверное, нужно изменить организацию работы с COM-портом, создать отдельный поток, в котором обрабатывать приходящие данные. Но у меня сейчас используется функция-делегат. И когда я закрываю окно при открытом COM-порте, если там есть какие-то данные (т.е. если управление передано обработчику окна), то программа виснет. Сейчас у меня мысль такая: по команде "закрыть окно" закрыть порт, дождаться его закрытия, и только после этого завершить работу программы. Как-то так... Соответственно, события FormClosing и FormClose для этого не подходят.
PM ICQ Skype   Вверх
jsharp36
Дата 16.9.2015, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2011

Репутация: 1
Всего: 1



так вы в FormClosing  можете и отменить закрытие. И делать что хотите.

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

У вас похоже цикл в программе. Он захватывает гуи поток. Виндовс программа на нижнем уровне, это такой бесконечный цикл, который проверяет очередь сообщений от винды (в том числе и нажатия мышкой) и далее включает обработчик, в котором где-то ваш код начинает работать. Но по идеологии он должен работать или недолго, или отдать задание в другой поток. Потому что иначе он занимает главный поток, в котором должна происходить обработка событий и обработка больше не происходит. Это не только крестика касается, а любой реакции окна. На кнопку тыкаете,"программа не отвечает".

Поэтому делайте цикл в своем потоке, а выключайте и включайте с помощью Invoke (передавая сообщения между потоками)

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
jsharp36
Дата 16.9.2015, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2011

Репутация: 1
Всего: 1



Т.е. подведу итоги точнее. Там где у вас стоит бесконечный цикл со считыванием данных с ком-порта, поместите в отдельный метод. Его запустите в отдельном потоке. Он в этом потоке будет получать какие-то данные. Безопасно их ложить в класс (формы например), вызывая у нее из другого потока метод Invoke. Этот метод ждет гуипоток, когда у его дойдет до него очередь. Таким образом, не будет одновременного доступа к данным с разных потоков.

А когда надо закрыть, убиваете поток и делаете Close.
Должно работать. Очень давно я уже и с компортом и с винформами работал. Но идеология где-то такая.

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

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Курсант
Дата 17.9.2015, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



Спасибо! По событию FormClosing я отменяю закрытие окна и записываю значение в переменную, и по значению переменной в обработчике COM-порта я закрываю порт smile Костыльное программирование, но сейчас весь код перелопачивать не хочется, да я и не готов. Пока должно работать (завтра доберусь до девайса и проверю). Позже, когда буду переписывать софт, работу с портом реализую в отдельном потоке.


Это сообщение отредактировал(а) Курсант - 17.9.2015, 08:15
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.9604 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.