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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Передать значение из главного потока в дочерний  (Прочитано 9845 раз)
RedDog
Гость
« Ответ #15 : Октябрь 22, 2011, 21:00 »

такой вариант я приводил несколькими постами выше:
Попробую 2-й вариант.1-й в моем случае не подойдет, ибо слишком много уже готового и отлаженного кода надо будет переделывать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Октябрь 23, 2011, 09:02 »

Код
C++ (Qt)
WorkThread *thread = new WorkThread();
connect(this, SIGNAL(doWork(int)), thread, SLOT(on_doWork(int)), Qt::QueuedConnection));
connect(this, SIGNAL(setValue(int)), thread, SLOT(on_setValue(int)), Qt::QueuedConnection));
thread->start();
emit doWork(i);
emit setValue(i);
 
Принципиально это ничем не отличается от того что привел Странник. Имеется ввиду что doWork будет делаться в слоте и что run просто запустит exec (как по умолчанию). Т.к. цикл событий запущен, дочерняя нитка сможет ловить сигналы в doWork

Код
C++ (Qt)
void doWork(..)
{
while (true) {
 ...
 QApplication::processEvents();  // если в очереди setValue, то его слот сработает
 if (mValueChanged) {               // данные изменились
 ...
}
}
 
Записан
RedDog
Гость
« Ответ #17 : Октябрь 23, 2011, 21:22 »

А что, если вызывать QCoreApplication::processEvent() непосредственно после испускания сигнала, а не в цикле каждый раз? Т.е.:
Код
C++ (Qt)
emit valueChange(i);
QCoreApplication::processEvent();
отработает,или все же есть какая то очередь (последовательность) действий, что может  не успеть?
Записан
BRE
Гость
« Ответ #18 : Октябрь 23, 2011, 21:28 »

Не поможет. Событие о сигнале кладется в очередь сообщений нити приемника и что бы это событие сработало - нужно крутануть цикл обработки событий именно этой нити.
Записан
RedDog
Гость
« Ответ #19 : Октябрь 24, 2011, 21:09 »

Попробовал вариант с processEvents(). Работает. Тему вроде как можно пометить решенной.
Хотя имхо это некоторый индусизм, т.е. не очень красиво. Буду думать над 1-м вариантом.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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