Russian Qt Forum
Ноябрь 27, 2024, 02:30
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
цикл обработки сообщений. вопрос для гуру и не только))
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: цикл обработки сообщений. вопрос для гуру и не только)) (Прочитано 4429 раз)
ilyagoo
Гость
цикл обработки сообщений. вопрос для гуру и не только))
«
:
Март 24, 2010, 22:00 »
как организован цикл обработки событий в Qt? является ли он оболочкой цикла целевой системы?
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: цикл обработки сообщений. вопрос для гуру и не только))
«
Ответ #1 :
Март 25, 2010, 11:45 »
QApplication::exec() не?
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ilyagoo
Гость
Re: цикл обработки сообщений. вопрос для гуру и не только))
«
Ответ #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
Гость
Re: цикл обработки сообщений. вопрос для гуру и не только))
«
Ответ #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
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...