QThread: как использовать защищенные статические функции

Из следующих ссылок я узнаю, что подклассификация QThread не является правильным способом его использования … правильный способ — создать подкласс QObject и затем переместить объект класса QObject в соответствующий поток с помощью функции moveToThread () … я пошел по следующим ссылкам ..
ссылка 1 а также ссылка 2…но мой вопрос, то как я смогу использовать статические функции, защищенные от msleep () и usleep ()? или я буду использовать QTimer, чтобы заставить поток ждать некоторое время?

1

Решение

Нет необходимости в таймерах. Для ожидания Qt предоставляет QWaitCondition. Вы можете реализовать что-то вроде этого:

#include <QWaitCondition>
#include <QMutex>

void threadSleep(unsigned long ms)
{
QMutex mutex;
mutex.lock();
QWaitCondition waitCond;
waitCond.wait(&mutex, ms);
mutex.unlock();
}

Это нормальная функция. Вы, конечно, можете реализовать его как функцию-член, если хотите (это может быть static член в таком случае.)

2

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

Одним из решений будет создание таймера:

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);
1

Канонический ответ «использовать сигналы и слоты».

Например, если вы хотите, чтобы QObject в потоке «просыпался» через определенный промежуток времени, подумайте QTimer :: SingleShot (), передача в слот в качестве третьего аргумента. Это можно вызвать из рассматриваемого слота, что приводит к периодическому выполнению.

1

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

Если вы хотите так спать текущий поток с usleep(), самый простой способ — это сделать его подклассом — это прекрасно, если вам не нужно QThreadPool, цикл локального события потока или подобное.

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