Russian Qt Forum
Май 12, 2024, 18:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отправить данные в поток  (Прочитано 5637 раз)
Paramon
Гость
« : Январь 05, 2015, 15:04 »

Создаю поток, в нём сигнал. Из нового потока отправляю emit оконному потоку. В нём ловлю сигнал. Как теперь отправить обратку потоку? По наивности также отправляю emit, который получают все потоки (что логично).
Каким образом можно ответить потоку, от которого пришёл сигнал? Если нельзя использовать сигналы/слоты, ткните носом что покурить.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Январь 05, 2015, 15:13 »

Можно узнать от какого потока пришел сигнал, вызывая функцию sender() в слоте, который сигнал вызвал.
Записан

Paramon
Гость
« Ответ #2 : Январь 05, 2015, 15:20 »

Вот как-то так работает. Но боюсь граблей.  Непонимающий
Код:
void MainWindow::GetStringData()
{
    JbThread* currThread = qobject_cast<JbThread*>(QObject::sender());
    currThread->RetStringData("123");
}
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Январь 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 документа на парсинг в несколько потоков.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #4 : Январь 08, 2015, 15:35 »

и да, сообщение будет удалено диспетчером сообщений, поэтому вызывать delete для него не следует.
Записан
Paramon
Гость
« Ответ #5 : Январь 10, 2015, 10:55 »

Благодарю.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #6 : Январь 11, 2015, 08:47 »

sendEvent не удаляет эвенты
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Январь 11, 2015, 10:59 »

sendEvent не удаляет эвенты
Да, и не выполняется ли оно в текущей нитке? (по-моему да). Вот если postEvent - тогда все верно (событие в куче и удалять самому не надо)
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #8 : Январь 12, 2015, 11:06 »

я писал по памяти, точно уже не помню, но думаю более простого способа под Qt не найти.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.