Russian Qt Forum

Qt => Общие вопросы => Тема начата: ilyagoo от Март 24, 2010, 22:00



Название: цикл обработки сообщений. вопрос для гуру и не только))
Отправлено: ilyagoo от Март 24, 2010, 22:00
как организован цикл обработки событий в Qt? является ли он оболочкой цикла целевой системы?


Название: Re: цикл обработки сообщений. вопрос для гуру и не только))
Отправлено: Пантер от Март 25, 2010, 11:45
QApplication::exec() не?


Название: Re: цикл обработки сообщений. вопрос для гуру и не только))
Отправлено: ilyagoo от Март 25, 2010, 23:16
да. вот только события Qt доставляются через виндовую очередь( ессно в винде)) ?
я запускаю два потока под отладчиком. thread0 шлет сигнал в thread1. вижу, что thread1 постоянно крутится в QEventDispatcherWin32::processEvents().
thread0 для отправки попадает в QMetaObject::activate(this, &staticMetaObject, 0, 0), там проверяется соединение сигнал/слот, лочится мьютекс, определяется if this connection should be sent immediately or put into the event queue, в моем случае Qt::QueuedConnection между потоками... ага, добрался до PostMessage(), я уже близок к разгадке))) осталось только найти, где вызывается слот...



Название: Re: цикл обработки сообщений. вопрос для гуру и не только))
Отправлено: ilyagoo от Март 26, 2010, 12:42
короче так:
отправитель через QMetaObject::activate() кладет событие в очередь событий Qt, генерит событие для винды WM_USER + 1 (частный случай), кладет его в очередь PeekMessage(). получатель при входе QCoreApplication::processEvents() регистрирует класс и создает окно(RegisterClass, CreateWindow ) в QEventDispatcherWin32::createInternalHwnd(), где указывает обратный вызов qt_internal_proc. Далее, крутясь в QCoreApplication::processEvents(), вычитывает из виндовой очереди PeekMessage(), как только видит WM_USER + 1 вызывает DispatchMessage, и винда дергает qt_internal_proc. В нем идет обработка очереди Qt, оттуда достается событие и вызывается QCoreApplicationPrivate::sendPostedEvents()... в итоге мы оказываемся в moc-е и вызываем слот. это если кому-то интересно)))