如何最好地从readyRead信号上的套接字中获取数据?

时间:2013-11-10 13:58:29

标签: c++ qt signals-slots slot event-loop

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

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

我的问题是:

  1. 我是否需要使用互斥锁保护m_inputBuffer变量?由于此插槽将附加到它,而我的主程序可能正在从中移除数据。
  2. 因为我需要它快速,因此互斥量会减慢我的插槽速度。 (以避免丢失readyRead信号)
  3. 发出(最后一行)是否是正确的方式来通知我的程序来分析传入的数据?或者这是否导致我的程序在仍然在插槽中时重新进入事件循环(导致信号丢失)
  4. 我读过this similar question,但没有人给出真正的答案。

2 个答案:

答案 0 :(得分:0)

  1. 由于同时发生某种变量访问同步会很有用。否则它可能会产生未定义的行为。
  2. 这取决于主程序占用同步变量的时间。
  3. Qt信号和插槽被放置在事件循环队列中,因此发出datawaiting()n次,最终会有n次执行的插槽与该特定信号配对。

答案 1 :(得分:-1)

为什么要共享全局变量,引入同步等,只需读入变量并将其传递给处理程序即可。

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