![]() |
|
|
![]()
|
|
| null56 |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
В общем меня интересует, есть ли в Qt очередь "отложенных" сообщений?
Допустим, у меня есть Object_1, который находится в дочернем потоке ... Я связал его с обработчиком во вторичной ните и послал сигнал из первичной нити.... Что получилось: если сигнал успевал связываться со слотом во вторичной ните и эта нить успевала входить в eventloop, то слот, как надо отрабатывался в дочерней ните, если нет (опробовал с sleep), то сигнал никогда так и не доходил до адресата... Вопрос: 1) Если не запущен eventloop, то посланный сигнал уничтожается? 2) Если через сигнал я посылаю адрес динамически созданного объекта emit mySignal(MyObject * pObject), то получается утечка, если сигнал где - то затерялся? Получается, чтобы сохранить сигнал, мало связать его с connect, необходимо еще успеть запустить exec() ? Для наглядности, если сложно пишу, приведу пример: Класс нити h
Класс нити cpp
класс MyClass h
класс обработчик
Собственно функция main.cpp
|
||||||||||
|
|||||||||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
По поводу exec - это я погорячился... если связываю connect, то даже незапущенный exec сохраняет очередь сигналов...
Просто в моем примере получалось так, что connect происходил после emit, что естественно уничтожало сообщения.... Это я увидел на отладочной печати |
|||
|
||||
| Elfebet |
|
||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 545 Регистрация: 15.5.2006 Где: Украина. Запорожь е. Репутация: 5 Всего: 14 |
очень запутано написал и невнятно, попытаюсь ответить
по порядку отвечу, могу ошибаться
в принципи да никак нет, сигнал уничтожить можно только через disconnect или если указатель обьекта уже невалидный
сигнал не затеряется, сигнал - он только посылает сигнал и все, а прийдет он слот или нет это уже зависит от того передается такой же параметр в слот или нет
если ты имеш ввиду
тогда сдесь для btn1 сработает click1(), для btn2 сработает click2() так как "connect" копирует указатель
exec() сдесь вообще не в тему чтоб хорошо понять как работает connect посмотри в ассистенте про "connectionType" цитирую
по умолчанию используеться Qt::AutoCompatConnection Это сообщение отредактировал(а) Elfebet - 4.2.2009, 18:14 -------------------- Программист не должен всё знать... он должен знать где можно посмотреть |
||||||||||||
|
|||||||||||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
Спасибо большое... так намного понятнее....
если сначала произошел emit, а лишь потом connect, сигнал теряется.... верно? |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Надо экспериментировать. Но мне кажется что, если сигнал обычный (не Qt::Queuedconnection) и на него нет коннекта, то он не вызывается и просто пропадает. Если все-таки это очередный сигнал и коннект произойдет до выхода в eventloop, то может сработать, это если где-то в недрах не идет проверка на существование коннекта перед добавлением в очередь. Чтобы знать наверняка, возможно надо лезть в исходники QEventLoop/QEventDispatcher/QObject'a. |
|||
|
||||
| kuzulis |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
2 null56,
посмотри вот эту темку http://www.prog.org.ru/topic_8455_30.html там попробуй в коде ab.h по очереди заккоментировать строчки: Выделить всёкод C++ 1: 2: tB->cB->moveToThread(tB); tA->cA->moveToThread(tA); и посмотри в чем разница при выводе результатов и вообще почитай эту темку с начала, там вроде то что тебе нужно! Добавлено через 2 минуты и 5 секунд блин.. как отредактировать свой пост? Добавлено через 8 минут и 7 секунд т.е. не в ab.h а в main.cpp нужно закомментировать по очереди:
|
|||
|
||||
| null56 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
Нет, обычными средствами сигнал теряется, вопрос в том, как можно проверить, есть ли конннект хоть к чему - то.... вот примерчик с одним потоком main.cpp
Сейчас посмотрю о чем писал kuzulis Это сообщение отредактировал(а) null56 - 5.2.2009, 10:36 |
||||||
|
|||||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
ну... я вообще не понял, как тот пост относится к нашей теме (... если речь идет о функции moveToThread или как сделать так, чтобы слоты отрабатывались в дочернем потоке, то я и SABROG в параллельной темке полностью разобрали этот вопрос и альтернативные пути решения этой проблемы http://forum.vingrad.ru/forum/topic-241300...qsslsocket.html и убрав moveToThread в твоем примере, понятное дело слоты будут в иметь первичный threadId.... Но здесь меня интересует другое.... Это сообщение отредактировал(а) null56 - 5.2.2009, 11:07 |
|||
|
||||
| Elfebet |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 545 Регистрация: 15.5.2006 Где: Украина. Запорожь е. Репутация: 5 Всего: 14 |
ну из твоего примера все очевидно!
как можно поймать сигнал если его непосылали? ты сначала делаеш
а потом
и ждеш результата ? нужно наоборот, соединить а потом послать сигнал. это ж очевидно
-------------------- Программист не должен всё знать... он должен знать где можно посмотреть |
||||||
|
|||||||
| kuzulis |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
упс.. чото и так не работает:
|
|||
|
||||
| Elfebet |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 545 Регистрация: 15.5.2006 Где: Украина. Запорожь е. Репутация: 5 Всего: 14 |
kuzulis, так оно и не сработает, ты ж закоментил b.emitSignal();
Народ все довольно просто и логично
-------------------- Программист не должен всё знать... он должен знать где можно посмотреть |
|||
|
||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
Elfebet, это я понимаю.... вопрос немного в другом стоит уже....
Можно ли узнать, имеет ли подсоединенные слоты, тот или иной сигнал из метаобъектной модели qt?
Это был пример для наглядности, задача изначально сводилась к другому.... если ты посмотришь первое мое сообщение, то там в коде все понятно, почему тема начата.... У меня в дочернем потоке получалось так, что объект не успевал соединиться сигналами с обработчиком в дочернем потоке до того, как приходил сигнал и он пропадал Это сообщение отредактировал(а) null56 - 5.2.2009, 11:58 |
|||
|
||||
| kuzulis |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
2 null56, я ничего не комментил..
вот в коннекте этот слот должен выполняться же:
т.е &b, SLOT(emitSignal()) !!!! Добавлено через 1 минуту и 6 секунд т.е при срабатывании таймера должен выполняться слот b::emitSignal() в котором и происходит емиттинье и вывод в консоль! |
|||
|
||||
| null56 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
void emitSignal() - ЭТО НЕ СЛОТ и в консоли тебе должны написать, что соединение не прошло!!! Добавлено через 3 минуты и 43 секунды в класс SigSlot сделай и пересобери и посмотри на результат
|
||||||
|
|||||||
| Elfebet |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 545 Регистрация: 15.5.2006 Где: Украина. Запорожь е. Репутация: 5 Всего: 14 |
все понятно, перечитал 1 пост и все дело в thread.start();
thread.start(); - запускает поток и емит сигнала происходит первее чем соединение сигнал-слот - впринципи это понятно почему. Нормальное решение - прописывать "connect" в конструкторе класса thread
так будет правильнее всего -------------------- Программист не должен всё знать... он должен знать где можно посмотреть |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |