crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Передача сигналов между потоками
quarz
  опции профиля:
сообщение 13.4.2011, 14:31
Сообщение #1


Студент
*

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

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




Репутация:   0  


Столкнулся с проблемой при организации передачи сигналов между потоками:
Есть главный гуишный поток A. Он создает 2 рабочих потока B и C.
Мне нужно нужно сделать так: B-->C. Причем эти потоки друг о друге не знают, всех видит только главный поток.

Минимальный код:

//где-то в главном потоке A:
B *B_ptr = new B();
B_ptr->start();

C *C_ptr = new C();
C_ptr->start();

QObject::connect(B_ptr, SIGNAL(signalB()), C_ptr, SLOT(slotC()));

class B : public QThread
{
public:
  ...
protected:
  void run(){
    exec();      //цикл обработки событий
  }
signals:
  void signalB();
};

class C : public QThread
{
public:
  ...
protected:
  void run(){
    exec();      //цикл обработки событий
  }
public slots:
  void slotC();
};


При этом я ожидаю, что slotC будет выполнятся в потоке C, а он выполняется в главном потоке А. Почему?
Документация по QObject::connect и Qt::ConnectionType говорит, что если сигналы и слоты находятся в разных потоках, по умолчанию сигнал добавляется в очередь сообщений того потока, которому он адресован.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 13.4.2011, 14:43
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


потому что сам объект потока C_ptr создан в контексте потока А, так же как и B_ptr.

те объекты которые будут созданы в контекстах потоков B_ptr и С_ptr, будут отрабатывать свои слоты соответственно в рамках времени выделенного потокам B_ptr и С_ptr соответственно.

например (псевдокод)
class BThreadObj
: public QThread
{
   protected:
      void run(){
             QObject* objWithBThreadObjContext(new QObject);
             exec();      //цикл обработки событий
      }
};


Сообщение отредактировал wiz29 - 13.4.2011, 14:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
quarz
  опции профиля:
сообщение 13.4.2011, 14:58
Сообщение #3


Студент
*

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

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




Репутация:   0  


Спасибо, я не знал про контексты потоков!

Цитата(wiz29 @ 13.4.2011, 15:43) *
потому что сам объект потока C_ptr создан в контексте потока А, так же как и B_ptr.

те объекты которые будут созданы в контекстах потоков B_ptr и С_ptr, будут отрабатывать свои слоты соответственно в рамках времени выделенного потокам B_ptr и С_ptr соответственно.

например (псевдокод)
class BThreadObj
: public QThread
{
   protected:
      void run(){
             QObject* objWithBThreadObjContext(new QObject);
             exec();      //цикл обработки событий
      }
};

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 13.4.2011, 15:06
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


http://developer.qt.nokia.com/wiki/Threads...Objects_Russian возможно поможет разобраться более детально.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 23.12.2024, 9:36