Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Paramon от Январь 05, 2015, 15:04



Название: Отправить данные в поток
Отправлено: Paramon от Январь 05, 2015, 15:04
Создаю поток, в нём сигнал. Из нового потока отправляю emit оконному потоку. В нём ловлю сигнал. Как теперь отправить обратку потоку? По наивности также отправляю emit, который получают все потоки (что логично).
Каким образом можно ответить потоку, от которого пришёл сигнал? Если нельзя использовать сигналы/слоты, ткните носом что покурить.


Название: Re: Отправить данные в поток
Отправлено: gil9red от Январь 05, 2015, 15:13
Можно узнать от какого потока пришел сигнал, вызывая функцию sender() (http://qt-project.org/doc/qt-4.8/qobject.html#sender) в слоте, который сигнал вызвал.


Название: Re: Отправить данные в поток
Отправлено: Paramon от Январь 05, 2015, 15:20
Вот как-то так работает. Но боюсь граблей.  ???
Код:
void MainWindow::GetStringData()
{
    JbThread* currThread = qobject_cast<JbThread*>(QObject::sender());
    currThread->RetStringData("123");
}


Название: Re: Отправить данные в поток
Отправлено: Fregloin от Январь 08, 2015, 15:34
можно слать QEvent потокам через post/sendEvent. У вашего потока должен быть запущен свой менеджер сообщений вызовом exec().

Если вкратце.

Делаем наследника от QEvent, определяем его тип (числовая константа QEvent::UserType + ваш номер).
Потом отправляем вашему конкретному потоку это сообщение
Код:

const QEventType (int может быть не помню, см. в хелпе) MyType = QtEvent::UserType + 1;

class MyEvent : public QEvent {
private:
 int someData;
public:
 MyEvent(QEvent::Type type){..}
 void setDatd(int i){someData = i;}
 int data() const { return someData; }
};

class MyThread: public QThread {
private:
 void customEvent(QEvent * e) //или bool event(QEvent * e) //не помню какая ф-я вызывается, смотрите в доках
 {
  switch(e->type())
  {
   case MyType:
   MyEvent * myEvent = static_cast<MyEvent*>(e);
   int data = myEvent->data();
   myEvent->accept();
   //делаете со своим ответом что хотите
   break;

  default:
  QThread::customEvent(e);
  }
   
 }
public:
 void run() { exec(); }
};

QThread * t = new MyThread;
t->start();

MyEvent * event = new MyEvent(MyType);
event->setData(1000);
sendEvent(t,event); //шлем событие конкретному потоку, другие не получат


Вот так я у себя реализовывал рассылку частей json документа на парсинг в несколько потоков.


Название: Re: Отправить данные в поток
Отправлено: Fregloin от Январь 08, 2015, 15:35
и да, сообщение будет удалено диспетчером сообщений, поэтому вызывать delete для него не следует.


Название: Re: Отправить данные в поток
Отправлено: Paramon от Январь 10, 2015, 10:55
Благодарю.


Название: Re: Отправить данные в поток
Отправлено: Авварон от Январь 11, 2015, 08:47
sendEvent не удаляет эвенты


Название: Re: Отправить данные в поток
Отправлено: Igors от Январь 11, 2015, 10:59
sendEvent не удаляет эвенты
Да, и не выполняется ли оно в текущей нитке? (по-моему да). Вот если postEvent - тогда все верно (событие в куче и удалять самому не надо)


Название: Re: Отправить данные в поток
Отправлено: Fregloin от Январь 12, 2015, 11:06
я писал по памяти, точно уже не помню, но думаю более простого способа под Qt не найти.