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
相关产品推荐
相关产品推荐

