2009-04-20 4 views
1

У меня есть этот дизайн. Я не мог добиться того, что мне нужно:Как синхронизировать между основным и рабочим потоком в Qt?

  • B наследуется от A.
  • А наследуется от QThread.

Моя цель - перезапустить (перезапустить) поток «рабочий», когда он завершил свою задачу. Я намерен вызвать деструктор рабочего потока для этого подхода, потому что он берет память из кучи. Мне нужно очистить все связанные переменные.

Как я могу это достичь?

int main() 
{ 
    // re-start start 
    A* worker = B::getInstance(); 
    worker->start(); 
    // re-start end 

    return a.exec(); 
} 

Написание петли не является решением проблемы. Потому что мне нужно научиться, что рабочий поток полностью остановлен. Я попытался использовать worker-> wait(). Но это не работает.

+0

На какой платформе вы находитесь? – 2009-04-20 13:38:02

+0

Вопрос для меня немного неясен. Почему wait() не работает? Как код относится к вопросу? – jpalecek

ответ

0

Я не полностью понимаю ваш вопрос, но если вы выделяете нить, и вы должны перезапустить его снова после его завершения, вы можете сделать следующее:

проверить:

  • либо задайте переменную в рабочем потоке, когда она закончена, и дайте основному потоку опросить переменную для установки. Когда это произойдет, это означает, что поток завершен.
  • или попросите рабочий поток вызвать postEvent(), чтобы он помещал пользовательское событие в очередь событий. Затем это событие будет собрано по основному потоку и будет действовать соответствующим образом.

перезапустить:

  • либо выбросить объект рабочего потока полностью и создайте новый
  • или иметь очищающий код в методе частных очистки(), который вызывается:
    • Вы запускаете нить (первая вещь)
    • в деструкторе
    • сделать это издательство с и использовать его вручную, если вы хотите предоставить эту возможность (опасно, если вызывается, когда поток работает)
0

Общее правило RAII (Получение ресурса есть инициализация) является то, что код, который приобретает ресурс отвечает за обеспечение его освобождения. Таким образом, ваш рабочий поток должен завершиться после освобождения всех ресурсов, которые он приобрел.

Общий стиль основной программы будет:

  • Инициализировать то, что нуждается в инициализации
  • внутри «навсегда» петли,
  • Инициализировать рабочий поток.
  • Пусть он бежит бесплатно.
  • Основной поток может выполнять свою работу делегации (вручая задачи к работнику)
  • Или просто ждать работника, чтобы закончить
  • И повторить.

В качестве альтернативы основной поток все еще может работать в цикле forever, но распознает, когда делегируемая задача прибыла, и в этот момент инициализируйте рабочий поток и задайте ему конкретную задачу. Это позволяет использовать столько рабочих потоков, сколько есть неполных делегируемых задач. Возможно, вам придется задушить номер, чтобы у вас не было слишком много неполных задач.

Смежные вопросы