Путаница в отношении QThread, QObject, сходства потоков и цикла событий

Я шел по ссылкам

  1. Вы делаете это не правильно
  2. Правильное использование QThread. Part1
  3. Правильное использование QThread. Part2

Я запутался в некоторых заявлениях. В первой ссылке написано, что

все функции в QThread были написаны и предназначены для вызова из потока создания, а не из потока, который запускает QThread.

в то время как он предлагает использовать moveToThread переместить объект в новый поток, вместо того, чтобы создавать подклассы QThread, Мой вопрос:

Реализация по умолчанию run вызовы методов exec, который создает цикл событий, и когда объект родство нитей изменено с помощью moveToThreadвсе slots будет выполнен в новый поток, не на создание темы, что противоречит вышеупомянутому предполагаемое использование. Я что-то пропустил?

Второй вопрос:

В третьей ссылке сказано

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

Мой вопрос как может быть более одного цикла событий в одном потоке ? Я понимаю, что событие-цикл цикл через событийно-очереди, до тех пор exit/terminate называется, и обрабатывает каждый event прибывает в эту очередь. Если это правда, один цикл никогда не закончится (если exit/terminate называется), как может начаться другое? Любой пример кода, демонстрирующий это, будет высоко оценен.

3

Решение

«что противоречит вышеупомянутому предполагаемому использованию. Я что-то упустил?»

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

Давайте рассмотрим пример с минимальным кодом: —

QThread* pThread = new QThread; // QThread on the main thread
MyObject* myObj = new MyObject; // MyObject on the main thread
myObj->moveToThread(pThread);   // MyObject on the new thread, controlled by pThread
pThread->start();               // pThread instance is still on the main thread

Предполагая, что этот код был создан из объекта, сходство потоков которого является основным потоком, например QMainWindowобъект потока pThread работает на основном потоке; его сродство к нитям является основным потоком.

В отличие от QObject полученный MyObject пример, myObj, был перемещен в новую тему pThread, Итак, нить сродства myObj сейчас новая тема.

«функции, написанные для QThread«все еще вызываются напрямую из основного потока, так как именно там он работает.

Думать о QThread как объект контроллера потока, а не сам поток. Это одна из причин, почему часто не рекомендуется наследовать от QThread, если вы не хотите изменить как QThread управляет основным потоком.

Как может быть более одного цикла событий в одном потоке? …

Я не использовал это непосредственно сам, но я постараюсь объяснить это, как я понимаю. Возможно, кто-то еще сможет исправить или подтвердить это. От Документация Qt для QEventLoop, Говорится: —

В любое время вы можете создать QEventLoop объект и вызов exec() на нем, чтобы начать локальный цикл событий.

Подпись от QEventLoop exec:

int QEventLoop :: exec (ProcessEventsFlags flags = AllEvents)

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

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

Если вы представляете цикл событий как нечто подобное (псевдокод):

QList<QEvent*> eventList;
while(!stop)
{
// handle events in eventList
}

Второй цикл событий будет делать это:

bool bStop = false;
QList<QEvent*> eventList;
while(!bStop)
{
// handle events in eventList
...
...
// Inner event loop
bool bStop = false;
while(!bStop)
{
// handle events in eventList
}
}
4

Другие решения


По вопросам рекламы [email protected]