Из следующих ссылок я узнаю, что подклассификация QThread не является правильным способом его использования … правильный способ — создать подкласс QObject и затем переместить объект класса QObject в соответствующий поток с помощью функции moveToThread () … я пошел по следующим ссылкам ..
ссылка 1 а также ссылка 2…но мой вопрос, то как я смогу использовать статические функции, защищенные от msleep () и usleep ()? или я буду использовать QTimer, чтобы заставить поток ждать некоторое время?
Нет необходимости в таймерах. Для ожидания Qt предоставляет QWaitCondition. Вы можете реализовать что-то вроде этого:
#include <QWaitCondition>
#include <QMutex>
void threadSleep(unsigned long ms)
{
QMutex mutex;
mutex.lock();
QWaitCondition waitCond;
waitCond.wait(&mutex, ms);
mutex.unlock();
}
Это нормальная функция. Вы, конечно, можете реализовать его как функцию-член, если хотите (это может быть static
член в таком случае.)
Одним из решений будет создание таймера:
class Worker: public QObject
{
///...
private slots:
void doWork()
{
//...
QTimer::singleShot(delay, this, SLOT(continueDoingWork()));
}
void continueDoingWork()
{
}
};
Иногда вам нужно только запустить операцию в другом потоке, и все эти циклы событий и потоки являются накладными. Тогда вы можете использовать QtConcurent
фреймворк:
class Worker
{
public:
void doWork()
{
//...
}
} worker;
//...
QtConcurent::run(worker, &Worker::doWork);
Затем я обычно использую мьютексы для имитации операций сна:
QMutex m;
m.lock();
m.tryLock(delay);
Канонический ответ «использовать сигналы и слоты».
Например, если вы хотите, чтобы QObject в потоке «просыпался» через определенный промежуток времени, подумайте QTimer :: SingleShot (), передача в слот в качестве третьего аргумента. Это можно вызвать из рассматриваемого слота, что приводит к периодическому выполнению.
Вы не можете позволить другому потоку спать без сотрудничества с этим потоком, вот почему функции-члены QThread
защищены Если вы хотите спать в другом потоке, вам нужно использовать условную переменную или таймер внутри
Если вы хотите так спать текущий поток с usleep()
, самый простой способ — это сделать его подклассом — это прекрасно, если вам не нужно QThreadPool
, цикл локального события потока или подобное.