积极答复者
C#中有没有C++中的用户界面线程,是什么?谢谢!

问题
答案
-
有啊,对于Windows 应用程序来说,界面线程通常意义上就是一个进程中的0号线程。 也就是第一个被创建、运行的那个线程。
打开你应用程序的Program.cs 文件,里面应该有一个Main 函数,运行这个Main 函数的那个线程一般就是界面线程。通常里面都有一行代码:
Application.Run(new Form1());
这一行代码首先会在内存中new 一个Form1 类型的窗体,然后显示它。最后进入一个消息循环,等待用户发送消息。Form1 的InitializeComponents 函数中就含有创建界面控件的代码,因此这些控件也就自然地运行在界面线程中了。 除此以外显示、隐式创建的线程都不是界面线程了。
- 已建议为答案 mazhou 2010年3月30日 8:35
- 已标记为答案 mldarkMember 2010年4月3日 14:56
-
Windows 的控件遵循谁创建谁使用的原则。主要是因为控件都是由窗体构成的,而窗体资源是用Handle 来表示的。Handle 这个东东无法跨线程来操作和使用(虽然有时候你那么做了,但是是极不安全的)。 跨线程操作Handle 一般都需要用Windows API DuplicateHandle 生成出另外一个Handle 来标识同一个对象,给当前线程使用。因为这些可见的控件都是由0号线程创建出来的,因此,只有0号线程才可以操纵他们。
原则上说,一个后台线程偷偷地创建了一个控件,并不在UI上显示,而且这个控件仅被这个后台线程所使用,应该也是安全的。但这么做没啥意义。
- 已建议为答案 mazhou 2010年3月31日 9:57
- 已标记为答案 mldarkMember 2010年4月3日 14:56
-
C#所用的一系列API被称为winform,所有的GUI控件都继承于System.Windows.Form.Control 类。
Control类已经封装好了消息队列。你可以看这个函数:
protected virtual void WndProc( ref Message m )
这个消息队列是在主线程上被执行的,也就是你所说的用户界面线程。
举个很简单的例子,创建一个button,然后button_click事件里面 Sleep 个 10 秒。当用户按那个 button 的时候,整个用户界面会失去响应的。也就是,button_click那个消息是被放在了主线程或者用户界面线程上被执行的。
MCPD (Windows & Web)- 已标记为答案 mldarkMember 2010年4月3日 14:57
全部回复
-
Hi,
-
感觉不是,BackgroundWorker好像没有消息队列,不能异步调用。
-
有啊,对于Windows 应用程序来说,界面线程通常意义上就是一个进程中的0号线程。 也就是第一个被创建、运行的那个线程。
打开你应用程序的Program.cs 文件,里面应该有一个Main 函数,运行这个Main 函数的那个线程一般就是界面线程。通常里面都有一行代码:
Application.Run(new Form1());
这一行代码首先会在内存中new 一个Form1 类型的窗体,然后显示它。最后进入一个消息循环,等待用户发送消息。Form1 的InitializeComponents 函数中就含有创建界面控件的代码,因此这些控件也就自然地运行在界面线程中了。 除此以外显示、隐式创建的线程都不是界面线程了。
- 已建议为答案 mazhou 2010年3月30日 8:35
- 已标记为答案 mldarkMember 2010年4月3日 14:56
-
Windows 的控件遵循谁创建谁使用的原则。主要是因为控件都是由窗体构成的,而窗体资源是用Handle 来表示的。Handle 这个东东无法跨线程来操作和使用(虽然有时候你那么做了,但是是极不安全的)。 跨线程操作Handle 一般都需要用Windows API DuplicateHandle 生成出另外一个Handle 来标识同一个对象,给当前线程使用。因为这些可见的控件都是由0号线程创建出来的,因此,只有0号线程才可以操纵他们。
原则上说,一个后台线程偷偷地创建了一个控件,并不在UI上显示,而且这个控件仅被这个后台线程所使用,应该也是安全的。但这么做没啥意义。
- 已建议为答案 mazhou 2010年3月31日 9:57
- 已标记为答案 mldarkMember 2010年4月3日 14:56
-
C#所用的一系列API被称为winform,所有的GUI控件都继承于System.Windows.Form.Control 类。
Control类已经封装好了消息队列。你可以看这个函数:
protected virtual void WndProc( ref Message m )
这个消息队列是在主线程上被执行的,也就是你所说的用户界面线程。
举个很简单的例子,创建一个button,然后button_click事件里面 Sleep 个 10 秒。当用户按那个 button 的时候,整个用户界面会失去响应的。也就是,button_click那个消息是被放在了主线程或者用户界面线程上被执行的。
MCPD (Windows & Web)- 已标记为答案 mldarkMember 2010年4月3日 14:57