- 主题:请教:qthread里这句话。
你说的模型2是subclass QThread?如果是这种的话,QThread::run是另一个线程的入口,QThread的其他部分还在创建它的线程中。
【 在 zhanghaoX 的大作中提到: 】
: 对模型二
: queuedslots和invokedmethods都是被别人调用的,都必定是在old线程中执行。
: qthread本身调用的自己的成员函数,如果是在非run中调用,就是在old线程执行,如果是在run中调用,就是在新线程中调用的。
: ...................
--
FROM 123.123.134.*
没什么歧义吧,要是按照一般方法调用,那就是运行在调用者的线程中。
【 在 zhanghaoX 的大作中提到: 】
: 你看第二段括号里的话。
:
--
FROM 123.123.134.*
moveToThread(QThread*)后,如果是queued connected signal/slot,或者设置为QueuedConnection用QMetaObject::invokeMethod调用,worker中的slots都是在QThread::run中的线程内的。
【 在 zhanghaoX 的大作中提到: 】
: 还一个问题,模型一,work假如有两个slot,movetothread,run起来后,两个slots在一个线程执行,还是两个,还是别的情形,?
:
: 。
--
FROM 123.123.134.*
如果已经subclass QThread并且override QThread::run了,就不要再用signal/slot去做跨线程调用了。QThread::run中运行了一个消息循环,override后不做特殊处理的话,QThread就无法响应signal了。
“
In that example, the thread will exit after the run function has returned. There will not be any event loop running in the thread unless you call exec().
”
【 在 zhanghaoX 的大作中提到: 】
: 还有这句,new slots should not be implemented directly into a subclassed thread。
:
: 啥意思? 着重点是在directly? 是说要注意同步问题?
: ...................
--
FROM 123.123.134.*
一般方法就是指instance.method()这种,Qt里面跨线程调用需要用queued signal/slot或者QMetaMethod::invoke(QueuedConnection)。
【 在 zhanghaoX 的大作中提到: 】
: 什么叫一般方法调用?
: 。
--
FROM 123.123.134.*
是一回事,这个相当于发送一个消息到其他线程,目标线程会从消息队列挨个取出来执行对应的slot
【 在 zhanghaoX 的大作中提到: 】
: queue signal/slot 和 queue connection 不是一回事?
--
FROM 123.123.134.*
是这个意思吗?
#ifndef TASK_H
#define TASK_H
#include <QThread>
#include <iostream>
using namespace std;
class Worker : public QObject
{
Q_OBJECT
public slots:
void slot1() {
emit message(QString("SLOT1 runs in 0x%1").arg((int)thread()->currentThreadId(), 0, 16));
}
void slot2() {
emit message(QString("SLOT2 runs in 0x%1").arg((int)thread()->currentThreadId(), 0, 16));
}
signals:
void message(const QString &result);
};
class Controller : public QObject
{
Q_OBJECT
QThread workerThread;
public:
Controller() {
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
connect(this, &Controller::operate1, worker, &Worker::slot1);
connect(this, &Controller::operate2, worker, &Worker::slot2);
connect(worker, &Worker::message, this, &Controller::handleResults);
workerThread.start();
}
~Controller() {
workerThread.quit();
workerThread.wait();
}
public slots:
void handleResults(const QString &str)
{
cout << str.toStdString() << endl;
}
signals:
void operate1();
void operate2();
};
#endif // TASK_H
#include <QCoreApplication>
#include <iostream>
#include "task.h"
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
cout << "Main Thread ID: " << qApp->thread()->currentThreadId() << endl;
Controller ctl;
emit ctl.operate1();
emit ctl.operate2();
return a.exec();
}
【 在 zhanghaoX 的大作中提到: 】
: 模型1的worker的两个slot 怎么解?
--
FROM 123.123.134.*