Qt鼠标悬停在GUI上导致QThread循环冻结

Qt mouse hover over GUI causes QThread loop to freeze

提问人:willy_j 提问时间:6/9/2023 更新时间:6/9/2023 访问量:41

问:

我是新手,遇到了一些问题。 我在一个QThread中读取流量,在另一个QThread中进行计算,并在GUI的QTableWidget中输出数据。当我什么都不做时,它运行良好,但是当我将鼠标悬停在 GUI 上时,阅读器线程开始冻结并失去流量。 如何避免冻结以及为什么 GUI 会影响其他线程?

阅读器读取方法:

void FrameReader::read()
{
    int res = pcap_next_ex(m_adhandle, &m_currentFrame->header, &m_currentFrame->pkt_data);
    if (res > 0)
    {
        frame_dst = readMAC(m_currentFrame->pkt_data, 0x0, 6).value<MAC>();
        if (frame_dst.m1 != 0x01 && frame_dst.m2 != 0x0c && frame_dst.m3 != 0xcd) qDebug() << "Wrong frame data";
        bool filter = (m_dst != nullptr) ? ((frame_dst == *m_dst) ? true : false) : true;
        if (filter)
        {
            emit frameReceived(m_currentFrame);                
        }
    }
    else if (res == -1)
    {
        qDebug() << "Frame read error";
    }
    if (isOn) QMetaObject::invokeMethod(this, "read", Qt::QueuedConnection);

}

它发出 frameReceived 信号,该信号通过 QueuedConnection 连接到计算线程中所有必要的计算类方法。

计算后,计算类发出 valuesIsReady 信号,该信号通过 QueuedConnection 连接到 GUI 小部件,该小部件仅从计算类中的变量中获取数据即可输出计算数据。

读取器和计算类具有包装工作类,这些工作类通过 moveToThread() 在各自的 QThreads 中传输。

它可以在不移动鼠标的情况下工作,但是当我将鼠标悬停在 GUI 上时,会发生一些麻烦。

C++ 多线程 Qt 事件 QTyne

评论

0赞 Joseph Larson 6/10/2023
这是您的鼠标悬停代码吗?或者你能以某种方式捆绑主执行线程吗?
0赞 willy_j 6/13/2023
是的,我发现了错误。当我初始化它们时,我将一组对象绑定到主线程。移动到正确的线程后,一切正常。

答: 暂无答案