适用对象:通过
fixSharedMemoryDll向 FIX 发送投影/体数据/图像处理请求的集成方
采集软件通过 fixSharedMemoryDll 把投影数据 + 重建配置发送给 FIX 做 CT 重建。
当一次发送的数据大小超过 FIX 端共享内存通道容量时,发送会同步失败。
典型案例:投影 2400 × 3040 × 360 × 2 字节 = 5009 MB,超过默认通道 1536 × 1536 × 768 × 2 字节 = 3456 MB,发送被拒绝。
必须正确处理这个失败,否则采集软件会卡死或崩溃。
所有异步发送 API(fsChannelSendProjectionAsync / fsChannelSendVolumeAsync /
fsChannelSendImageProcAsync)返回一个 uint32_t reqId:
| 返回值 | 含义 |
|---|---|
reqId == 0 |
发送失败。数据未进入共享内存,没有任何后续进度/完成回调可等,也没有结果可读。 |
reqId > 0 |
发送成功。这是本次请求的 id,用于关联后续的进度/完成回调。 |
FIX 源码
nextRequestId()保证有效 id 从非 0 开始(注释原文:「跳过 0,0 是异步 API 的失败标志」)。
uint32_t reqId = fsChannelSendProjectionAsync(
channel, projData, name, NULL, resultPath, reconJson,
width, height, depth, imageType, vx, vy, vz);
if (reqId == 0) {
// 发送失败 —— 不要再等完成回调,也不要去读结果内存!
const char* err = fsChannelGetLastError(channel);
// err 形如:
// "Volume data size (5009 MB) exceeds shared memory size (3456 MB). Increase shared memory configuration."
showErrorToUser(err); // 把错误提示给操作员
return; // 终止本次重建流程
}
// reqId > 0:发送成功,正常等待完成回调
最常见的崩溃原因:发送后不检查 reqId,直接进入「等待完成回调」或「读取结果」的逻辑。
失败时 reqId == 0,这条请求根本不存在——等待会永久阻塞,读结果会读到无效数据。
错误文本:
Volume data size (XXXX MB) exceeds shared memory size (YYYY MB). Increase shared memory configuration.
sd_EC_SharedMemoryX/Y/Z)调大到能容纳该数据,重启 FIX 后重试。reqId == 0 时把错误文本提示给操作员即可。fsChannelGetLastError 的有效范围异步发送 API 在同步失败时只通过返回值 reqId == 0 报告失败,不会派发完成回调。
所以请务必在每次发送后检查返回值,不要仅依赖完成回调——否则发送失败时会永久等待一个不会到来的回调(这正是本次崩溃的成因)。
fsChannelGetLastError(channel) 的有效范围:
reqId == 0 后立即读取,才保证返回本次失败原因(如"共享内存不足")。reqId == 0,但不保证设置错误串(这类属调用方明显的传参错误,自行检查即可)。reqId > 0)后不要再读 fsChannelGetLastError,它可能仍是上一次失败的旧值。