Название: [РЕШЕНО]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 x64Ver 6.1 (build 7601: Service Pack 1) Со всеми обновлениями, включая сегодняшнее. Название: Re: QWinEventNotifier не отрабытывает в GUI приложении. Баг? Отправлено: kuzulis от Декабрь 14, 2011, 16:19 В общем, это "фича" винды. Нокиевцы говорят, что её никак не побороть, но они в Qt5 пытаются сделать так, чтобы
обрабатывались все события. |