【发布时间】:2014-10-15 17:37:59
【问题描述】:
在我的 (Qt-) 程序中,我需要一个从外部来源获得的值的连续请求。但我不希望这个请求冻结整个程序,所以我为这个函数创建了一个单独的线程。但即使它在单独的线程中运行,GUI 也会冻结。为什么?
请求函数代码:
void DPC::run()
{
int counts = 0, old_counts = 0;
while(1)
{
usleep(50000);
counts = Read_DPC();
if(counts != old_counts)
{
emit currentCount(counts);
old_counts = counts;
}
}
}
Read_DPC() 返回一个我想发送到我的 GUI 中的 lineEdit 的 int 值。
主类看起来像
class DPC: public QThread
{
Q_OBJECT
public:
void run();
signals:
void currentCount(int);
};
这段代码在main函数中调用如下:
DPC *newDPC = new DPC;
connect(newDPC, SIGNAL(currentCount(int)), SLOT(oncurrentCount(int)));
connect(newDPC, SIGNAL(finished()), newDPC, SLOT(deleteLater()));
newDPC->run();
如何防止此代码冻结我的 GUI?我究竟做错了什么? 谢谢!
【问题讨论】:
-
你究竟是如何启动一个单独的线程的?
-
我想通过创建一个从 QThread 派生的子类?根据一些线程(stackoverflow.com/questions/14545961/…)或(stackoverflow.com/questions/16501284/…)
-
为什么要从主线程调用
run?你不想让其他线程调用run吗?这不是从 QThread 派生的全部意义吗? -
不使用
run应该如何启动子线程?我尝试使用start,但这也不起作用(我只是将run替换为start,如果正确的话) -
@arc_lupus 一次一个错误。修复对
run的调用,然后重新测试,尽可能详细地描述修复该错误后出现的问题。
标签: c++ multithreading qt