<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; sichuanpb</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/sichuanpb/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Sat, 26 May 2012 06:34:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>VC 多线程中控制界面控件的几种方法</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/11/30/vc-3/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/11/30/vc-3/#comments</comments>
		<pubDate>Tue, 30 Nov 2010 08:08:06 +0000</pubDate>
		<dc:creator>sichuanpb</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/11/30/vc-3/</guid>
		<description><![CDATA[  为了保证界面的用户体验经常要把数据处理等放到子线程中进行，然后把结果更新到主界面，通常有这样几种方法。 1. 启动线程时把控件关联变量的指针传参给线程函数，这种方法无疑是最简单的方法，但极容易造成访问异常，因为VC6中的控件都不是线程安全的。 2. 就是先进一点的方法，把控件的句柄传给线程函数，有时也不好用在子线程中通过SendNotifyMessage or PostMessage等进行操作。这种方法是线程安全的，但对许多未公开控件你根本不知道要发送什么消息的，比如绝大多数的ActiveX控件，像MSFLEXGRID、DBGRID,它们的消息ID是无从知晓的，这种时候第二种方法就没用了。 3. 这种方法我感觉是最万能的方法了，而且这样代码的逻辑也最清楚。就是在窗口类中针对线程要进行的操作自定义消息，启动线程时直接把窗口的句柄传给线程函数，线程要控制界面时直接给窗口发消息就可以了。窗口类中对自定义消息添加消息映射，在其中进行具体的控制操作。 自定义消息： VC自定义消息的方法VC文章 2010-07-11 16:02:54 阅读2785 评论0 字号：大中小 第一步：定义消息。 #define WM_MY_MESSAGE (WM_USER+100) 第二步：实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT LRESULT Dlg::OnMyMsg(WPARAM wParam, LPARAM lParam) { return 0; } 第三步：在类头文件的AFX_MSG块中说明消息处理函数。 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg LRESULT OnMyMsg(WPARAM, LPARAM); //复制这里 DECLARE_MESSAGE_MAP() 第四步：在用户类的消息块中，使用ON_MESSAGE宏指令将消息映射到消息处理函数中。 BEGIN_MESSAGE_MAP(C自动填表Dlg, [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>为了保证界面的用户体验经常要把数据处理等放到子线程中进行，然后把结果更新到主界面，通常有这样几种方法。</p>
<p>1. 启动线程时把控件关联变量的指针传参给线程函数，这种方法无疑是最简单的方法，但极容易造成访问异常，因为VC6中的控件都不是线程安全的。</p>
<p>2. 就是先进一点的方法，把控件的句柄传给线程函数，有时也不好用在子线程中通过SendNotifyMessage or PostMessage等进行操作。这种方法是线程安全的，但对许多未公开控件你根本不知道要发送什么消息的，比如绝大多数的ActiveX控件，像MSFLEXGRID、DBGRID,它们的消息ID是无从知晓的，这种时候第二种方法就没用了。</p>
<p>3. 这种方法我感觉是最万能的方法了，而且这样代码的逻辑也最清楚。就是在窗口类中针对线程要进行的操作自定义消息，启动线程时直接把窗口的句柄传给线程函数，线程要控制界面时直接给窗口发消息就可以了。窗口类中对自定义消息添加消息映射，在其中进行具体的控制操作。</p>
<p>自定义消息：</p>
<p>VC自定义消息的方法VC文章 2010-07-11 16:02:54 阅读2785 评论0 字号：大中小<br />
第一步：定义消息。</p>
<p>#define WM_MY_MESSAGE (WM_USER+100)</p>
<p>第二步：实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT</p>
<p>LRESULT Dlg::OnMyMsg(WPARAM wParam, LPARAM lParam)<br />
{</p>
<p>return 0;</p>
<p>}</p>
<p>第三步：在类头文件的AFX_MSG块中说明消息处理函数。</p>
<p>virtual BOOL OnInitDialog();<br />
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);<br />
afx_msg void OnPaint();<br />
afx_msg HCURSOR OnQueryDragIcon();<br />
afx_msg LRESULT OnMyMsg(WPARAM, LPARAM); //复制这里</p>
<p>DECLARE_MESSAGE_MAP()</p>
<p>第四步：在用户类的消息块中，使用ON_MESSAGE宏指令将消息映射到消息处理函数中。</p>
<p>BEGIN_MESSAGE_MAP(C自动填表Dlg, CDialog)<br />
ON_WM_SYSCOMMAND()<br />
ON_WM_PAINT()<br />
ON_WM_QUERYDRAGICON()<br />
ON_MESSAGE(WM_MY_MESSAGE, OnMyMsg) //复制这里</p>
<p>//}}AFX_MSG_MAP<br />
END_MESSAGE_MAP()</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/11/30/vc-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

