【发布时间】:2018-12-30 09:56:14
【问题描述】:
我在 Qt 中创建了一个 Worker 对象来无限期地处理视频输入,然后将其移动到 QThread 以保持 UI 线程继续运行。问题是,我将其设计为使视频捕获功能在无限循环中运行,直到被标志中断,并且该标志应该由 Worker 对象中的插槽设置,但由于 Worker 对象位于无限循环内,它永远不会处理这个“退出”插槽(或者至少我认为这是正在发生的事情)。我依赖于一个外部库,因此将视频轮询替换为另一种方法并不是一个真正的选择。有人可以确认这确实是问题并提出解决方案吗?代码如下:
class worker : public QObject{
Q_OBJECT
public:
worker(QObject* parent = NULL);
~worker(){}
Q_SLOT void process();
Q_SLOT void stop();
private:
bool quit;
};
worker::worker(QObject *parent) : QObject(parent){
quit = false;
}
void worker::process(){
while(!quit){
//this library call puts the thread to sleep until a frame is available
WaitForVideoFrame();
}
}
void worker::stop(){
quit = true;
}
然后从我拥有的 UI 对象:
MyWorker = new worker();
QThread* thread = new QThread;
MyWorker->moveToThread(thread);
connect(thread, SIGNAL(started()), MyWorker, SLOT(process()));
QPushButton* stop_button = new QPushButton(this);
connect(stop_button, SIGNAL(clicked(bool)), MyWorker, SLOT(stop()));
thread->start();
这里的问题是,当我按下 stop_button 时,没有任何反应,工作人员继续运行循环。是否有可能我可以调用一个函数来从无限循环中为事件循环产生处理时间?或者对此有更好的设计/解决方案?欢迎提出任何建议。
【问题讨论】:
-
这个线程运行了多长时间?
-
它可能会运行一整天,Jon。 8、10 小时不间断。
标签: multithreading qt qt5 signals-slots qthread