我正在使用点云查看器,而我的设计基于两个线程
所以我的代码看起来像这样:
std::shared_ptr<PointCloud> pointcloud;
CRITICAL_SECTION updateLock;
void FirstThreadProc()
{
while(true)
{
/* some algorithm processes point cloud, takes time */
EnterCriticalSection(&updateLock);
pointcloud->Update(data,length,...); //also takes time to copy and process
LeaveCriticalSection(&updateLock);
}
}
/*...*/
std::shared_ptr<D3DRenderer> renderer;
void SecondThreadProc()
{
MSG msg = { 0 };
while (WM_QUIT != msg.message)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
EnterCriticalSection(&updateLock);
renderer->Render(pointcloud);
LeaveCriticalSection(&updateLock);
}
}
}
我认为第二个线程比第一个线程更快,所以当第一个线程进入临界区时,第二个线程被阻塞,因此渲染器窗口应该立即冻结。但我现在观察到的是渲染器窗口运行非常平滑,相机旋转或放大/缩小,都很好,但第一个线程非常不稳定,其fps范围从10 fps到1 fps。 / p>
我正在考虑两点云缓冲区,然后第一个线程在临界区外部更新第二个缓冲区,然后在临界区内交换两个缓冲区。它会起作用吗?
答案 0 :(得分:0)
如this中所述,CRITICAL_SECTION不提供先进先出(FIFO)排序。因为第二个线程比第一个线程更快,并且它的整个循环是关键部分,它将在离开之后立即进入临界区。这可能总是在关键部分,并保留第一部分。
我的解决方案是将第二个线程的更多工作放在临界区之外,然后它可以正常工作。