std :: thread消耗Qt中的所有CPU

时间:2014-07-16 09:18:23

标签: c++ multithreading qt cpu stdthread

我有一个功能。在我的函数中有一个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!

有什么问题?

非常感谢。 雅阿里。

2 个答案:

答案 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通过运行循环调度 - 被阻止。

实际上,这是主线程的死锁。