Как QEventLoop должен использоваться, если мы не подкласс QThread в Qt 4.8 x?


Я читал, что есть два подхода для работы с QThread. Если у меня есть рабочий класс, который наследует QObject (как в http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/), то как я должен создавать и управлять локальным QEventLoop для работы с сигналами / слотами? Я не хочу, чтобы произошла утечка памяти. Как помощью QNetworkAccessManager должно быть создано работником в http://codethis.wordpress.com/2011/04/04/using-qthread-without-subclassing/?

1 2

1 ответ:

Если вы не подкласс QThread, он имеет свой собственный цикл событий (исправлена документация QThread Qt 5, также применима для Qt 4):

По умолчанию run() запускает цикл событий, вызывая exec (), и запускает цикл событий Qt внутри потока.

Управление работой, выполняемой работником, может быть легко выполнено с помощью сигналов и слотов:

(...) вы можете подключить рабочие слоты к любому сигналу, от любого объекта, в любом потоке. Это безопасно для подключения сигналы и слоты через различные потоки, благодаря механизму под названием queued connections.

Это означает, что вам обычно не нужно заботиться о каком-либо событийном цикле самостоятельно (если только вам не требуется специальное поведение). Просто подключите сигнал потока started к любому слоту вашего рабочего объекта и убедитесь, что вы настроили какую - то цепочку удаления: либо рабочий подает сигнал, который приводит к остановке и удалению потока, либо наоборот-оба способа работают, в зависимости от вашего выбора. ситуация.