gpt4 book ai didi

c++ - 多核,使从函数内部调用的函数在第二个核上运行。直接秀,opencv

转载 作者:行者123 更新时间:2023-11-28 03:17:06 29 4
gpt4 key购买 nike

所以,我一直在使用 opencv 开发实时跟踪系统。几天前,我不得不开始使用 directshow(这对我来说是全新的),因为我需要网络摄像头的更高分辨率。分辨率越高,CPU 使用率就越高。仅使用没有任何 opencv 算法的 directshow 时,cpu 以 50% 的速度运行。 (我有双核 = 一个核的 100% 使用率)

所以现在我需要扩展这个系统,以便它使用我的两个核心。

我从微软找到了这个很好的例子并且能够运行它,使用我的两个核心:

void test1(){
parallel_invoke(
[]() { run1(); },
[]() { run2(); }
);
}

这运行完美,我能够使用大约 85% 的总 cpu(只有 2 个带有循环的函数)。现在我想在我的其他系统中使用它。而且我不知道该怎么做。

我的系统的简短描述:

int main(){
startDirectshow()
};

startDirectShow(){
//code for creating the directshow filter graph. including iSampleGrabber filter.
}

sampleCallBackFunction(....){
// function called for every frame in the graph
}

到目前为止一切正常,每一帧都会调用 sampleCB(或者至少每秒多帧,使用它时可能会丢失帧?!)

我的想法是让“sampleCallBackFunction()”在第二个内核上运行(我不想将它锁定到特定的内核,只使用第一个可用的内核)

但是我找到的示例从同一个地方同时启动两个函数。是否有可能以某种方式告诉系统“sampleCallBackFucntion”应该在另一个核心上运行?

我的另一个想法是将数据存储在“sampleCallBackFunction()”中,并将 bool“newFrameAvailable”设置为 true。并让另一个线程从全局数组中拉取数据。

while(true)
If (newFrameAvailable){
get-next-frame-in-buffer-and-do-opencv-algorithm();
}
else{
do-nothing();
}
}

所以。我的问题:如何从另一个函数内部调用一个函数(“sampleCallBackFunction”是从“startDirectshow”调用的)?

谢谢!

最佳答案

你的问题不是很清楚,但我想你想在另一个线程中调用 sampleCallbackFunction。 (函数通常在另一个函数内部调用,这使得调用堆栈...)

因为 DirectShow,您的 sampleCallBackFunction 很可能已经在与您的主线程不同的流式线程上运行。当然,流线程上发生的所有事情都是一个逻辑核心的负担。

然后,如果您在 sampleCallbackFunction 中创建另一个线程,您的系统足够智能,可以在可用核心上分配工作,这不是问题。但我怀疑 parallel_invoke 是否能让您灵活地做您必须做的事情,我建议您寻找 CreateThread 如果您真的想在那里创建另一个 worker。

顺便说一句:在 GUI 应用程序中,在另一个线程中调用函数的最简单方法是使用 SendMessage,因为调用总是分配给创建窗口的线程。尽管如此,那个电话还是被阻止了……

关于c++ - 多核,使从函数内部调用的函数在第二个核上运行。直接秀,opencv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16521075/

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