代码之家  ›  专栏  ›  技术社区  ›  badpanda

让线程等待Windows窗体响应?

  •  1
  • badpanda  · 技术社区  · 15 年前

    我有一个Windows窗体应用程序,它同时运行两个线程,而UI线程在任务栏中运行。UI线程实际上执行了与其他进程完全分离的功能,但是在新用户登录到应用程序的情况下,我需要从非UI线程弹出一个设置窗口。

    以下是my program.cs中的代码:

    static void Main()
        {
            ThreadStart start = new ThreadStart(Waiting.wait);
            Thread waiting = new Thread(start);
            waiting.Start();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(true);
            Application.Run(TaskBarIcon.getInstance());
        }
    

    目前,在TaskbarIcon完全实例化之前,必须在等待线程中完成一个配置方法的运行。这是通过来回传递锁来实现的。 我希望在处理配置方法时弹出此设置菜单,并让该方法等待完成,直到设置菜单完成运行。但是,除非我直接从application.run()方法运行设置菜单,否则我甚至无法让菜单正确显示。

    我对C语言很陌生……在Java中能够快速完成这一点,但是C.C似乎做了不同的事情。

    如有任何建议或解决方案,我们将不胜感激!

    大熊猫

    1 回复  |  直到 15 年前
        1
  •  1
  •   Brian Gideon    15 年前

    我怀疑发生的情况是设置菜单窗体没有在工作线程上接收到Windows消息,这就是它没有显示的原因。所有窗体和控件都需要消息泵才能正常工作。启动消息泵有多种不同的方法,但最适用于您的两种方法是:

    • 应用程序运行
    • 显示对话框

    如果你打电话 ShowDialog 在设置菜单窗体上,它应该显示在工作线程上。当然,调用会一直阻塞,直到表单关闭,这样会阻止配置方法的其余部分执行,但这可能正是您想要的。

    如果需要主UI线程(调用 Application.Run )要等待此配置方法完成,请使用 WaitHandle 当配置任务完成时发出信号。可能如下所示。

    static void Main() 
    { 
      var configured = new ManualResetEvent(false);
      var worker = new Thread(
        () =>
        {
           // Do some stuff here.
    
           CallYourConfigurationMethod();
           configured.Set() // Signal that configuration is complete.
    
           // Do some more stuff here.
        });
      worker.Start(); 
      configured.WaitOne();
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(true); 
      Application.Run(TaskBarIcon.getInstance()); 
    }