Joh*_*Doe 0 c# multithreading winforms
我想paralelize建立在Windows窗体顶部的3D体素编辑器,它采用了raycaster来呈现这样将屏幕并获得在池中的每个线程渲染它的一部分应该是微不足道的.
问题出现在Windows窗体的线程必须作为STA运行 - 我可以让其他线程启动并完成工作但在等待它们完成时阻塞主线程导致奇怪的随机死锁如预期的那样.
保持主线程不被阻塞也是一个问题 - 例如,如果用户使用填充工具,则在渲染过程中将处理输入,这将导致"中间"图像(例如,部分着色的对象).在每帧之前复制整个图像是不可行的,因为如果必须每帧复制,则卷足够大以抵消任何性能增益.
我想知道是否有任何解决方法可以让amin线程以不会被实际阻止的方式阻止用户,但会将输入处理延迟到下一帧.
如果不可能,有没有更好的设计来处理这个?
编辑:阅读原文我认为我不清楚raycaster是否实时运行,因此显示进度对话框根本不起作用.不幸的是,帧之间的输入FPS足够低(5-40取决于各种因素)以产生不希望的结果.
我已经尝试实现它阻止UI线程并使用ThreadPool的一些线程进行处理,除了STA的这个问题之外它工作正常.
这是一个常见问题.使用Windows窗体,您只能有一个UI线程.不要在UI线程上运行算法,因为UI会显示为冻结.
我建议在更新UI之前运行算法并等待它完成.一个名为BackgroundWorkerpre-built的类来做这件事.
编辑:
关于UI线程的另一个事实是它处理所有鼠标和键盘事件,以及发送到窗口的系统消息.(Winforms实际上只是Win32,周围有一个很好的API.)如果UI线程已经饱和,你就无法拥有一个稳定的应用程序.
另一方面,如果您启动其他几个线程并尝试使用它们直接在屏幕上绘制,则可能存在两个问题:
请注意,您(和我)在测量之前不应该声明性能问题. 你可以尝试在内存中绘制一个框架并在适当的时候交换它.它被称为双缓冲,在Win32绘图代码中非常常见,以避免屏幕闪烁.
老实说,我不知道这对你的目标帧速率是否可行,或者你是否应该考虑更像OpenGL的图形中心库.