crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> В каком контексте будет вызван слот, Работа с потоками
flankerr
  опции профиля:
сообщение 11.6.2009, 11:49
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


В главном потоке создаётся пользовательский поток. Из главного потока отсылается сигнал связанный со слотом класса потока пользователя. В контексте какого потока будет вызван слот ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 11.6.2009, 12:41
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Я думаю, что в контексте пользовательского потока, если в нем вызывается exec() в run(). Сигнал поставится в очередь и поток его обработает, когда завершит выполнение блокирующих операций.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 11.6.2009, 12:48
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


вот и я так думал а сейчас проверил и сильно обламался :(
если вызвать QThread::currentThreadId() в главном потке и в слоте класса дочернего потка то они совпадут а вот QThread::currentThreadId() вызванный в run будет другим.
connect вызывался и до вызова start и после, и до выхова exec дочернего потка и после (в главном потоке) в coonnect передавался тип Qt::QueuedConnection и оставлял по умолчанию - рзультат один - слот вызывается в контексте потока сигнала

точнее сказать слот будет вызван в контексте потока в котором был создан объект содержащий слот.

Сообщение отредактировал flankerr - 11.6.2009, 12:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 11.6.2009, 12:56
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Кажись вспоминаю, либо connect должен делаться в run() либо объект к которому коннектишся должен создаваться в run.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 11.6.2009, 13:02
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


опытным путём пришёл к тому что объект должен создоваться в run
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 11.6.2009, 13:38
Сообщение #6


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(flankerr)
опытным путём пришёл к тому что объект должен создоваться в run
Можно так же воспользоваться методом QObject::moveToThread
-----upd-----------------------------------------------------------------------------------------
Что то меня терзают смутные сомнения.

class ThreadSocket : public QThread
{
    Q_OBJECT
    QTcpSocket *socket;
public:
    ThreadSocket(QObject *parent = 0);
protected:
    void run();
private slots:
    void readSocket();
};
ThreadSocket::ThreadSocket(QObject *parent)
    : QThread(parent) {
}

void ThreadSocket::readSocket() {
    qDebug() << "read TP:" << QThread::currentThread();
    qDebug() << "read TID:" << QThread::currentThreadId();
}

void ThreadSocket::run() {
    socket = new QTcpSocket();
    connect(socket, SIGNAL(readyRead()), SLOT(readSocket()));
    exec();
}

Может я уже что то подзабыл. Но мне кажется, что в таком случае слот readSocket будет вызван в главном(GUI) потоке.
Для того чтобы слот вызвался в дочернем потоке, нужно в коннект добавить Qt::DirectConnection.
Или в конструктор класса добавить moveToThread(this);

Сообщение отредактировал igor_bogomolov - 11.6.2009, 13:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 11.6.2009, 16:19
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


А объясните мне такую вещь. Если запустить timerEvent для объекта в главном потоке и в нем эмитить сигнал для дочернего потока, то слот этого потока выполняется в главном потоке (видимо причина в том, что сам объект QThread находится в главном потоке). Однако, если эмитить сигнал из run() для главного потока, то слот вызывается в главном потоке (что есть правильно).

Вопрос в том как отправить сигнал дочернему потоку из объекта главного потока, чтобы слот выполнялся в дочернем потоке? При этом moveToThread или создание того же QMainWindow внутри run() совершенно не выход. В первом случае вернутся из moveToThread не получится, а второй случай вообще бредовый.

Сообщение отредактировал SABROG - 11.6.2009, 16:22
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.6.2009, 16:31
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(SABROG @ 11.6.2009, 20:19) *
слот этого потока
правильнее пожалуй будет - слот объекта. Ну а в каком потоке объект в том и слот. Помоему всё так.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 11.6.2009, 16:35
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(Litkevich Yuriy @ 11.6.2009, 17:31) *
Ну а в каком потоке объект в том и слот.


Только получается, что оба объекта созданы в главном потоке. Как же тогда осуществлять межпоточное взаимодействие типа "юзер кликнул - пошел сигнал в дочерний поток, вызвался долгоиграющий слот".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.6.2009, 16:52
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Надо поискать по форуму. Эдик (ViGOur) с кем-то обсуждал эту тему в подробностях.

вроде вот эта
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 6.4.2020, 18:44