У меня проблемы. Я пытаюсь подражать вызову Application.Run с использованием Application.DoEvents ... это звучит плохо, а затем я принимаю также альтернативные решения по моему вопросу ...«Эмуляция» Application.Run using 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();
}
Этот фрагмент кода выполняется основной процедурой. Pratically У меня есть список классов ядра, который работает в отдельных потоках, эти потоки обрабатывают форму для рендеринга в OpenGL. Мне нужно синхронизировать все потоки ядра с помощью барьера, и это отлично работает. Конечно, мне нужно обрабатывать сообщения формы в основном потоке (основная процедура), для каждой созданной формы, и я действительно вызываю Application.DoEvents() для выполнения задания.
Теперь я должен изменить фрагмент выше, чтобы иметь общую форму (простое диалоговое окно), не потребляя 100% процессорного вызова Application.DoEvents(), как Application.Run.
Цель должна заключаться в том, чтобы при получении сообщения об ошибках над сообщениями рукоятки и выдавать рендеринг (освобождение барьера) только при необходимости, не пытаясь получить максимальный FPS; должна быть возможность переключиться на строгий цикл, чтобы отображать как можно больше.
Как это возможно?
Примечание: фрагмент выше должен быть выполнен в основной процедуре, так как контекст OpenGL создается в основном потоке. Перемещение фрагмента в отдельной ветке и вызов Application.Run довольно неустойчиво и багги ...
Яйцо Колумба. Спасибо. – Luca
Nitpicking and - dupid: Существует много дискуссий о 'Thread.Sleep (0)' vs 'Thread.Sleep (1)' down down .. –