0

为了通过设置标志(然后从线程内返回)来启动停止线程,我需要与它通信。

线程是这样实现的

MyClass* obj = new MyClass(0);
connect( this,SIGNAL( stop() ),obj, SLOT(stop()));
emit stop();    // slot is called (qDebug output)

MyThread = new QThread;
obj->moveToThread(MyThread);
connect( ... started() ... quit() ... finished() ... deleteLater() ...
....

emit stop();    // slot isn't called (qDebug output)

该插槽还没有任何逻辑,它只是使用 qDebug() 输出。对象创建和连接发生在主窗口方法中。

不幸的是,我无法弄清楚我做错了什么:一旦将对象移动到线程,插槽就不再运行。

4

2 回答 2

1

也许您只是忘记复制/粘贴它,但您错过了一个MyThread->start()电话。此外,声明线程的行应该是QThread * MyThread = new QThread();,但这可能只是一个错字。

现在,在您的回答中,您说使用 aQt::DirectConnection似乎已经解决了您的问题。但是,使用直接连接调用的槽只是直接调用槽方法。slot 方法正在运行,但它是从调用线程(stop()发出信号的地方)运行的。即使您的线程未启动,这也将起作用。您真正想要的是通过Qt::QueuedConnection. 这将在工作线程的事件循环中放置一个事件,然后调用该插槽。请注意,如果您不指定,Qt 将处理连接类型。

如果排队的连接不起作用,那么您的工作可能会阻塞线程的事件循环。在您的工作方法中,您是否曾经将控制权传递回事件循环以允许它处理事件?还是它只是在while循环中运行,等待标志改变状态?

此外,您的代码不会按原样编译/运行。我假设你已经在处理这些QApplication东西了——也就是说,在你的函数QApplication::exec()中设置好所有东西之后调用。main如果您不调用exec(),则永远不会启动主事件循环。

于 2013-01-25T16:08:58.580 回答
-1

调试输出实际上是在线程完成工作之后才发生的。使用

connect( this, SIGNAL(stop()), obj, SLOT(stop()), Qt::DirectConnection);

解决了这个问题。

于 2013-01-25T15:51:12.817 回答