我遇到麻烦了。我正在尝试使用 Application.DoEvents 模拟调用 Application.Run ...这听起来很糟糕,然后我也接受了我的问题的替代解决方案...
我必须像 Application.Run 那样处理消息泵,但我需要在消息处理之前和之后执行代码。这是主要的重要代码片段。
// Create barrier (multiple kernels synchronization)
sKernelBarrier = new KernelBarrier(sKernels.Count);
foreach (RenderKernel k in sKernels) {
// Create rendering contexts (one for each kernel)
k.CreateRenderContext();
// Start render kernel kernels
k.mThread = new Thread(RenderKernelMain);
k.mThread.Start(k);
}
while (sKernelBarrier.KernelCount > 0) {
// Wait untill all kernel loops has finished
sKernelBarrier.WaitKernelBarrier();
// Do application events
Application.DoEvents();
// Execute shared context services
foreach (RenderKernelContextService s in sContextServices)
s.Execute(sSharedContext);
// Next kernel render loop
sKernelBarrier.ReleaseKernelBarrier();
}
这段代码由 Main 例程执行。实际上,我有一个内核类列表,它们在单独的线程中运行,这些线程处理用于在 OpenGL 中呈现的表单。我需要使用屏障来同步所有内核线程,这非常有效。当然,对于创建的每个 Form,我需要在主线程(Main 例程)中处理 Form 消息,实际上我调用 Application.DoEvents() 来完成这项工作。
现在我必须修改上面的代码片段以获得一个通用的表单(简单对话框),而不会像 Application.Run 那样消耗 100% 的 CPU 调用 Application.DoEvents()。
目标应该是让上面的代码片段在到达时处理消息,并仅在必要时发出渲染(释放屏障),而不是试图获得最大 FPS;应该有可能切换到严格循环以尽可能多地渲染。
怎么可能?
注意:上面的代码片段必须在 Main 例程中执行,因为 OpenGL 上下文是在主线程上创建的。在单独的线程中移动代码段并调用 Application.Run 非常不稳定和错误......