首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有可能“分离”多个GUI线程吗?(不是在Application.Run停止系统)

有可能“分离”多个GUI线程吗?(不是在Application.Run停止系统)
EN

Stack Overflow用户
提问于 2008-08-05 21:19:37
回答 3查看 1.4K关注 0票数 26

My Goal

我希望有一个主处理线程(非GUI),并能够根据需要在它们自己的后台线程中剥离GUI,并让我的主非GUI线程继续工作。换句话说,我希望我的主非GUI线程成为GUI线程的所有者,而不是相反。我不确定这在Windows窗体(?)中是否可行。

背景

我有一个基于组件的系统,其中控制器动态加载程序集,并实例化和运行使用单个方法DoStuff()实现公共IComponent接口的类。

加载的组件是通过xml配置文件和添加包含不同IComponent实现的新程序集来配置的。组件向主应用程序提供实用程序功能。当主程序在做它自己的事情时,例如控制一座核电站,组件可能正在执行实用任务(在它们自己的线程中),例如清理数据库、发送电子邮件、在打印机上打印滑稽笑话等等。我想要的是,有这些组件之一能够显示图形用户界面,例如与所述电子邮件发送组件的状态信息。

整个系统的生命周期如下所示

  1. 应用程序启动。
  2. 检查要加载的组件的配置文件。加载每个组件,运行them.
  3. For DoStuff() 来初始化它,并让它在自己的threads.
  4. Continue中过自己的生活,永远做主要的应用程序工作。

如果组件在DoStuff()中触发图形用户界面,我还无法成功执行第3点。它只是简单地暂停,直到GUI关闭。直到GUI关闭,程序才前进到第4点。

如果允许这些组件启动自己的Windows窗体GUI,那就太好了。

Problem

当组件试图在DoStuff()中启动图形用户界面时(确切的代码行是在组件运行Application.Run(theForm)时),该组件以及我们的系统在Application.Run()行“挂起”,直到图形用户界面关闭。嗯,正如预期的那样,刚刚启动的GUI工作得很好。

组件示例。一个与图形用户界面没有任何关系,而第二个则打开了一个可爱的窗口,里面有粉红色的毛绒绒的小兔子。

代码语言:javascript
复制
public class MyComponent1: IComponent
{
    public string DoStuff(...) { // write something to the database  }
}

public class MyComponent2: IComponent
{
    public void DoStuff()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form());

        // I want the thread to immediately return after the GUI 
        // is fired up, so that my main thread can continue to work.
    }
}

我已经试过了,但没有成功。即使当我试图在它自己的线程中启动GUI时,执行也会暂停,直到GUI关闭。

代码语言:javascript
复制
public void DoStuff()
{
    new Thread(ThreadedInitialize).Start()
}

private void ThreadedInitialize()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form());
}

是否可以关闭图形用户界面并在Application.Run()之后返回

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-08-05 21:45:18

Application.Run方法显示一个(或多个)表单,并启动标准消息循环,该循环一直运行到所有表单关闭。您不能强制从该方法返回,除非关闭所有窗体或强制关闭应用程序。

但是,您可以向Application.Run方法传递一个ApplicationContext (安装新表单()),并且可以使用ApplicationContext一次启动多个表单。只有当所有这些都关闭时,您的应用程序才会结束。查看此处:http://msdn.microsoft.com/en-us/library/system.windows.forms.application.run.aspx

此外,您以非模态方式显示的任何窗体都将继续与您的主窗体一起运行,这将使您可以拥有多个相互不会阻塞的窗口。我相信这实际上就是你想要实现的。

票数 13
EN

Stack Overflow用户

发布于 2008-08-05 23:22:01

我确信这是可能的,如果你足够努力的话,但我建议这不是一个好主意。

‘'Windows’(你在屏幕上看到的)与进程高度耦合。也就是说,每个显示任何GUI的进程都应该有一个消息循环,该循环处理与创建和管理窗口相关的所有消息(如“单击按钮”、“关闭应用程序”、“重画屏幕”等)。

因此,我们或多或少地假定,如果您有任何消息循环,那么它必须在您的流程的生命周期中可用。例如,windows可能会向你发送一条“退出”消息,你需要有一个消息循环来处理它,即使你的屏幕上什么都没有。

你最好的办法是这样做:

制作一个从未显示的假表单,这是你的‘主应用’,启动,调用Application.Run并传递这个假表单。在另一个线程中做你的工作,当你需要做Gui的事情时,在主线程上触发事件。

票数 0
EN

Stack Overflow用户

发布于 2009-05-23 21:57:11

我不确定这是否正确,但我记得在控制台应用程序中运行window窗体时,只需新建窗体并在其上调用newForm.Show(),如果您的组件使用它而不是Application.Run(),那么新窗体就不会阻塞。

当然,组件将负责维护对其创建的窗体的引用

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档