Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在readyRead信号上从套接字抓取数据?_C++_Qt_Signals Slots_Slot_Event Loop - Fatal编程技术网

C++ 如何在readyRead信号上从套接字抓取数据?

C++ 如何在readyRead信号上从套接字抓取数据?,c++,qt,signals-slots,slot,event-loop,C++,Qt,Signals Slots,Slot,Event Loop,我正在编写一个从套接字接收数据的Qt/C++程序。我发现我丢失了readyRead信号,因为我的插槽花了太长时间来分析传入的数据。现在我把它配对到最小值: void test::inputAvailable() { while (m_tcpSocket->bytesAvailable()) m_inputBuffer += m_tcpSocket->readAll(); emit(datawaiting()); } 我的问题是: 我需要用互斥锁保护m

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

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

  • 我需要用互斥锁保护m_inputBuffer变量吗?因为这个插槽将附加到它,而我的主程序可能正在从中删除数据
  • 互斥锁会不会太慢我的插槽,因为我需要它很快。(以避免丢失readyRead信号)
  • emit(最后一行)是向我的程序发送信号以分析传入数据的正确方法吗?或者这是否会导致我的程序在仍在插槽中时重新进入事件循环(导致信号丢失)
  • 我读过,但没有人给出真正的答案

  • 因为它同时发生,所以某种类型的可变访问同步将是有用的。否则,它可能会产生未定义的行为
  • 这取决于主程序占用同步变量的时间
  • Qt信号和插槽被放置在事件循环队列中,因此发出datawaiting()n次,您将得到与该特定信号配对的n次执行插槽

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

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

    您使用显式多线程吗?因为否则就不需要同步了。信号是正常的函数调用,不会导致事件被处理。我不使用与我所询问的变量/方法相关的线程(我在程序中有另一个不相关的线程)。我想这就是让我困惑的地方。如果在我的程序处理某个特定变量时收到一个信号,而插槽也在处理该变量,那么事件循环如何知道该做什么?它是让方法先完成,还是中断以运行slot方法?它什么时候运行slot方法?事件循环不执行任何多线程处理。如果您的代码被执行,信号将不会被传递,直到您的代码完成并且控件返回到事件循环。。。这里也没有全局变量。