Russian Qt Forum
Сентябрь 30, 2024, 20:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО]QWinEventNotifier не отрабытывает в GUI приложении. Баг?  (Прочитано 8535 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Декабрь 14, 2011, 10:32 »

Доброго времени суток.

Суть такая, что Qt-шный класс для винды QWinEventNotifier перестает ловить Windows евенты,
если мышкой кликнуть по заголовку окна и "держать", или пытаться изменить размер окна (растянуть) - но не отпускать.

В этом случае его loop останавливается пока не "отпустить" заголовок окна.

Я привел тестовое приложение в котором по таймеру раз в сек некий Windows евент дескриптор HANDLE
устанавливается в сигнальное состояние. Сразу после этого должен срабатывать QWinEventNotifier
который "заточен" на отлов этого евента и евент автоматом сбрасывается, до тек пор, пока снова не сработает таймер.

В приложении в консоль, через QDebug, выводятся счетчики кол-ва установленных евентов и
кол-ва обработанных.

И если воспроизвести сей баг - то это кол-во эвентов становится разным.

Как быть? Баг или не баг?

Интересная особенность: если я не подключаю QtGui, а создаю только консольное приложение,
то обработка евентов не останавливается.

Также интересно: почему QWinEventNotifier останавливается, а QTimer нет?

Приложение в аттаче. Для его сборки необходим приватный заголовок по пути
Код:
#include <QtCore/private/qwineventnotifier_p.h>
« Последнее редактирование: Декабрь 14, 2011, 16:19 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #1 : Декабрь 14, 2011, 10:35 »

QTimer создает свой собственный поток для отсчета времени.

Кстати с этой проблемой сталкивался недавно. При переносе окна, основной поток обработки застывает.

Решение - вынести в отдельный поток.

PS не претендую на изящное решение
Записан
BRE
Гость
« Ответ #2 : Декабрь 14, 2011, 10:36 »

QTimer создает свой собственный поток для отсчета времени.
Вовсе нет.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Декабрь 14, 2011, 10:38 »

Цитата: Bepec
Решение - вынести в отдельный поток.
Хреновое решение. Не годится.   В замешательстве
Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #4 : Декабрь 14, 2011, 10:39 »

BRE, тогда объясните мне, неразумному, какого при запуске QTimer создается отдельный поток? Улыбающийся
Записан
BRE
Гость
« Ответ #5 : Декабрь 14, 2011, 10:40 »

kuzulis на сколько я помню это фича самой венды и сделать тут ничего нельзя. Грустный
Записан
BRE
Гость
« Ответ #6 : Декабрь 14, 2011, 10:41 »

BRE, тогда объясните мне, неразумному, какого при запуске QTimer создается отдельный поток? Улыбающийся
Незнаю.
У Qt исходники открытые, загляни туда и все увидишь.
« Последнее редактирование: Декабрь 14, 2011, 10:42 от BRE » Записан
Bepec
Гость
« Ответ #7 : Декабрь 14, 2011, 10:42 »

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

to BRE интересно, тем более хочется разобраться, как он работает, ибо он срабатывает при паузе в потоке Улыбающийся Ладно, сам разберусь на досуге ^^
« Последнее редактирование: Декабрь 14, 2011, 10:45 от Bepec » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #8 : Декабрь 14, 2011, 10:47 »

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

Цитировать
kuzulis на сколько я помню это фича самой венды и сделать тут ничего нельзя. Грустный
Да я тоже про это слышал. Но не верю. Почему таймер тогда работает?
Почему тогда SocketNotifier для сокетов работает (или не работает?)?

И где логическая связь между обработкой мессаг от окна типа WM_ и евентов (объектов ядра) Windows?
Оно ж не должно одно другому мешать, по идее. Значит что-то тут не то.

Мож нокиевцам написать?
« Последнее редактирование: Декабрь 14, 2011, 10:50 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
BRE
Гость
« Ответ #9 : Декабрь 14, 2011, 10:50 »

to BRE интересно, тем более хочется разобраться, как он работает, ибо он срабатывает при паузе в потоке Улыбающийся Ладно, сам разберусь на досуге ^^
Он срабатывает в цикле обработки событий, где и проверяются интервалы для всех таймеров зарегистрированных в этом потоке.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #10 : Декабрь 14, 2011, 10:51 »

Цитировать
Он срабатывает в цикле обработки событий, где и проверяются интервалы для всех таймеров зарегистрированных в этом потоке.

Да. И интересно то, что евент луп то работает! А евентов нет! Какая то фигня, товарищи! Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #11 : Декабрь 14, 2011, 10:52 »

Вот и я о том же Улыбающийся Таймер работает, но евенты не работают Улыбающийся Потому и была мысль насчет отдельного потока(причем кстати он то создается раз за разом, зараза.)
Записан
BRE
Гость
« Ответ #12 : Декабрь 14, 2011, 10:52 »

Почему тогда SocketNotifier для сокетов работает (или не работает?)?
IMHO, тоже не работает.
Ты про какие таймеры говоришь: про системные или внутренние Qt. Внутренние будут работать.
Записан
BRE
Гость
« Ответ #13 : Декабрь 14, 2011, 10:53 »

(причем кстати он то создается раз за разом, зараза.)
Создай 100 таймеров и посмотри создается ли 100 потоков (если в исходники залезть не хочешь).
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #14 : Декабрь 14, 2011, 10:59 »

Цитировать
Ты про какие таймеры говоришь: про системные или внутренние Qt. Внутренние будут работать.
Про QTimer.
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 23.