W mojej aplikacji znajduje się wątek główny i wątek roboczy (QThread
).
Z głównego wątku chciałbym wywołać metodę mojego wątku roboczego i uruchomić ją w kontekście wątku.Wywoływanie metod w kontekście QThread
Próbowałem użyć QMetaObject::invokeMethod
i dać mu opcję QueuedConnection
, ale nie działa.
Próbowałem również emitować sygnały z głównego wątku (który jest podłączony do wątku wątku roboczego), ale także nie powiodło się.
Oto urywek z grubsza co starałem:
class Worker : public QThread
{
Q_OBJECT
public:
Worker() { }
void run()
{
qDebug() << "new thread id " << QThread::currentThreadId();
exec();
}
public slots:
void doWork()
{
qDebug() << "executing thread id - " << QThread::currentThreadId();
}
};
Korzystanie drogę QMetaObject:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "main thread id - " << QThread::currentThreadId();
Worker worker;
worker.start();
QMetaObject::invokeMethod(&worker, "doWork", Qt::QueuedConnection);
return a.exec();
}
Korzystanie drogę sygnału:
class Dummy : public QObject
{
Q_OBJECT
public:
Dummy() { }
public slots:
void askWork() { emit work(); }
signals:
void work();
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "main thread id - " << QThread::currentThreadId();
Worker worker;
worker.start();
Dummy dummy;
QObject::connect(&dummy, SIGNAL(work()), &worker, SLOT(doWork()), Qt::QueuedConnection);
QTimer::singleShot(1000, &dummy, SLOT(askWork()));
return a.exec();
}
Oba sposoby wynikają w głównej identyfikator wątku drukowany w QThread
doWork
.
Ponadto, myślałem o wdrożeniu prostego producenta-konsumenta, ale jeśli to działa, czy istnieje jakikolwiek powód, aby nie robić tego w ten sposób?
wątek roboczy znajduje się w jego pętli zdarzeń z powodu wywołania exec() –