multithreading - 带有线程类的 Qt 信号和槽

标签 multithreading qt signals slot

我有一个显示表格、计算数据等的 QWidget TableView 类...

在它的构造函数中,我启动了该类的 FortuneServer 服务器:

FortuneServer::FortuneServer(QObject *parent)
    : QTcpServer(parent)
{
...

此类在 FortuneServer::incomingConnection 上启动一个新线程,如下所示:
FortuneThread::FortuneThread(int socketDescriptor, const QString &fortune, QObject     *parent)
: QThread(parent), socketDescriptor(socketDescriptor), text(fortune)
{
}

void FortuneThread::run()
{
    QTcpSocket tcpSocket;
    if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
        emit error(tcpSocket.error());
        cout<<"socket error"<<endl;
        return;
    }
    tcpSocket.waitForReadyRead(10000);
    // this where sockets opens and waits for incoming data...

我需要执行以下操作:
  • 我需要连接从客户端在此线程中获得的字符串,与 TableView 类中的某个函数计算另一个字符串并将其返回到该线程并将其发送到客户端。
  • 如果我从线程使用发射,我如何让线程等待结果?

  • 这是如何正确完成的?

    最佳答案

    从网络上的源读取字节时,您可以:

    1-使用固定长度的二进制消息。所以你可以等待字节 block 被读取并做任何你需要做的事情。
    2- 使用基于字符串的协议(protocol),该协议(protocol)使用分隔符来分隔消息。当看到分隔符时,您需要提取新的收入消息。
    3- 使用 Content Length 之类的东西来了解有多少字节来了,你应该阅读。

    在 Qt 中,您需要有一个 slot调用类(class)。还有一个 signal来电者类(class)。当一个新字符串到达​​时(使用任何方法),您只需发出信号,被调用的类就会得到通知。您必须使用 connect()将插槽连接到信号的方法。我认为 QIODevice它是 QTcpSocket 的父级有一个名为 readyRead() 的信号,当有新数据可用时,它会为您提供信号。

    永远不要做可能在构造函数中抛出异常的操作。最好以不同的方法从构造函数中创建和启动服务器。

    关于multithreading - 带有线程类的 Qt 信号和槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10966061/

    相关文章:

    Java 在线程池中安全地存储和恢复未完成的任务

    c++ - 由于 Qt moc,在头文件中包含头文件

    c++ - QGraphicsEllipseItem 不可移动

    multithreading - 如何设置 QTConcurrent 操作的最大线程数?

    audio - 分割语音和清音语音?

    c++ - 多线程妄想症

    multithreading - 在多个 qt 线程中使用单个 QSqlDatabase 连接

    c - WEXITSTATUS(status) 返回什么?

    并发多线程

    r - 如何将频谱图矩阵转换为WAV文件