Я шел по ссылкам
Я запутался в некоторых заявлениях. В первой ссылке написано, что
все функции в QThread были написаны и предназначены для вызова из потока создания, а не из потока, который запускает QThread.
в то время как он предлагает использовать moveToThread
переместить объект в новый поток, вместо того, чтобы создавать подклассы QThread
, Мой вопрос:
Реализация по умолчанию run
вызовы методов exec
, который создает цикл событий, и когда объект родство нитей изменено с помощью moveToThread
все slots
будет выполнен в новый поток, не на создание темы, что противоречит вышеупомянутому предполагаемое использование. Я что-то пропустил?
Второй вопрос:
В третьей ссылке сказано
очередь событий принадлежит потоку вместо цикла событий, и она является общей для всех циклов событий, выполняющихся в этом потоке.
Мой вопрос как может быть более одного цикла событий в одном потоке ? Я понимаю, что событие-цикл цикл через событийно-очереди, до тех пор exit
/terminate
называется, и обрабатывает каждый event
прибывает в эту очередь. Если это правда, один цикл никогда не закончится (если exit
/terminate
называется), как может начаться другое? Любой пример кода, демонстрирующий это, будет высоко оценен.
«что противоречит вышеупомянутому предполагаемому использованию. Я что-то упустил?»
Да, я думаю, что вы неправильно понимаете концепцию схожести потоков (потоков, на которых работает объект).
Давайте рассмотрим пример с минимальным кодом: —
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
}
}