1

我正在编写一个从套接字接收数据的 Qt/C++ 程序。我发现我丢失了 readyRead 信号,因为我的插槽花费了太长时间来分析传入的数据。所以现在我把它配对到最低限度:

void test::inputAvailable()
{
    while (m_tcpSocket->bytesAvailable())
        m_inputBuffer += m_tcpSocket->readAll();
    emit(datawaiting());
}

我的问题是:

  1. 我是否需要使用互斥锁来保护 m_inputBuffer 变量?由于此插槽将附加到它,而我的主程序可能正在从中删除数据。
  2. 互斥体是否会减慢我的插槽速度,因为我需要它快速。(避免丢失 readyRead 信号)
  3. 发射(最后一行)是向我的程序发出信号以分析传入数据的正确方法吗?或者这是否会导致我的程序仍在插槽中时重新进入事件循环(导致信号丢失)

我读过这个类似的问题,但没有人给出真正的答案。

4

2 回答 2

0
  1. 由于它同时发生,某种变量访问同步将是有用的。否则它可能会产生未定义的行为。
  2. 这取决于主程序将占用同步变量多长时间。
  3. Qt 信号和槽被放置在事件循环队列中,因此发出 datawaiting() n 次,您最终会得到与该特定信号配对的 n 次执行槽。
于 2013-11-10T14:04:21.000 回答
-1

当您可以简单地读入变量并将其传递给处理程序时,为什么要共享全局变量、引入同步等。

void test::inputAvailable()
{
    while (m_tcpSocket->bytesAvailable())
        QByteArray data  += m_tcpSocket->readAll();
    emit datawaiting(data);
}
于 2013-11-10T14:22:09.983 回答