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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: цикл обработки сообщений. вопрос для гуру и не только))  (Прочитано 4432 раз)
ilyagoo
Гость
« : Март 24, 2010, 22:00 »

как организован цикл обработки событий в Qt? является ли он оболочкой цикла целевой системы?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Март 25, 2010, 11:45 »

QApplication::exec() не?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ilyagoo
Гость
« Ответ #2 : Март 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(), я уже близок к разгадке))) осталось только найти, где вызывается слот...

Записан
ilyagoo
Гость
« Ответ #3 : Март 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-е и вызываем слот. это если кому-то интересно)))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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