我有一个功能。在我的函数中有一个c ++线程&一个Qtimer。通过c ++线程我收到ARP回复数据包&通过QTimer我发送ARP请求数据包。
简化结构:
int foo()
{
... some codes ...
QTimer::singleShot(1000, this, SLOT(beginSending()));
std::thread tCapture(Capture);
tCapture.join();
return 0;
}
void Capture()
{
while ( ! finishCapturing )
{
do sth
}
}
在tCapture
线程中,我有一个消耗所有CPU和时间的while循环。 Qtimer不起作用!
我使用.join()
因为我想等待线程完成
当我在Qtimer插槽中设置finishCapturing
标志时,线程将完成。
以上代码无法正常工作,因为c ++线程占用了所有CPU!
有什么问题?
非常感谢。 雅阿里。
答案 0 :(得分:6)
问题是在创建线程后立即加入线程,阻止GUI线程和QTimer
以及该线程上的所有插槽。
你应该做的是在完成捕获时发出signal
;
public void beginSending(){
//do sending and capture
finishCapturing =true;
emit finshedCapture();
}
如果需要,你可以将while的主体放在一个插槽中,并使用QTimer重复调用,超时为0(这意味着将尽可能多地调用插槽)。
然后您可以将finshedCapture()
信号连接到QTimer的stop()
位置
int foo()
{
... some codes ...
QTimer::singleShot(1000, this, SLOT(beginSending()));
QTimer* timer = new QTimer(this);
connect(timer, signal(timeout()), this, slot(Capture()));
connect(this, signal(finshedCapture()), timer, slot(stop()));
connect(this, signal(finshedCapture()), timer, slot(deleteLater()));//cleaup when done
timer->setTimeout(0);
timer->setSingleShot(false);
timer->start();
return 0;
}
void Capture()
{
//no while because the timer will call it as needed
//do sth
}
答案 1 :(得分:0)
没有看到更多代码,这就是猜测:
1:Capture()
不会阻塞,因此将占用操作系统提供的CPU时间 - 这将是轻载多核系统上一个CPU的100%。
2:在主线程上调用foo()
。然后它尝试使用你的线程join()
- 阻塞直到线程结束。我没有看到任何设置finishCapturing
,所以它没有。
3:QTimer
通过运行循环调度 - 被阻止。
实际上,这是主线程的死锁。