我创建了自己的
请注意,我没有过载
这里是测试代码:
输出结果为:
能有人解释一下为什么
TestService
类,它在单独的 QThread
上运行,但当 MainLoop
终止时,QThread::finished
信号不会被发出。我看到了一个类似的问题,但那里的问题略有不同,因为 OP 过载了 QThread
,而我只是将我的类移动到线程中。请注意,我没有过载
QThread
类,我只是根据这个示例过载了 QObject
:http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/
这是我的 TestService
类:#include <QObject>
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <iostream>
using namespace std;
class TestService: public QObject
{
Q_OBJECT;
private:
volatile int _count;
QWaitCondition _monitor;
QMutex _mutex;
QThread* _thread;
public:
TestService(int numSeconds)
{
_count = numSeconds;
_thread = NULL;
cout << "TestService()" << endl;
}
virtual ~TestService()
{
cout << "~TestService()" << endl;
}
void Start()
{
QMutexLocker locker(&_mutex);
if(_thread == NULL)
{
_thread = new QThread;
// Move this service to a new thread
this->moveToThread(_thread);
// The main loop will be executed when the thread
// signals that it has started.
connect(_thread, SIGNAL(started()), this, SLOT(MainLoop()));
// Make sure that we notify ourselves when the thread
// is finished in order to correctly clean-up the thread.
connect(_thread, SIGNAL(finished()), this, SLOT(OnFinished()));
// The thread will quit when the sercives
// signals that it's finished.
connect(this, SIGNAL(Finished()), _thread, SLOT(quit()));
// The thread will be scheduled for deletion when the
// service signals that it's finished
connect(this, SIGNAL(Finished()), _thread, SLOT(deleteLater()));
// Start the thread
_thread->start();
}
}
void Stop()
{
_count = 0;
_monitor.wakeAll();
}
private slots:
void MainLoop()
{
cout << "MainLoop() Entered" << endl;
while(_count > 0)
{
cout << "T minus " << _count << " seconds." << endl;
QMutexLocker locker(&_mutex);
_monitor.wait(&_mutex, 1000);
_count--;
}
cout << "MainLoop() Finished" << endl;
emit Finished();
}
virtual void OnFinished()
{
cout << "OnFinished()" << endl;
}
signals:
void Finished();
};
这里是测试代码:
void ServiceTest()
{
cout << "Press q to quit." << endl;
cout << "Press s to start." << endl;
cout << "Press t to stop." << endl;
QSharedPointer<TestService> testService(new TestService(10));
char in = 'a';
while( in != 'q' )
{
switch(tolower(in))
{
case 's':
testService->Start();
break;
case 't':
testService->Stop();
break;
default:
break;
}
cin.get(in);
in = tolower(in);
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
ServiceTest();
QTimer::singleShot(0, &a, SLOT(quit()));
return a.exec();
}
输出结果为:
Press q to quit.
Press s to start.
Press t to stop.
TestService()
s
MainLoop() Entered
T minus 10 seconds.
T minus 9 seconds.
T minus 8 seconds.
t
MainLoop() Finished
q
~TestService()
Press any key to continue . . .
能有人解释一下为什么
finished
没有被触发以及如何修复它吗?
QtConcurent::run
是完全基于 Qt 的,与 boost 没有任何关系。 - Lol4t0QtCurrent :: run
中的示例使用了boost :: bind
。 感谢更新的答案:当您说发出finished()
信号时,_thread
的事件循环已经完成执行时,我仍然困惑的是您的意思,...我不是要在_thread
的事件循环中处理它,而是在TestService
的事件循环中处理它。如果我理解正确,由于服务尚未被销毁,因此TestService
事件循环仍应处于活动状态。 - KirilQThread::finished()
信号的接收者是一个没有事件循环的线程上的对象,所以他的问题是槽从未被触发,而不是信号从未被发射。 - Phlucious