Кстати, нашел неприятный момент с QWinEventNotifier под Windows (естественно).
Суть в том, что если я кликаю в запущеном приложении по заголовку его окна и "держу" это окно,
не отпуская клавишу мышки - то QWinEventNotifier перестает обрабатывать любые события.
Я создал тестовое приложение, которое воспроизводит проблему:
это приложение по протоколу Modbus шлет запросы через последовательный порт
в симулятор ModSim32 (симулятор качается в инете, поиск рулит).
Параметры запроса: адрес ведомого устройства = 1, функция чтения = 3, читаем 3 регистра, начиная с нулевого,
собственно сам запрос: 01030000000305cb
Сначала необходимо запустить ModSim32, Настройки главного окна Modsim32:
1. Dev. ID = 1
2. Fun = 3 HOLDING REGISTERS
3. Start Addr = 1
4. Len = 10
Настройки соединения Modsim32:
Connection->Port#, где # - 1...9 (COM1-COM9) номер вашего порта на
котором будет "висеть" Modsim32,
19200 8 N 1
Для просмотра траффика запросов/ответов через ModSim32 жмакаем Display->Show Traffic/ Show Data
далее тестовое приложение.Итак, запуск тестового приложения:
1. Вводим имя порта на котором "висит" тестовое приложение.
2. Жмакаем Open
3. Жмакаем Send
И с периодом в 1 сек тестовое приложение начнет слать запросы к ModSim32.
В нашем случае наше тестовое приложение - мастер, а ModSim32 - слейв.
Порты должны быть соединены кросс кабелем, или же можно юзать виртуальные
порты типа: Eltima Virtual Serial Port
Для воспроизведения проблемы достаточно жмакнуть мышкой на заголовке тестового приложения
и тогда отладочный вывод типа "Event #" из bool Port::event(QEvent *e) тестового приложения остановится.
И если потом отпустить - то вновь заработает.
C++ (Qt)
static int event_counter = 0;
bool Port::event(QEvent *e)
{
bool ret = false;
if (e->type() == QEvent::WinEventAct) {
qDebug() << "Event " << event_counter++; //<< ВОТ ЭТООТ ВЫВОД ПЕРЕСТАЕТ РАБОТАТЬ
// И, СООТВЕТСТВЕННО, EV_RXCHAR НЕ СРАБАТЫВАЕТ
// И emit readyRead() не излучается;
if (EV_RXCHAR & m_currMask & m_setMask) {
//qDebug("Event: EV_RXCHAR\n");
emit readyRead();
ret = true;
}
if (EV_TXEMPTY & m_currMask & m_setMask) {
//qDebug("Event: EV_TXEMPTY\n");
ret = true;
}
if (!ret) {
//qDebug("Other event\n");
ret = true;
}
} else
ret = QWinEventNotifier::event(e);
::WaitCommEvent(m_hd, &m_currMask, &m_oe);
return ret;
}
Само тестовое приложение и результаты его работы в аттаче.