Mat*_*iee 1 c++ qt multithreading signals-slots qthread
我用Qt编写了一个简单的信号槽应用程序.我想向另一个用完主线程的线程发送信号.
这是我的代码:
class Thread1 : public QThread
{
Q_OBJECT
void run()
{
exec();
}
public:
Thread1(QObject* parent);
public slots:
void a()
{
qInfo()<<QThread::currentThreadId();
}
};
class Object : public QObject
{
Q_OBJECT
public:
Object(){}
void start()
{
qInfo()<<QThread::currentThreadId();
Thread1* thread = new Thread1(this);
connect(this,SIGNAL(a()),thread,SLOT(a()));
thread->start();
emit a();
}
signals:
void a();
};
Run Code Online (Sandbox Code Playgroud)
但它返回:
0x7f9851c988c0
0x7f9851c988c0
Run Code Online (Sandbox Code Playgroud)
如何调用输出另一个threadID的信号?
你已经倒退了.A QThread是线程句柄,而不是线程本身.如果你想在另一个线程中运行某些东西,它属于QObject你移动到一个线程的平面.你根本不需要衍生出来QThread!你也不应该将一个QThread基础移动QObject到线程本身.你所做的是拥有线程本身的线程句柄.一旦线程完成,句柄就会失效(a QObject为空thread()).
首先,如果您只需要在工作线程中运行一些运行完成的代码(例如进行计算),请使用线程池和QtConcurrent框架.它管理所有线程:
#include <QtConcurrent>
...
QThread::currentThread()->setObjectName("main");
qDebug() << QThread::currentThread();
QtConcurrent::run([]{ qDebug() << QThread::currentThread(); }
Run Code Online (Sandbox Code Playgroud)
如果您坚持自己控制线程的生命周期,则执行以下操作:
#include <QtCore>
struct Worker : QObject {
Q_SLOT void aSlot() {
qDebug() << QThread::currentThread();
QThread::currentThread()->quit();
}
Q_SIGNAL void aSignal();
Q_OBJECT
};
int main(int argc, char ** argv) {
QCoreApplication app{argc, argv};
QThread::currentThread()->setObjectName("main");
QThread thread;
thread.setObjectName("thread");
Worker a, b;
b.moveToThread(&thread);
thread.start();
QObject::connect(&a, &Worker::aSignal, &b, &Worker::aSlot);
emit a.aSignal(); // the signal is emitted from the main thread
thread.wait();
}
Run Code Online (Sandbox Code Playgroud)
最后,请注意,QDebug类在传递指向a的指针时知道如何输出对象的地址,类和名称(如果设置)QObject.因此,您不需要使用QThread::currentThreadId(),这就QThread::currentThread()足够了 - QObject毕竟,您可以为线程提供助记名称,因为它们是s.