Выполнение двух потоков параллельно с одним потоком, содержащим событие - PullRequest
0 голосов
/ 16 марта 2020

У меня есть две функции, которые должны быть выполнены после указанного c интервала времени. Поэтому я создаю два потока, и каждая функция выполняется в отдельных потоках. Одна из функций " checkForEvent () " имеет событие, ожидающее события.

Когда функция " checkForEvent () " ожидает события, другая функция " checkServer () " не выполняется, даже если она выполняется в отдельный поток.

dongleThread = new QThread(this);
checkDongle = new QTimer();
checkDongle->setInterval(DONGLE_CHECK_TIMER);
checkDongle->moveToThread(dongleThread);
connect(checkDongle, SIGNAL(timeout()), this, SLOT(checkForEvent()));
connect(dongleThread, SIGNAL(started()), checkDongle, SLOT(start()));
dongleThread->start();

serverThread = new QThread(this);
checkServer = new QTimer();
checkServer->setInterval(SERVER_CHECK_TIMER);
checkServer->moveToThread(serverThread);
connect(checkServer, SIGNAL(timeout()), this, SLOT(checkServer()));
connect(serverThread, SIGNAL(started()), checkServer, SLOT(start()));
serverThread->start();

checkForEvent() //This function is waiting for an Event

checkServer()

Как выполнить обе функции в отдельных потоках? Спасибо !!

1 Ответ

1 голос
/ 16 марта 2020

Ваш connect вызов использует тип соединения по умолчанию: Qt::AutoConnection. Вот что это означает:

Qt :: AutoConnection: Если получатель живет в потоке, который излучает сигнал, используется Qt :: DirectConnection. В противном случае используется Qt :: QueuedConnection. Тип соединения определяется при подаче сигнала.

Здесь ваши QTimer и this находятся в другом потоке. Это означает, что будет использоваться Qt::QueuedConnection.

Qt :: QueuedConnection: Слот вызывается, когда управление возвращается к событию l oop потока получателя. Слот выполняется в потоке получателя.

Таким образом, ваши два слота вызываются в потоке this. Если один из них блокирует, другой никогда не запустится.

Один из способов решения проблемы - перемещение рабочего объекта в свой собственный поток. Рабочий объект вызовет checkForEvent и подаст сигнал после окончания ожидания. Этот сигнал может быть подключен к checkServer в this. При этом вам нужен только один поток. Вы можете посмотреть документацию QThread для получения дополнительной информации о рабочих объектах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...