У меня проблемы. Я пытаюсь эмулировать вызов Application.Run с помощью Application.DoEvents ... это звучит плохо, и затем я принимаю также альтернативные решения моего вопроса ...
Я должен обработать обработчик сообщений, как 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. Мне нужно синхронизировать все потоки ядра, используя барьер, и это прекрасно работает.
Конечно, мне нужно обрабатывать сообщения формы в основном потоке (основной подпрограмме) для каждой созданной формы, и я действительно вызываю Application.DoEvents () для выполнения этой работы.
Теперь мне нужно изменить приведенный выше фрагмент, чтобы он имел общую форму (простое диалоговое окно) без использования 100% ресурсов ЦП, вызывающих Application.DoEvents (), как это делает Application.Run.
Цель должна состоять в том, чтобы фрагмент выше обрабатывал сообщения при поступлении, и создавал рендеринг (снятие барьера) только при необходимости, не пытаясь получить максимальный FPS; должна быть возможность переключиться на строгий цикл для максимально возможного рендеринга.
Как это могло быть возможно?
Примечание: приведенный выше фрагмент кода должен выполняться в процедуре Main, поскольку контекст OpenGL создается в главном потоке. Перемещение фрагмента в отдельном потоке и вызов Application.Run довольно нестабильно и глючит ...