![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
flankerr |
![]() ![]()
Сообщение
#1
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
В главном потоке создаётся пользовательский поток. Из главного потока отсылается сигнал связанный со слотом класса потока пользователя. В контексте какого потока будет вызван слот ?
|
|
|
SABROG |
![]()
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Я думаю, что в контексте пользовательского потока, если в нем вызывается exec() в run(). Сигнал поставится в очередь и поток его обработает, когда завершит выполнение блокирующих операций.
|
|
|
flankerr |
![]()
Сообщение
#3
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
вот и я так думал а сейчас проверил и сильно обламался
![]() если вызвать QThread::currentThreadId() в главном потке и в слоте класса дочернего потка то они совпадут а вот QThread::currentThreadId() вызванный в run будет другим. connect вызывался и до вызова start и после, и до выхова exec дочернего потка и после (в главном потоке) в coonnect передавался тип Qt::QueuedConnection и оставлял по умолчанию - рзультат один - слот вызывается в контексте потока сигнала точнее сказать слот будет вызван в контексте потока в котором был создан объект содержащий слот. Сообщение отредактировал flankerr - 11.6.2009, 12:53 |
|
|
SABROG |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Кажись вспоминаю, либо connect должен делаться в run() либо объект к которому коннектишся должен создаваться в run.
|
|
|
flankerr |
![]()
Сообщение
#5
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
опытным путём пришёл к тому что объект должен создоваться в run
|
|
|
igor_bogomolov |
![]()
Сообщение
#6
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(flankerr) опытным путём пришёл к тому что объект должен создоваться в run Можно так же воспользоваться методом QObject::moveToThread-----upd----------------------------------------------------------------------------------------- Что то меня терзают смутные сомнения.
Может я уже что то подзабыл. Но мне кажется, что в таком случае слот readSocket будет вызван в главном(GUI) потоке. Для того чтобы слот вызвался в дочернем потоке, нужно в коннект добавить Qt::DirectConnection. Или в конструктор класса добавить moveToThread(this); Сообщение отредактировал igor_bogomolov - 11.6.2009, 13:39 |
|
|
SABROG |
![]()
Сообщение
#7
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
А объясните мне такую вещь. Если запустить timerEvent для объекта в главном потоке и в нем эмитить сигнал для дочернего потока, то слот этого потока выполняется в главном потоке (видимо причина в том, что сам объект QThread находится в главном потоке). Однако, если эмитить сигнал из run() для главного потока, то слот вызывается в главном потоке (что есть правильно).
Вопрос в том как отправить сигнал дочернему потоку из объекта главного потока, чтобы слот выполнялся в дочернем потоке? При этом moveToThread или создание того же QMainWindow внутри run() совершенно не выход. В первом случае вернутся из moveToThread не получится, а второй случай вообще бредовый. Сообщение отредактировал SABROG - 11.6.2009, 16:22 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#9
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 17.2.2025, 0:14 |