![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
OrSOn |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Добрый день всем! Столкнулся со следующей проблемой... Есть программа, в которой нужно использовать потоки, причем основной поток должен обмениваться сигналами с вновь созданными. Так вот проблема примерно в следующем:
Попробовал просто все подключить коннектами, в результате thread принимает мои сигналы, но сам их испускать не может. Попробовал в начале run() вписывать exec(), в результате до нужного участка кода, разумеется, поток не доходил Попробовал способ с moveToThread(), сделал примерно следующее:
При этом поток вообще не видит испускаемых мной сигналов. Подскажите, пожалуйста, что именно делаю не так и как заставить все это дело нормально взаимодействовать. |
|
|
Andrewshkovskii |
![]()
Сообщение
#2
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 351 Регистрация: 27.12.2008 Пользователь №: 467 Спасибо сказали: 18 раз(а) Репутация: ![]() ![]() ![]() |
У Саборга в блоге, что-то такого было, вроде это :
http://vingrad.ru/blogs/sabrog/2009/06/11/...d-myunhgauzena/ |
|
|
OrSOn |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Увы, это не то( Там написано, что сигналы из run() нормально обрабатываются... А у меня основной поток их ВООБЩЕ не видит...
|
|
|
BRE |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
OrSOn |
![]()
Сообщение
#5
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Ну внутри рана у меня следующее:
setSocketFlag у меня задается в слоте, который принимает сигнал от основного потока. Т.е. ран крутится, пока основной поток не передаст сигнал. Передал, попали в функцию setThreadSocketFn(). Внутри этой функции ведется некоторая обработка, после чего написано: emit endThreadSocket( PrioritySocket ); как написано выше, в основном потоке идет привязка этого сигнала к слоту... но внутрь слота я так и не попадаю, такое ощущение, что слот не испускается...
Причина редактирования: используй тэг code
|
|
|
BRE |
![]()
Сообщение
#6
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
как написано выше, в основном потоке идет привязка этого сигнала к слоту... но внутрь слота я так и не попадаю, такое ощущение, что слот не испускается... Набросал небольшой рабочий пример: Раскрывающийся текст
|
|
|
OrSOn |
![]()
Сообщение
#7
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
В том и проблема, что суть та же, но у меня не принимаются сигналы, хоть ты тресни...
|
|
|
BRE |
![]()
Сообщение
#8
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
OrSOn |
![]()
Сообщение
#9
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Да. Попробовал только что вообще просто все сделать... В своем основном потоке объявляю thread
Т.е. ТОЛЬКО запустил конструктор и вошел в ран(). Ран описан очень просто:
Так вот тот самый эмит он проходит непрерывно, но в слот socketToList( PrioritySocket ) упорно отказывается попадать. Причем если тот же сигнал испустить ВНЕ функции ран(), все отлично перехватывается... |
|
|
BRE |
![]()
Сообщение
#10
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
OrSOn |
![]()
Сообщение
#11
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Что именно подразумевается под запуском очереди сообщений?
|
|
|
BRE |
![]()
Сообщение
#12
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
OrSOn |
![]()
Сообщение
#13
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Разумеется, exec() уже выполнен, после чего я создаю потоки, привязываю сигналы... и... не получаю результата... Односторонний обмен выходит...
|
|
|
BRE |
![]()
Сообщение
#14
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Разумеется, exec() уже выполнен, после чего я создаю потоки, привязываю сигналы... и... не получаю результата... Односторонний обмен выходит... Я специально набросал небольшой пример, что бы показать что должно работать. ![]() Если у тебя не работает, то нужно смотреть твой код, так сказать, в большем объеме. Что-то ты делаешь не так. |
|
|
OrSOn |
![]()
Сообщение
#15
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
ну у меня отличия от примера только в том, что потоки создаются не в мейне, а именно, есть класс Server, а в мейне у меня описывается так:
Ну а уже в сервере создаются потоки и все остальное... |
|
|
BRE |
![]()
Сообщение
#16
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
OrSOn |
![]()
Сообщение
#17
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Да потому, что разницы никакой, пробовал и app.exec(), результата 0....
|
|
|
BRE |
![]()
Сообщение
#18
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
OrSOn |
![]()
Сообщение
#19
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Ну в данном случае я вообще без moveToThread() делаю, а когда делал с этой функцией, не смотрел, что пишет, знаю, что сигналы переставали доходить в обе стороны... В общем, ничего не понимаю, что делаю не так...
|
|
|
BRE |
![]()
Сообщение
#20
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Ну в данном случае я вообще без moveToThread() делаю, а когда делал с этой функцией, не смотрел, что пишет, знаю, что сигналы переставали доходить в обе стороны... В общем, ничего не понимаю, что делаю не так... moveToThread делать придется. А вот если ты указываешь parent для NThread, то moveToThread работать не будет и будет сообщать об этом в консоль. |
|
|
OrSOn |
![]()
Сообщение
#21
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Нет, это я уже все вычитал, поэтому когда я использую эту функцию, я в качестве parent задаю 0, функция срабатывает нормально, иначе бы в дебаге выкинуло с ошибкой... а почему придется? Ведь в примере без нее все нормально работает... Кстати, я попробовал еще упростить в своей программе, в функции мейн написал:
Thread, по-прежнему, в ране в цикле выдает сигналы... Результат тот же, в слот не попадаю, хоть ты тресни.. |
|
|
BRE |
![]()
Сообщение
#22
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
OrSOn |
![]()
Сообщение
#23
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Да, я тупанул, вижу, где в примере используется эта функция, вписал у себя, результата все еще нет...
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#24
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
OrSOn, прочитай тему: Справка по кнопкам и тэгам форума
|
|
|
OrSOn |
![]()
Сообщение
#25
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Извиняюсь за оформление и спасибо за ссылку! А по теме... Я понял, почему у меня не работало, но не понимаю, с чем это связано. Суть в том, что я имел сигнал формата
void mySignal( PrioritySocket sgn) Причем PrioritySocket - это структура из 2 полей( QTcpSocket *, int ). Так вот почему-то ее передавать из потока не хочет, хотя в поток она сигналом отлично отправлялась до введения moveToSocket. С чем это может быть связано? Забыл добавить, что если вместо PrioritySocket передавать указатель на него, все отлично передается, но все равно хотелось бы понять, почему сам объект не пересылается... |
|
|
BRE |
![]()
Сообщение
#26
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Причем PrioritySocket - это структура из 2 полей( QTcpSocket *, int ). Так вот почему-то ее передавать из потока не хочет, хотя в поток она сигналом отлично отправлялась до введения moveToSocket. С чем это может быть связано? int qRegisterMetaType ( const char * typeName ) |
|
|
OrSOn |
![]()
Сообщение
#27
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
BRE |
![]()
Сообщение
#28
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
int qRegisterMetaType ( const char * typeName ) не совсем понял, к чему это? Ведь отдельно int в сигнале передается, отдельно QTcpSocket * передается, а в структуре вместе не хотят... Типы, которые используются в сигнал-слотах, должны быть известны мета-объектной системе Qt. Сообщение отредактировал BRE - 9.12.2009, 9:56 |
|
|
OrSOn |
![]()
Сообщение
#29
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Тогда не понимаю, почему у меня из основного потока в дополнительный все отлично пересылалось. Ну да ладно, главное, что теперь знаю,к ак обойти сие дело. Спасибо большое за помощь!
|
|
|
OrSOn |
![]()
Сообщение
#30
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Поспешил я с тем, что все получилось... Снова нужна помощь... Суть в том, что да, из потока теперь сигналы отсылаются, только вот в поток сигналы перестали доходить... Я вот попробовал несколько изменить приведенный выше пример, добавив в него обратный сигнал:
Пример
Так вот в signalReceived() он не заходит... Черт, снова напутал с оформлением, извиняюсь перед модераторами! |
|
|
BRE |
![]()
Сообщение
#31
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
OrSOn |
![]()
Сообщение
#32
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Хммм но ведь если я в потоке вызову exec(), то на нем выполнение потока остановится, до полезных команд не дойдет. Если не сложно, хотелось бы увидеть простенький пример, как передавать сигналы в поток... Коненчо, туда-то сигналы можно не передавать, можно обойтись функциями, ибо доступ к потокам у меня свободный, но хочется разобраться на будущее...
|
|
|
BRE |
![]()
Сообщение
#33
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Хммм но ведь если я в потоке вызову exec(), то на нем выполнение потока остановится, до полезных команд не дойдет. Если не сложно, хотелось бы увидеть простенький пример, как передавать сигналы в поток... Коненчо, туда-то сигналы можно не передавать, можно обойтись функциями, ибо доступ к потокам у меня свободный, но хочется разобраться на будущее... Я не поклонник такого использования сигналов в потоках, проще и IMHO лучше, не держать поток в простое на каком то флажке, а запускать его в тот момент, когда нужно что-бы он что-то сделал. После завершения работы она завершиться и все. Но если очень хочется, то можно делать примерно так: Раскрывающийся текст
Если соединится со слотами job1 и job2 из другого потока, то при активации они будут выполняться в контексте потока. Т.е. нет нужды ждать в потоке изменение какого-то флага и запускать действие, QThread::exec сам будет ждать сигнала и запустит действие (нужный слот). Сообщение отредактировал BRE - 9.12.2009, 11:06 |
|
|
OrSOn |
![]()
Сообщение
#34
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Спасибо огромное! Сейчас испытаю. А запущенные и простаивающие потоки, увы, нужны мне... Потому что, во-первых, у меня стоит ограничение на количество запущенных потоков, а во-вторых, 1 событие может вызвать несколько сотен обращений к потоку, так что лучше пусть он будет уже готов и не придется создавать несколько сотен новых потоков, удаляя их через короткое время...
|
|
|
BRE |
![]()
Сообщение
#35
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Спасибо огромное! Сейчас испытаю. А запущенные и простаивающие потоки, увы, нужны мне... Потому что, во-первых, у меня стоит ограничение на количество запущенных потоков, а во-вторых, 1 событие может вызвать несколько сотен обращений к потоку, так что лучше пусть он будет уже готов и не придется создавать несколько сотен новых потоков, удаляя их через короткое время... Если задачи таковы, то конечно нужно использовать... Посмотри еще на QThreadPool. |
|
|
OrSOn |
![]()
Сообщение
#36
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
К сожалению, у меня Qt 4.3, там его еще нету, но все равно гляну, спасибо!
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#37
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
не совсем понял, к чему это? Ведь отдельно int в сигнале передается, отдельно QTcpSocket * передается, а в структуре вместе не хотят... из описания к макросу Q_DECLARE_METATYPE ( Type ):Цитата Note that if you intend to use the type in queued signal and slot connections, you also have to call qRegisterMetaType() since such connections are resolved at runtime.
|
|
|
OrSOn |
![]()
Сообщение
#38
|
Студент ![]() Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Ясно, спасибо =)
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 13.7.2025, 3:42 |