详解 QT 多线程 TCP 文件接收实例

要求:在QT程序中写一个多线程的软件,使用共享内存实现TCP数据接收,发送与处理,三个不同进程间的相互通信,并使用哨兵线程监控各个进程是否出现堵塞。

分析:在 Qt 程序中实现多线程的软件,使用共享内存实现 TCP 数据接收、发送和处理,以及三个不同进程间的相互通信,并使用哨兵线程监控各个进程是否出现堵塞,可以按照以下步骤进行:

  1. 创建三个不同的进程,分别用于 TCP 数据接收、发送和处理。
  2. 在每个进程中使用 QSharedMemory 实现共享内存,用于存储需要传递的数据。
  3. 使用 TCP Socket 在进程间进行数据通信,其中一个进程作为服务器端监听端口,另外两个进程作为客户端连接到服务器端。
  4. 使用哨兵线程监控各个进程是否出现堵塞,当某个进程出现堵塞时进行相应处理。

下面是一个简单的示例代码,演示了如何在 Qt 中实现上述功能:

cpp 复制代码
// TCP 数据接收进程
#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <QSharedMemory>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTcpServer server;
    if (!server.listen(QHostAddress::Any, 1234)) {
        qDebug() << "Failed to start server.";
        return -1;
    }

    qDebug() << "Server started, listening on port 1234";

    // 创建共享内存用于存储接收到的数据
    QSharedMemory sharedMemory("ReceivedData");
    sharedMemory.create(sizeof(QByteArray));

    return a.exec();
}
cpp 复制代码
// TCP 数据发送进程
#include <QCoreApplication>
#include <QTcpSocket>
#include <QSharedMemory>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 连接服务器端
    QTcpSocket socket;
    socket.connectToHost("localhost", 1234);
    if (!socket.waitForConnected()) {
        qDebug() << "Failed to connect to server.";
        return -1;
    }

    qDebug() << "Connected to server.";

    // 创建共享内存用于存储要发送的数据
    QSharedMemory sharedMemory("ToSendData");
    sharedMemory.create(sizeof(QByteArray));

    return a.exec();
}
cpp 复制代码
// TCP 数据处理进程
#include <QCoreApplication>
#include <QTcpSocket>
#include <QSharedMemory>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 连接服务器端
    QTcpSocket socket;
    socket.connectToHost("localhost", 1234);
    if (!socket.waitForConnected()) {
        qDebug() << "Failed to connect to server.";
        return -1;
    }

    qDebug() << "Connected to server.";

    // 创建共享内存用于存储接收到的数据
    QSharedMemory sharedMemory("ReceivedData");
    if (!sharedMemory.attach()) {
        qDebug() << "Failed to attach to shared memory.";
        return -1;
    }

    return a.exec();
}
cpp 复制代码
// 哨兵线程
#include <QCoreApplication>
#include <QTimer>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 创建哨兵定时器,每隔一段时间检查各个进程是否出现堵塞
    QTimer sentinelTimer;
    sentinelTimer.setInterval(5000); // 设置定时器间隔为5秒
    QObject::connect(&sentinelTimer, &QTimer::timeout, []() {
        // 检查各个进程是否出现堵塞,并进行相应处理
        qDebug() << "Sentinel thread checking...";
    });
    sentinelTimer.start();

    return a.exec();
}

以上是一个简单的示例,实现了 TCP 数据接收、发送和处理的三个进程,以及一个哨兵线程用于监控各个进程是否出现堵塞。你需要根据实际情况对代码进行适当修改和完善。

参考:

详解 QT 多线程 TCP 文件接收服务器实例:https://www.51cto.com/article/272733.html

Qt学习之路-进程间通信共享内存:https://blog.51cto.com/u_15329836/5091882

相关推荐
小俊俊的博客38 分钟前
海康RGBD相机使用C++和Opencv采集图像记录
c++·opencv·海康·rgbd相机
7yewh39 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
_WndProc1 小时前
C++ 日志输出
开发语言·c++·算法
薄荷故人_1 小时前
从零开始的C++之旅——红黑树及其实现
数据结构·c++
m0_748240021 小时前
Chromium 中chrome.webRequest扩展接口定义c++
网络·c++·chrome
qq_433554541 小时前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++
努力学习编程的伍大侠1 小时前
基础排序算法
数据结构·c++·算法
yuyanjingtao2 小时前
CCF-GESP 等级考试 2023年9月认证C++四级真题解析
c++·青少年编程·gesp·csp-j/s·编程等级考试
闻缺陷则喜何志丹2 小时前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
charlie1145141912 小时前
C++ STL CookBook
开发语言·c++·stl·c++20