析构函数bug修复

This commit is contained in:
Leo 2025-10-24 19:16:07 +08:00
parent 92fe7b1345
commit 267ce3a326

View File

@ -24,7 +24,41 @@ CamHandler::~CamHandler()
{
// 确保在销毁对象时清理资源
if (mStream) {
stopAcquisition(); // 确保流和缓冲区已清理
if (!mDevice || !mStream)
return;
// 1. 停止计时器
if (mAcquireTimer.isActive()) {
mAcquireTimer.stop();
// emit logMsg("Acquisition timer stopped.");
}
// 2. 获取 AcquisitionStop 命令
PvGenParameterArray *lDeviceParams = mDevice->GetParameters();
PvGenCommand *lStop = dynamic_cast<PvGenCommand *>(lDeviceParams->Get("AcquisitionStop"));
// 3. 停止采集和禁用流
if (lStop != nullptr) {
// emit logMsg("Sending AcquisitionStop command to the device");
lStop->Execute();
}
// emit logMsg("Disable streaming on the controller.");
mDevice->StreamDisable();
// 4. 清理缓冲区:终止队列中的所有缓冲区并将它们移到输出队列
// emit logMsg("Aborting buffers still in stream");
mStream->AbortQueuedBuffers();
// 5. 从输出队列中检索剩余的缓冲区,丢弃它们
PvBuffer *lBuffer = NULL;
PvResult lOperationResult;
// 必须清空队列,防止下次采集时使用错误的旧缓冲区
while (mStream->GetQueuedBufferCount() > 0) {
mStream->RetrieveBuffer(&lBuffer, &lOperationResult);
// 注意:这里没有释放 lBuffer因为缓冲区资源将在析构或断开时处理
}
// emit logMsg("Acquisition stopped and buffers cleaned up.");
mStream->Close();
PvStream::Free(mStream);
mStream = nullptr;