Russian Qt Forum

Qt => Общие вопросы => Тема начата: kuzulis от Декабрь 14, 2011, 10:32



Название: [РЕШЕНО]QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: kuzulis от Декабрь 14, 2011, 10:32
Доброго времени суток.

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

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

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

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

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

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

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

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

Приложение в аттаче. Для его сборки необходим приватный заголовок по пути
Код:
#include <QtCore/private/qwineventnotifier_p.h>


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: Bepec от Декабрь 14, 2011, 10:35
QTimer создает свой собственный поток для отсчета времени.

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

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

PS не претендую на изящное решение


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: BRE от Декабрь 14, 2011, 10:36
QTimer создает свой собственный поток для отсчета времени.
Вовсе нет.


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: kuzulis от Декабрь 14, 2011, 10:38
Цитата: Bepec
Решение - вынести в отдельный поток.
Хреновое решение. Не годится.   :-\


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: Bepec от Декабрь 14, 2011, 10:39
BRE, тогда объясните мне, неразумному, какого при запуске QTimer создается отдельный поток? :)


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: BRE от Декабрь 14, 2011, 10:40
kuzulis на сколько я помню это фича самой венды и сделать тут ничего нельзя. :(


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: BRE от Декабрь 14, 2011, 10:41
BRE, тогда объясните мне, неразумному, какого при запуске QTimer создается отдельный поток? :)
Незнаю.
У Qt исходники открытые, загляни туда и все увидишь.


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: Bepec от Декабрь 14, 2011, 10:42
К сожалению хреновенькое решение является одним из множества костылей, которыми можно обойти эту проблему.

to BRE интересно, тем более хочется разобраться, как он работает, ибо он срабатывает при паузе в потоке :) Ладно, сам разберусь на досуге ^^


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: kuzulis от Декабрь 14, 2011, 10:47
Цитировать
К сожалению хреновенькое решение является одним из множества костылей, которыми можно обойти эту проблему.
Не катит. Ну никак.

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

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

Мож нокиевцам написать?


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: BRE от Декабрь 14, 2011, 10:50
to BRE интересно, тем более хочется разобраться, как он работает, ибо он срабатывает при паузе в потоке :) Ладно, сам разберусь на досуге ^^
Он срабатывает в цикле обработки событий, где и проверяются интервалы для всех таймеров зарегистрированных в этом потоке.


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: kuzulis от Декабрь 14, 2011, 10:51
Цитировать
Он срабатывает в цикле обработки событий, где и проверяются интервалы для всех таймеров зарегистрированных в этом потоке.

Да. И интересно то, что евент луп то работает! А евентов нет! Какая то фигня, товарищи! :)


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: Bepec от Декабрь 14, 2011, 10:52
Вот и я о том же :) Таймер работает, но евенты не работают :) Потому и была мысль насчет отдельного потока(причем кстати он то создается раз за разом, зараза.)


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: BRE от Декабрь 14, 2011, 10:52
Почему тогда SocketNotifier для сокетов работает (или не работает?)?
IMHO, тоже не работает.
Ты про какие таймеры говоришь: про системные или внутренние Qt. Внутренние будут работать.


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: BRE от Декабрь 14, 2011, 10:53
(причем кстати он то создается раз за разом, зараза.)
Создай 100 таймеров и посмотри создается ли 100 потоков (если в исходники залезть не хочешь).


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: kuzulis от Декабрь 14, 2011, 10:59
Цитировать
Ты про какие таймеры говоришь: про системные или внутренние Qt. Внутренние будут работать.
Про QTimer.


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: BRE от Декабрь 14, 2011, 11:02
Про QTimer.
Он и будет работать, ему внешние события не нужны, в отличие от нотификаторов. А венда просто перестает их передавать окну при зажатой кнопки мышки (она вся концентрируется на перетаскивании :) ).


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: kuzulis от Декабрь 14, 2011, 11:53
Ну ладно. Я нокиевцам написал про эту особенность.. Может что ответят.


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: kuzulis от Декабрь 14, 2011, 12:57
Хехе, а вот если клинкуть по любой кнопочке (свернуть, развернуть, закрыть) в заголовке окна, то останавливается и QTimer.  :-X


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: BRE от Декабрь 14, 2011, 13:01
Хехе, а вот если клинкуть по любой кнопочке (свернуть, развернуть, закрыть) в заголовке окна, то останавливается и QTimer.  :-X
Видать венда перестает и обычные события передавать в окно и Qt eventloop останавливается на вендовом PeekMessage. :) Венда-с. :)
Кстати, а на какой венде экспериментируешь, неужели в 7 остались эти кайфы?


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: Bepec от Декабрь 14, 2011, 13:01
Не убивай егоооо  :o

:)


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: kuzulis от Декабрь 14, 2011, 13:05
Цитировать
Кстати, а на какой венде экспериментируешь, неужели в 7 остались эти кайфы?
Win 7 Pro x64
Ver 6.1 (build 7601: Service Pack 1)

Со всеми обновлениями, включая сегодняшнее.


Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг?
Отправлено: kuzulis от Декабрь 14, 2011, 16:19
В общем, это "фича" винды. Нокиевцы говорят, что её никак не побороть, но они в Qt5 пытаются сделать так, чтобы
обрабатывались все события.