Как синхронизировать между основным и рабочим потоком в Qt? - PullRequest
1 голос
/ 20 апреля 2009

У меня есть этот дизайн. Я не смог добиться того, что мне нужно:

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

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

Как мне этого добиться?

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

    return a.exec();
}

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

Ответы [ 3 ]

2 голосов
/ 20 апреля 2009

Как насчет использования сигнала QThread finished()?

0 голосов
/ 20 апреля 2009

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

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

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

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

0 голосов
/ 20 апреля 2009

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

проверить:

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

для перезапуска:

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