为窗体的嵌套控件创建多个消息循环

本文关键字:消息 循环 创建 控件 窗体 嵌套 | 更新日期: 2023-09-27 18:26:55

长话短说,我需要将一个WinForms Panel和一个在其上绘制的非托管类的实例放在一个单独的线程中,以保持主窗口的响应(SDK有时可能需要几秒钟的时间才能绘制出它将绘制的内容,并且在执行此操作时会阻塞UI线程)。我实际上需要很多(最多32个),但我们现在只讨论一个;这个概念应该能够根据需要重复多次。

我认为我需要做的是启动一个新的线程,它将"新建"一个Panel,然后启动一个不与任何特定内容绑定的ApplicationContext,并将其分配给Panel。然后,Panel类应该有一个Dispose()重载,它将结束ApplicationContext,关闭消息泵并终止线程。

我需要知道的是:

  • 可以将面板放置在IContainer中,或添加到任何父对象的Controls集合中吗?或者,这样做会导致进行非线程安全调用吗
  • 我在类上有一个静态工厂方法,它在新线程上创建新实例。我需要从该方法返回对该Panel(在后台线程中创建)的引用,以便使用它。有没有比在while/sleep循环中等待后台线程设置静态方法中本地定义的变量更好的方法
  • 我是否需要保留对拥有该小组的线程的引用
  • 我尝试这个是不是疯了

为窗体的嵌套控件创建多个消息循环

您不应该以这种方式处理这个问题。您应该让绘图线程绘制到内存中的图像,并让UI线程将这些图像渲染到面板。如果绘图线程为每次迭代生成一个新图像,则UI线程可以缓存该图像,并在每次有新图像可用时将其替换。以后您将省去很多麻烦,而不是试图篡夺预期的线程行为。