我遇到的问题很可能与线程或互斥有关:
当我直接在main方法中调用自定义方法时,它会起作用并产生结果。但是,计算需要大约900毫秒。所以我想创建一个只执行此计算的单个线程,然后显示结果。
此时项目非常大,我尝试给出与原始代码尽可能接近的伪代码。
更多背景信息:我从相机流式传输深度图像,并希望在此图像上使用细化算法。使用OpenCV 3.1.0和MSVC 2015(全32位)。
int main()
{
//init camera, read images etc...
Mat copyOfImage = dephtImage->clone();
applyThreadedThinning(©OfImage);
return 0;
}
此版本正常。 如果我这样称呼方法:
std::thread t1(&applyThreadedThinning,©OfImage);
它说 “调试错误!
节目:.... * .exe
abort()被称为
(按重试调试应用程序)“
我无法想象为什么它没有一个线程就可以工作,但是一个线程却没有。 调试有点复杂,我只是按“步入”跟随每一行,并等到它发出此错误消息。一旦我隔离了导致此错误的代码行,我该怎么办?
答案 0 :(得分:1)
一个c ++ std :: thread对象需要知道它应该做什么,以防它被销毁(超出范围)。
有两个选项:detach
等待线程完成或t1.join()
从对象中分离线程。
因为两个选项都是有效的,所以决定在破坏std :: thread对象而不首先调用其中一个函数时,它们都不会隐含在破坏上并且抛出assert(abort)。 / p>
如果你想在对象超出范围之前等待线程完成调用t1.detach()
。
如果你想让自己脱离线程并让它在某些时候完成,你就不在乎在对象超出范围之前调用public interface IA<T> {
void someMethod(T);
}
public interface IB<T> {
T anotherMethod();
}
class AImpl<T extends IB<SomeGenericTypeIWantToUse>> implements IA<T> {
ISomeModule<SomeGenericTypeIWantToUse> module;
public void someMethod(T param) {
SomeGenericTypeIWantToUse myVariable = param.anotherMethod();
module.digest(myVariable);
}
}
public interface ISomeModule<T> {
void digest(T value);
}
public class SomeModuleImpl<T> implements ISomeModule<T> {
public void digest(T value) {
//...do something...
}
}
。
答案 1 :(得分:0)
您应该在主函数中等待,直到线程结束。
...
t1.join();
return 0;
答案 2 :(得分:0)
解决了abort()问题。这个问题似乎与范围/智能指针有关。只需用cv :: Mat(无指针)替换每个cv :: Mat *,并根据更改的类型调整代码。
对我来说这是一个解决方案。感谢@Hayt的解释,它确实加快了我的进程。