2011-03-29 81 views
2

我有我使用form.showDialog()显示的窗体,并在主窗体中我有一个线程,每隔x秒发送一条消息。我注意到,当我在窗口中打开使用ShowDialog打开的新窗体时,该线程无法运行。即使使用ShowDialog,我如何使它继续运行?当使用form.ShowDialog()在mainform中的线程不起作用

代码:

codeshowAllScriptsWindow window = new showAllScriptsWindow(this); 
window.Show(); 

,并在MainForm中我有不断发送邮件,但因为这个的ShowDialog的停止的线程。请注意,当我使用show()时,它不会发生。

+3

您可能需要阅读某些代码。 – 2011-03-29 20:03:18

+0

'code'showAllScriptsWindow window = new showAllScriptsWindow(this); window.Show();'code' \ b并在mainform中我有一个线程继续发送消息,但因为showdialog而停止 - 而不是当我使用show()时它不会发生。 – 2011-03-29 20:26:40

回答

4

ShowDialog()是一个阻塞调用。线程实际运行时,它正忙于为对话框抽取消息循环。这与程序主线上发生的情况没有什么不同。

这样做是非常不明智的,对话框与您应用程序中其他窗口没有Z顺序关系。一个经典的不幸是,它可能会消失在另一个窗口的后面,但用户找不到它的好方法。改用Control.BeginInvoke在UI线程上创建对话框。这也确保你的线程保持'运行'。

1

虽然乍一看似乎不相关,但您可以看看这question。你遇到的问题是form.showDialog()调用创建一个模态对话框,停止该线程上的代码进度。如果旋转另一个线程并在那里触发该呼叫,则在对话框显示时,第一个线程将继续运行。

0

使用System.Threading.Timer不是System.Windows.Form.Timer。

+0

模式消息泵正在渲染计时器的选择有点不相关。 – 2011-03-29 20:11:53

+0

使用SWF计时器使用消息泵。但是,使用System.Threading Timer时,不使用泵,因此Model对话框不会阻止事件发生。 – 2011-03-29 20:14:45

+0

够公平,经验教训。我习惯于所有计时器都基于WM_TIMER的世界。 – 2011-03-29 20:20:04

2

消息泵被您所显示的模态对话框“盗取”。 你有2种选择:

  1. 不要使用模态对话框(使用formShow())
  2. 使用一个新的线程做的工作,并使用UI主线程。
相关问题