You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MacOS下QT/C++如何实现进程间发送自定义事件/信号通知

macOS 下Qt/C++ 双应用主动通知的实现方案

以下是3种经过验证的可行方案,优先推荐跨平台实现,减少平台适配成本:

方案1:使用Qt原生QLocalSocket/QLocalServer(最推荐,全平台兼容)

这个方案完全基于Qt自带API,不需要调用Mac系统原生接口,Windows、Linux、macOS都可以直接复用代码,逻辑和你之前用SendMessage的逻辑类似:

  • 应用A作为服务端,启动时监听固定名称的本地Socket,示例代码:
// 应用A 服务端初始化
m_localServer = new QLocalServer(this);
connect(m_localServer, &QLocalServer::newConnection, this, [=](){
    QLocalSocket *socket = m_localServer->nextPendingConnection();
    connect(socket, &QLocalSocket::readyRead, this, [=](){
        // 收到应用B的通知,触发后续处理逻辑
        QByteArray recvData = socket->readAll();
        // 这里可以解析B传过来的参数,比如结果存储路径、共享内存key等
        processDataResult(recvData);
        socket->disconnectFromServer();
    });
});
// 监听前先移除可能残留的旧socket
QLocalServer::removeServer("com.yourcompany.appA.datacallback");
m_localServer->listen("com.yourcompany.appA.datacallback");
  • 应用B处理完数据后,作为客户端连接该Socket发送通知即可:
// 应用B 发送通知逻辑
QLocalSocket socket;
socket.connectToServer("com.yourcompany.appA.datacallback");
if (socket.waitForConnected(1000)) {
    // 可自定义发送内容,比如传结果文件路径
    socket.write("/path/to/result/file");
    socket.waitForBytesWritten(1000);
    socket.disconnectFromServer();
}

方案2:使用macOS原生分布式通知(NSDistributedNotificationCenter)

如果你希望和Windows的SendMessage逻辑更接近,直接用系统级的通知机制,可以用Mac的分布式通知,需要用Objective-C++混编实现:

  • 首先将用到该逻辑的实现文件后缀从.cpp改为.mm,开启Xcode的ObjC++编译支持
  • 应用A注册监听自定义通知,示例代码:
// 应用A 注册通知(放在初始化逻辑中)
[[NSDistributedNotificationCenter defaultCenter] addObserverForName:@"com.yourcompany.dataprocess.finished"
    object:nil
    queue:[NSOperationQueue mainQueue]
    usingBlock:^(NSNotification *note) {
        // 收到通知后触发Qt的槽函数
        NSDictionary *userInfo = note.userInfo;
        NSString *filePath = userInfo[@"result_path"];
        emit yourQtObj->dataProcessFinished(QString::fromNSString(filePath));
    }];
  • 应用B处理完数据后发送通知:
// 应用B 发送通知逻辑
NSDictionary *userInfo = @{@"result_path": @"/path/to/result/file"};
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"com.yourcompany.dataprocess.finished"
    object:nil
    userInfo:userInfo
    deliverImmediately:YES];

注意:如果应用开启了App Sandbox,分布式通知仅支持同开发团队签名的应用之间传递,且不可传递敏感数据。

方案3:QSharedMemory + QSystemSemaphore 同步

如果你们已经用了共享内存存储结果,可以配合系统信号量实现主动通知,不需要额外的通信链路:

  • 提前创建一个全局的QSystemSemaphore,初始值为0
  • 应用B处理完数据写入共享内存后,调用semaphore.release(1)
  • 应用A可以开一个独立线程调用semaphore.acquire(),阻塞等待信号,收到信号后直接读取共享内存数据即可

内容的提问来源于stack exchange,提问作者Defisher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:45:04