gpt4 book ai didi

c++ - 如何在我的主应用程序中加载一个 dll 会导致 100 个 CPU 负载?

转载 作者:行者123 更新时间:2023-12-03 06:52:25 25 4
gpt4 key购买 nike

我有一个完美的工作程序,它连接到摄像机(IDS uEye 摄像机)并不断从中抓取帧并显示它们。
但是,在连接到相机之前加载特定的 dll 时,程序会以 100% 的 CPU 负载运行。如果我在连接到相机后加载 dll,程序运行良好。

int main()
{
INT nRet = IS_NO_SUCCESS;
// init camera (open next available camera)
m_hCam = (HIDS)0;

// (A) Uncomment this for 100% CPU load:
// HMODULE handle = LoadLibrary(L"myInnocentDll.dll");

// This is the call to the 3rdparty camera vendor's library:
nRet = is_InitCamera(&m_hCam, 0);

// (B) Uncomment this instead of (A) and the CPU load won't change
// HMODULE handle = LoadLibrary(L"myInnocentDll.dll");

if (nRet == IS_SUCCESS)
{
/*
* Please note: I have removed all lines which are not necessary for the exploit.
* Therefore this is NOT a full example of how to properly initialize an IDS camera!
*/
is_GetSensorInfo(m_hCam, &m_sInfo);

GetMaxImageSize(m_hCam, &m_s32ImageWidth, &m_s32ImageHeight);

m_nColorMode = IS_CM_BGR8_PACKED;// IS_CM_BGRA8_PACKED;
m_nBitsPerPixel = 24; // 32;
nRet |= is_SetColorMode(m_hCam, m_nColorMode);

// allocate image memory.
if (is_AllocImageMem(m_hCam, m_s32ImageWidth, m_s32ImageHeight, m_nBitsPerPixel, &m_pcImageMemory, &m_lMemoryId) != IS_SUCCESS)
{
return 1;
}
else
{
is_SetImageMem(m_hCam, m_pcImageMemory, m_lMemoryId);
}
}
else
{
return 1;
}

std::thread([&]() {
while (true) {
is_FreezeVideo(m_hCam, IS_WAIT);
/*
* Usually, the image memory would now be grabbed via is_GetImageMem().
* but as it is not needed for the exploit, I removed it as well
*/
}
}).detach();

cv::waitKey(0);
}
独立于实际使用的相机驱动程序,加载 dll 以什么方式可以改变它的性能,占用所有可用 CPU 内核的 100%?使用 Visual Studio 诊断工具时,多余的 CPU 时间归因于“[External Call] SwitchToThread”,而不是 myInnocentDll。
在没有相机初始化的情况下只加载 dll 不会导致 100% 的 CPU 负载。
我首先想到的是 myInnocentDll.dll 中的一些静态初始化程序配置了一些线程行为,但我没有找到任何指向这个方向的东西。我应该在 myInnocentDll.dll 的代码中寻找哪些方面?

最佳答案

经过大量挖掘,我找到了答案,它本身既简单又令人沮丧:
是微软对的支持不好OpenMP .当我在我的项目中禁用 OpenMP 时,相机驱动程序运行得很好。
原因似乎是微软编译器使用OpenMP,忙等待,也有手动配置的可能OMP_WAIT_POLICY ,但由于我并不依赖 OpenMP,因此禁用对我来说是最简单的解决方案。

  • https://developercommunity.visualstudio.com/content/problem/589564/how-to-control-omp-wait-policy-for-openmp.html
  • https://support.microsoft.com/en-us/help/2689322/redistributable-package-fix-high-cpu-usage-when-you-run-a-visual-c-201

  • 我仍然不明白为什么 CPU 只在使用相机时升高,而不是在运行我的解决方案的其余部分时升高,即使相机库是预先构建的,并且我禁用/启用 OpenMP 编译对它没有任何影响.而且我也不明白为什么他们费心为 VS2010 做一个修补程序,但在 之前没有真正的修复程序。 VS2019 ,我正在使用。但问题是可以避免的。

    关于c++ - 如何在我的主应用程序中加载一个 dll 会导致 100 个 CPU 负载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63136777/

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