【发布时间】:2010-03-30 17:35:36
【问题描述】:
我遇到了麻烦。我正在尝试使用 Application.DoEvents 模拟调用 Application.Run...这听起来很糟糕,然后我也接受了我的问题的替代解决方案...
我必须像 Application.Run 那样处理消息泵,但我需要在消息处理之前和之后执行代码。这是主要的重要sn-p代码。
// 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 中呈现的表单。我需要使用屏障来同步所有内核线程,这非常有效。 当然,我需要在主线程(Main 例程)中处理 Form 消息,对于创建的每个 Form,我确实调用 Application.DoEvents() 来完成这项工作。
现在我必须修改上面的 sn-p 以获得一个通用的表单(简单对话框),而不像 Application.Run 那样消耗 100% 的 CPU 调用 Application.DoEvents()。
目标应该是让上面的sn-p在消息到达时处理,只在必要时发出渲染(释放屏障),而不是试图获得最大FPS;应该有可能切换到严格循环以尽可能多地渲染。
这怎么可能?
注意:上面的 sn-p 必须在 Main 例程中执行,因为 OpenGL 上下文是在主线程上创建的。在单独的线程中移动 sn-p 并调用 Application.Run 是非常不稳定和错误的......
【问题讨论】:
标签: c# forms opengl message-pump