gpt4 book ai didi

c++ - Objective-C block 、C++ 变量和异步代码

转载 作者:行者123 更新时间:2023-11-30 04:30:57 27 4
gpt4 key购买 nike

我在将 C++ 变量与 iOS 上的 obj-c 异步代码粘合在一起时遇到问题。

真正的问题出在异步代码中,我正在使用 C++ 中构建的第三方库,它们需要对象引用,例如:


- (void) processFrame:(cv::Mat &)mat;

我的问题真正的问题是如何调用它?我需要在不同的线程上创建 c++ 对象并将其传递给异步代码,有点像这样:


__block cv::Mat mat(videoRect.size.height, videoRect.size.width, CV_8UC4, baseaddress, 0);
dispatch_async(dispatch_get_main_queue(), ^{
[self processFrame:mat];
});

这给出了一个错误(错误的访问),问题是(我猜)对象在方法运行之前被销毁了,所以我尝试在堆中创建对象:


__block cv::Mat *mat= new cv::Mat(videoRect.size.height, videoRect.size.width, CV_8UC4, baseaddress, 0);
dispatch_async(dispatch_get_main_queue(), ^{
[self processFrame:(*mat)];
});

还有:


__block cv::Mat *mat= new cv::Mat(videoRect.size.height, videoRect.size.width, CV_8UC4, baseaddress, 0);
dispatch_async(dispatch_get_main_queue(), ^{
[self processFrame:mat];
});

我一直保持“访问错误”错误

有什么想法吗?

最佳答案

__block 限定符告诉编译器不要复制 block 的对象,这就是它失败的原因。如果您没有重新分配 mat 或没有试图阻止不必要的保留/复制操作,那么您应该删除 __block

cv::Mat mat(videoRect.size.height, videoRect.size.width, CV_8UC4, baseaddress, 0);
dispatch_async(dispatch_get_main_queue(), ^{
[self processFrame:mat];
});

您创建 new cv::Mat 的示例可能会失败,因为您可能过早删除了 mat

__block cv::Mat *mat= new cv::Mat(videoRect.size.height, videoRect.size.width, CV_8UC4, baseaddress, 0);
dispatch_async(dispatch_get_main_queue(), ^{
[self processFrame:mat];
//mat would need to be deleted here
});
delete mat; //If you are doing this, you will likely get an EXC_BAD_ACCESS

关于c++ - Objective-C block 、C++ 变量和异步代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8420491/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com