Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
QThread
требуется не так уж и часто, а если оно действительно нужно, то нет проблем создать объект внутри перегруженного метода run
(текущий тред будет правильный), проинициализировать там все и правильно воспользоваться QEventLoop
. Интерфейс внутренного объекта придется обернуть вызовами QMetaObject::invokeMethod(m_internalProcessor, "methodName", Qt::QueuedConnection);
, что обезопасит всех пользователей от вопросов о синхронизации.moveToThread
требуется возможно еще реже, например, когда вы хотите иметь много объектов и процессить ивенты для всех объектов только в одном треде.QRunnable
, чтобы использовать QFuture
. К сожалению, QtConcurrent
выглядит заброшенным, или просто ему приоритет понизили до самого низкого.void SomethingClass::run()
{
ptr = new T;
isStart = true;
exec();
}
QThread *thread = new QThread(this):
Worker *job = new Worker;
job->moveToThread(thread):
thread->start();
job->do();
#include <QCoreApplication>
#include <QDebug>
#include <QThread>
class QSleep : public QThread
{
public:
QSleep();
static void qmsleep(int msec) {QThread::msleep(msec);}
};
class worker : public QObject
{
public:
worker() {}
void doIt();
};
void worker::doIt()
{
while(true)
{
qDebug() << "I'm sleep now in new thread";
QSleep::qmsleep(100);
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QThread* th = new QThread();
worker* petrovich = new worker;
petrovich->moveToThread(th);
th->start();
petrovich->doIt();
for(int i = 0 ; i < 100; i++)
{
qDebug() << "I'm sleep in this thread";
QSleep::qmsleep(1000);
}
return a.exec();
}
class MyThreadImpl
: public QObject
{
Q_OBJECT
public:
MyThreadImpl();
public slots:
void doStuff()
{
// impl...
emit onSomeStuff();
// impl
}
signals:
void onSomeStuff();
};
class MyThread
: public QThread
{
Q_OBJECT
public:
void doStuff()
{
emit doStuffImpl();
}
signals:
// external
void onSomeStuff();
// internal
void onStuffImpl();
private:
void run()
{
MyThreadImpl threadImpl;
// signal to thread
connect(this, SIGNAL(onStuffImpl()), &threadImpl, SLOT(doStuff()));
// signal from thread
connect(&threadImpl, SIGNAL(onSomeStuff()), this, SIGNAL(onSomeStuff()));
exec();
}
};
Qt: шаблон для корректной работы с потоками