﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-春暖花开-文章分类-杂项学习</title><link>http://www.cppblog.com/SpringSnow/category/7661.html</link><description>雪化了，花开了，春天来了</description><language>zh-cn</language><lastBuildDate>Mon, 22 Jun 2009 04:13:36 GMT</lastBuildDate><pubDate>Mon, 22 Jun 2009 04:13:36 GMT</pubDate><ttl>60</ttl><item><title>转: COM组件简介</title><link>http://www.cppblog.com/SpringSnow/articles/88252.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Mon, 22 Jun 2009 01:51:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/88252.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/88252.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/88252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/88252.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/88252.html</trackback:ping><description><![CDATA[<div class=postTitle><a class=postTitle2 id=viewpost1_TitleUrl href="http://www.cppblog.com/3522021224/archive/2007/06/22/26803.html"><u><font color=#800080>COM组件简介</font></u></a> </div>
<div class=postText style="FONT-SIZE: 10pt">
<p>面向对象的思想难以适应这种分布式软件模型，于是组件化程序设计思想得到了迅速的发展。</p>
<p>按照组件化的程序设计的思想，复杂的应用程序被设计成一些小的，功能单一的组件模块，这些组件模块可以运行在同一台机器上，也可以运行在不同的机器上。</p>
<p>为了实现这样的应用软件，组建程序和组建程序之间需要一些极为细致的规范， 只有组件程序遵守了这些共同的规范，然间系统才能正常运行。</p>
<p>为此，OMG和Microsoft分别提出了CORBA(Common Object Request Breaker Architecture)和COM(Component Object model)标准，目前CORBA模型主要应用于UNIX操作系统平台上，而COM 则主要应用于Microsoft Windows操作系统平台上。 </p>
<p><br>在COM标准中，一个组件程序也被称为一个模块，它可以是一个动态连接库(DLL), 被称为进程内组件(in-of-process component)也可以是一个可执行程序(EXE)，被称为进程外组件(out-of-process component). </p>
<p><br>COM对象是建立在二进制可执行代码级的基础上，而C++等语言中的对象是建立在源代码级基础上的，因此COM对象是语言无关的。这一特性使用不同编程语言开发的组件对象进行交互成为可能。</p>
<p>在Microsoft Windows系统平台上，COM技术被应用于系统的各个层次，从底层的COM对象管理到上层的应用程序交互都用到了COM标准。 </p>
<p><br>概述</p>
<p>COM既提出了组件之间进行交互的规范，也提供了实现交互的环境， 因为组件对象之间交互的规范不依赖于任何特定的语言，所以COM也可以是不同语言协作开发的一种标准。 </p>
<p><br>OLE技术以COM规范为基础，OLE充分发挥了COM标准的优势，使Windows操作系统上的应用程序具有极强的可交互性。如果没有OLE的支持，Windows操作系统则会逊色很多。 </p>
<p><br>但是，COM规范并不局限于OLE技术，实际上，OLE技术只是COM的一个应用而已，这几年，OLE技术在进行网络互连是显示出了很大的局限性，而COM则表现出了极强的适应能力。 </p>
<p><br>COM标准包括规范和实现两大部分，规范部分定义了组件和组件之间通信的机制，这些规范不依赖于任何特定的语言和操作系统，只要按照该规范，任何语言都可以使用; COM标准的实现部分是COM库，COM库为COM规范的具体实现提供了一些核心服务。 </p>
<p><br>COM是面对对象的软件模型，因而对象是他的基本要素之一。类似于C++中对象的概念，对象是某个类(class)的一个实例;而类则是一组相关的数据和功能组和在一起的一个定义。使用对象的应用(或另一个对象)成为客户，有时也成为对象的用户。 </p>
<p><br>接口是一组逻辑上相关的函数集合，其函数也被称为接口成员函数。对象通过接口成员函数为客户提供各种形式的服务。 </p>
<p><br>在COM模型中，对象本身对于客户来说是不可见的，客户请求服务时，只能通过接口进行。每一个接口都由一个128位的全局唯一标识符(GUID,Globally Unique Identifier)来标识。客户通过GUID获得接口的指针，在通过接口指针，客户就可以调用其相应的成员函数。 </p>
<p><br>一般来说，接口是不变的，只要客户期望的接口在组建对象中还存在，它就可以继续使用该接口所提供的服务。对象可以支持多个接口，因此对组件对象的升级可通过增加接口的办法实现，这样得到的新接口可以不影响老接口的使用。 </p>
<p><br>客户如何来标识COM对象呢？与接口类似，每个对象也用一个128位GUID来标识，称为CLSID(class identifier,类标识符或类ID)，用CLSID标识对象可以保证(概率意义上)在全球范围内的唯一性。 </p>
<p><br>只要系统中含有这类COM对象的信息，并包括COM对象所在的模块文件(DLL或EXE文件)以及COM对象在代码中的入口点，客户程序就可以由此CLSID来创建COM对象。 </p>
<p><br>那么客户怎么使用COM对象所提供的服务呢？客户获得的又是什么呢？</p>
<p>实际上，客户成功创建对象后，它得到的是一个指向对象某个接口的指针，因为COM对象至少实现一个接口，所以客户就可以调用该接口提供的所有服务。 </p>
<p><br>但是COM对象可以有自己的状态，正是这种状态才使客户感觉到COM对象的存在。如果客户同时拥有两个相同CLSID的对象，则两个对象可以有不同的状态，客户完全不必关心COM对象是怎么实现的，以及两个对象的状态数据之间有什么关系(数组或者链表)。当然，COM对象也可以是无状态的，这种COM对象以提供功能服务为主，可以用来代替传统的API函数接口，使得应用程序编程接口更为有序，组织层次性更强。 </p>
<p><br>COM本身除了规范之外，也有实现的部分，其中包括一些核心的系统级代码，也正是这部分核心代码，才使得对象和客户之间可通过接口在二进制代码级进行交互 。</p>
<p>在Microsoft Windows操作系统环境下，这些库以.dll文件的形势存在，其中包括以下内容:</p>
<p>(1) 提供了少量的API函数实现客户和服务端COM应用的创建过程。在客户端，主要是一些创建函数;而在服务器端，提供一些对象的访问支持。</p>
<p>(2) COM通过注册表查找本地服务器即EXE程序，以及程序名与CLSID的转换等。</p>
<p>(3) 提供了一些标准的内存控制方法，使应用控制进程中内存的分配。</p>
<p>COM库一般不在应用程序层实现，而在操作系统层次上实现，因此一个操作系统只有一个COM库实现。而且COM库的实现必须依赖于具体的系统平台，尤其是系统底层的一些标准。</p>
<p>COM库可以保证所有的组件按照统一的方式进行交互操作，而且它使我们在编写COM应用时，可以不用编写为进行COM通信而必需的大量基础代码，而是直接利用COM库提供的API进行编程，从而大大加快了开发的速度。例如，现在COM库的版本都支持远程组件即分布式COM，我们不用编写任何网络或者RPC(remote procedure call)的代码，就可以实现在网络上进行程序之间的通信。 </p>
<p><br>如果我们用面向对象语言来实现COM对象，则很自然可以用类类定义对象。在C语言中，对象的概念可能变成一个逻辑概念，如果两个对象同时存在，则在接口实现中必须明确知道所进行的操作是针对哪个对象的，这个过程可由COM接口的定义保证。 </p>
<p><br>COM规范使用GUID来标识COM对象的思想源于OSF(Open Software Foundation)采用的UUID(Universallz Unique Identifier), UUID被定义为DCE(Distributed Computing Environment)的一部分，主要用于表识RPC通信的双方。 </p>
<p><br>除了封装性和重用性，C++对象还有一个重要特性是多态性。正是C++对象的多态性，才体现了C++语言用类描述事物的高度抽象的特征;COM对象也 具有多态性，但这种多态性需要通过COM对象所具有的接口才能体现出来，就像C++对象的多态性需要通过其(virtual)函数才能体现一样。 </p>
<p><br>从API到COM接口</p>
<p>假如我们要实现一个字处理应用系统，它需要一个查字典的功能，按照组件化程序设计的方法，自然应该把查字典的功能放到一个组件(.dll)程序中实现。如果以后字典程序的查找算法或者字典库改变了，只要应用程序和组件之间的接口不变，则新的组件程序仍然可以被应用系统使用。这就是采用组件程序带来的灵活性。 </p>
<p><br>为了把应用系统和组件程序连接起来，又能使它们协同工作，最简单的做法就是先定义一组查字典的函数，而且这组函数尽可能一般化，不要加入特定的与字典库相关的知识。 </p>
<p><br>函数<br>&nbsp;功能说明<br>&nbsp;<br>Initialize<br>&nbsp;初始化<br>&nbsp;<br>LoadLibrary<br>&nbsp;装入字典库<br>&nbsp;<br>InsertWord<br>&nbsp;插入一个单词<br>&nbsp;<br>DeleteWord<br>&nbsp;删除一个单词<br>&nbsp;<br>LookupWord<br>&nbsp;查找单词<br>&nbsp;<br>RestoreLibrary<br>&nbsp;把内存中的字典库存入指定的文件中<br>&nbsp;<br>FreeLibrary<br>&nbsp;释放字典库<br>&nbsp;</p>
<p>平面型的API接口层可以很好地把两个程序连接起来，但存在以下一些问题：</p>
<p>(1) 当API函数非常多时，使用会非常不方便，需要对函数进行组织。</p>
<p>(2) API函数需要标准化，按照统一的调用方式进行处理，以适应不同的语言编程实现。参数的传递顺序，参数类型，寒暑返回处理都需要标准化。</p>
<p>COM定义了一套完整的接口规范，不仅可以弥补以上API作为组件借口的不足，还充分发挥了组件对象的优势，并实现了组件对象的多态性。</p>
<p>接口定义和标识 <br>从技术上讲，接口是包含了一组函数的数据结构，通过这组数据结构，客户代码可以调用组件对象的功能。接口定义了一组成员函数，这组成员函数是组件对象暴露出来的所有信息，客户程序利用这些函数或的组件对象的服务。 </p>
<p><br>客户程序用一个指向接口数据机构的指针来调用接口成员函数。接口指针实际上又指向另一个指针，这第二个指针指向一组函数，称为接口函数表(虚函数表)，接口函数表中每一项为4个字节长的函数指针，每个函数指针与对象的具体实现连接起来。通过这种方式，客户只要获得了接口指针，就可以调用到对象的实际功能。 </p>
<p><br>对于一个接口来说，他的虚函数表vtable是确定的，因此接口的成员函数个数是不变的，而且成员函数的先后顺序也是不变的;对于每个成员函数来说，其参数和返回值也是确定的。 </p>
<p><br>在一个接口的定义中，所有这些信息都必须在二进制一级确定，不管什么语言，只要能支持这样的内存结构描述，也就是能够支持&#8220;structure&#8220;或&#8220;record&#8220;类型，并且这种类型能够包含双重的指向函数指针表的成员，则它就可以支持接口的描述，从而可以用于编写COM组件或者使用COM组件。</p>
<p>接口描述语言IDL</p>
<p>COM规范在采用OSF的DCE规范描述远程调用接口IDL的基础上，进行扩展形成了COM接口的描述语言。</p>
<p>COM规范使用的IDL接口描述语言不仅可用于定义COM接口，同时还定义了一些常用的数据类型，也可以描述自定义的数据结构，对于接口成员函数，我们可以指定每个参数的类型，输入输出特性，甚至支持可变长度的数组的描述。IDL支持指针类型，与C/C++很类似。</p>
<p>Microsoft Visual C++提供了MIDL工具，可以把IDL接口描述文件编译成C/C++兼容的接口描述头文件(.h)。</p>
<p>IUnknown的定义(IDL):</p>
<p>interface IUnknown<br>{</p>
<p>HRESULT QueryInterface([in] REFIID iid, [out] void **ppv);<br>ULONG AddRef(void);<br>ULONG Release(void);<br>}</p>
<p><br>IUnknown的定义(C++):</p>
<p>class IUnknown<br>{</p>
<p>Public:<br>virtual HRESULT _stdcall QueryInterface([in] REFIID iid, [out] void **ppv)=0;<br>virtual ULONG _stdcall AddRef(void)=0;<br>virtual ULONG _stdcall Release(void)=0;<br>}</p>
<p>进程内组件</p>
<p>因为进程内组件和客户程序运行在同一个进程地址空间中，所以一旦客户程序与组件程序建立起通信关系之后，客户程序得到的接口指针指向组件程序中接口的vtable，这个vtable包含了所有成员函数地址，客户代码可以直接调用这些成员函数，所以其效率非常高。</p>
<p>因为DLL程序是在运行时刻被客户装入到内存中的，所以DLL模块本身也是独立的，它并不依赖于客户程序。</p>
<p>在C++语言中，为了使编制的DLL程序更为通用，一般指定DLL的引出函数使用_stdcall调用习惯，如果使用了_cdecl调用习惯，则有些编程语言环境就不能使用这些DLL程序。C++编译器为DLL程序的每个引出函数生成了一个修饰名，这些修饰名对于不同的编译器并不兼容，因此，从通用性角度出发，我们在每个函数定义前加上extern ?C&#8220; 说明符。在Visual C++ 开发环境中，下面的说明语句可以很好的说明一个引出函数：</p>
<p>extern ? C&#8220; int _stdcall MyFunction(int n);</p>
<p>为了编制DLL程序，我们可以按照这样的步骤：</p>
<p>(1) 创建一个DLL工程</p>
<p>(2) 对每个引出函数，使用extern ? C&#8220;说明符，以及_stdcall修饰符，如上面对MyFunction函数的说明。</p>
<p>(3) 按照传统的编程方法，我们还应该编写一个DEF文件，用来描述DLL程序的模块信息。在Win32平台上，我们可以不使用DEF文件，而是直接在函数说明时使用_declspec(dllexport)说明符，例如：</p>
<p>extern ? C&#8220;_declspec(dllexport) int _stdcall MyFunction(int n);</p>
<p>按照这样的方法建立起来的DLL模块可以被其他程序调用，因为C++连接器会把所有引出函数的信息连接到最终的目标代码中。 </p>
<p><br>从客户程序一方来看，有三个系统函数可用于操作DLL程序，LoadLibrary, GetProcAddress, 和FreeLibrary。 </p>
<p><br>一般地，对于DLL程序的使用过程按照这样的步骤进行：</p>
<p>首先，客户程序使用LoadLibrary函数装入DLL，该函数返回模块的实例句柄，供以后操作该模块使用。</p>
<p>然后，客户程序可以调用GetProcAddress函数获得DLL中引出的函数的地址，我们既可以按函数的序号(在DEF文件中指定)也可以按函数的名字来获取引出函数的地址，因为客户程序和DLL程序在相同的内存地址空间中，所以客户程序可以直接调用这些引出函数。</p>
<p>最后FreeLibrary，把DLL程序卸出内存，以便释放资源。 </p>
<p><br>说明：</p>
<p>(1) DLL程序不仅可以引出函数，也可以引出全局变量，因为客户程序和DLL程序在同一个地址空间，所以，把DLL中的全局变量引出到客户程序中是有意义的。引用的方法并不复杂，或者把变量名放到DEF文件的EXPORTS部分，并加上DATA选项; 或者在变量说明前面加上_declspec(dllexport)说明符。</p>
<p>(2) DumpBin 通过/Exports选项可以列出DLL程序中的所有被引出的信息。</p>
<p>(3) 客户程序本身也可以是一个DLL程序，但它一定先被装入到进程空间中，以便可以调用系统函数操作作为服务程序的DLL模块。</p>
<p>进程外组件 <br>因为进程外组件程序和客户程序位于不同的进程空间之中，他们使用不同的地址空间，所以组件和客户之间的通信必须跨越进程边界，这就涉及到以下一些问题：</p>
<p>(1) 一个进程如何调用另外一个进程中的函数</p>
<p>(2) 参数如何从一个进程被传递到另外一个进程中</p>
<p>Windows平台上，在不同进程之间进行通信的办法很多，包括DDE, named pipe,或者共享内存等等，COM采用了LPC(Local Procedure Call)和RPC(Remote Procedure Call)</p>
<p>RegEdit可检查CLSID子键下的COM对象(63页) <br>Microsoft Visual C++提供OleView.exe，可列出当前机器上的所有类别信息，以及每一种类别下的组件对象列表。</p>
<p>RegSvr32 D:\DicComp\DictComp.dll</p>
<p>RegSvr32 /u D:\DicComp\DictComp.dll</p>
<p>DLL组件必须有DllRegisterServer和DllUnregisterServer两个用于注册的入口函数，才能用RegSvr32注册。</p>
<p>COM规定，支持自注册的进程外组件必须支持两个命令行参数/RegServer和/UnregServer，以便完成注册或注销操作。 <br>Class Factory</p>
<p>实际上，客户程序并不直接调用组件程序的引出函数，它调用COM库的函数进行组件对象的创建工作，COM库的创建函数根据注册表的信息调用组件程序的入口函数来创建组件对象。组件程序需要提供一个标准的入口函数DLLGetObjectClass，用于提供本组程序的组件信息。</p>
<p>Class Factory和DLLGetObjectClass函数 <br>类厂是COM对象的生产基地，COM库通过类厂创建COM对象; 对应每一个COM类，有一个类厂专门用于该COM类的对象创操作。类厂本身也是一个COM对象，它支持一个特殊的接口：IClassFactory，其定义如下：</p>
<p>Class IClassFactory : public IUnknown</p>
<p>{<br>virtual HRESULT _stdcall CreateInstance(IUnknown *pUnknownOuter, const IID&amp; iid, void **ppv) = 0;<br>virtual HRESULT _stdcall LockServer(BOOL bLock) = 0;</p>
<p>};</p>
<p>接口IClassFactory有一个重要的成员函数CreateInstance，用于创建对应的COM对象。因为每个类厂之针对特定的COM类对象，所以CreateInstance成员函数知道该创建什么样的COM对象。在CreateInstance成员函数的参数中，第一个参数pUnknownOuter用于对象被聚合的情形，没有聚合设成NULL。IClassFactory的另一个成员函数LockServer用于控制组建的生存周期。</p>
<p>因为类厂本身也是个COM对象，它被用于其它COM对象的创建过程，那么类厂对象又由谁来创建呢？答案是DLLGetClassObject引出函数。DLLGetClassObject函数并不是COM库的函数，而是由组件程序实现的引出函数，我们先看一下DLLGetClassObject函数的原型：</p>
<p>HRESULT DLLGetClassObject(const CLSID&amp; clsid,<br>Const IID&amp; iid,<br>(void **) ppv<br>);</p>
<p>COM库在接到对象创建的指令后，它要调进程内组件的DLLGetClassObject函数，由该函数创类厂对象，并返回类厂对象的接口指针，COM库或者客户一旦有了类厂的接口指针，它们就可以通过类厂接口IClassFactory的成员函数CreateInstance创建相应的COM对象。</p>
<p>COM库与类厂的交互（67页） <br>在COM库中，有三个API函数可用于对象的创建，它们分别是CoGetClassObject, CoCreateInstance和CoCreateInstanceEx。通常情况下，客户程序调用其中之一完成对象的创建，并返回对象的初始接口指针。COM库与类厂也通过这三个函数进行交互。<br></p>
</div>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/88252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-06-22 09:51 <a href="http://www.cppblog.com/SpringSnow/articles/88252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:深入浅出ShellExecute </title><link>http://www.cppblog.com/SpringSnow/articles/80685.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Wed, 22 Apr 2009 01:46:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/80685.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/80685.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/80685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/80685.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/80685.html</trackback:ping><description><![CDATA[摘自:http://www.vckbase.com/document/viewdoc/?id=416<br><br>
<p align=center><strong>深入浅出ShellExecute</strong> <br><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#105;&#110;&#103;&#122;&#104;&#111;&#117;&#95;&#120;&#117;&#64;&#49;&#54;&#51;&#46;&#110;&#101;&#116;"><u><font color=#0000ff>译者：徐景周</font></u></a>(原作:<a href="http://www.codeproject.com/script/articles/mailauthor.asp?guid=%2Fuseritems%2Fnewbiespawn%2Easp%2D2%2F18%2F2002" target=_blank><u><font color=#0000ff>Nishant S</font></u></a>)</p>
<img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14>Q: 如何打开一个应用程序？
<pre>ShellExecute(this-&gt;m_hWnd,"open","calc.exe","","", SW_SHOW );</pre>
或
<pre>ShellExecute(this-&gt;m_hWnd,"open","notepad.exe",
"c:\\MyLog.log","",SW_SHOW );</pre>
正如您所看到的，我并没有传递程序的完整路径。<br><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14>Q: 如何打开一个同系统程序相关连的文档？
<pre>ShellExecute(this-&gt;m_hWnd,"open",
"c:\\abc.txt","","",SW_SHOW );</pre>
<img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14>Q: 如何打开一个网页？
<pre>ShellExecute(this-&gt;m_hWnd,"open",
"http://www.google.com","","", SW_SHOW );</pre>
<img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14>Q: 如何激活相关程序，发送EMAIL？
<pre>ShellExecute(this-&gt;m_hWnd,"open",
"mailto:nishinapp@yahoo.com","","", SW_SHOW );</pre>
<img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14>Q: 如何用系统打印机打印文档？
<pre>ShellExecute(this-&gt;m_hWnd,"print",
"c:\\abc.txt","","", SW_HIDE);</pre>
<img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14>Q: 如何用系统查找功能来查找指定文件？
<pre>ShellExecute(m_hWnd,"find","d:\\nish",
NULL,NULL,SW_SHOW);</pre>
<img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14>Q: 如何启动一个程序，直到它运行结束？
<pre>SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c:\\MyProgram.exe";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&amp;ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);</pre>
或：
<pre>PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&amp;StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
if(CreateProcess("c:\\winnt\\notepad.exe", NULL,
NULL,NULL,FALSE,0,NULL,
NULL,&amp;StartupInfo,&amp;ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
MessageBox("The process could not be started...");
}
</pre>
<img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14>Q: 如何显示文件或文件夹的属性？
<pre>SHELLEXECUTEINFO ShExecInfo ={0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "properties";
ShExecInfo.lpFile = "c:\\"; //can be a file as well
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&amp;ShExecInfo);
</pre>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/80685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-04-22 09:46 <a href="http://www.cppblog.com/SpringSnow/articles/80685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:工作线程的相关消息循环 </title><link>http://www.cppblog.com/SpringSnow/articles/80112.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 16 Apr 2009 02:15:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/80112.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/80112.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/80112.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/80112.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/80112.html</trackback:ping><description><![CDATA[摘自:<br><a href="http://www.cppblog.com/qinqing1984/archive/2009/04/15/80038.html">http://www.cppblog.com/qinqing1984/archive/2009/04/15/80038.html</a><br><br>
<div class=postTitle><a class=postTitle2 id=viewpost1_TitleUrl href="http://www.cppblog.com/qinqing1984/archive/2009/04/15/80038.html"><font color=#1a8bc8>工作线程的相关消息循环</font></a> </div>
<p dir=ltr style="MARGIN-RIGHT: 0px"><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;首先声明, 这里的工作线程与UI线程是相对的,即没有任何窗口的. 如果需要与主线程或其它辅助线程通讯,有几种方法如事件,消息,信号等,也可以是以上几种方法的综合运用.下面就列出以下两种通讯方法的代码框架</span></p>
<p><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（ 1）&nbsp;只用消息通讯&nbsp;&nbsp;&nbsp;</span><span style="FONT-SIZE: 10pt"></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 99.31%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 479px; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">DWORD&nbsp;ThreadProc(LPVOID&nbsp;lParam)<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_32_514_Open_Image onclick="this.style.display='none'; Codehighlighter1_32_514_Open_Text.style.display='none'; Codehighlighter1_32_514_Closed_Image.style.display='inline'; Codehighlighter1_32_514_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_32_514_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_514_Closed_Text.style.display='none'; Codehighlighter1_32_514_Open_Image.style.display='inline'; Codehighlighter1_32_514_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_32_514_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_32_514_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">创建线程消息队列</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;MSG&nbsp;msg;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;PeekMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg,&nbsp;NULL,&nbsp;WM_USER,&nbsp;WM_USER,&nbsp;PM_NOREMOVE);<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">通知其它线程消息队列已创建好</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SetEvent(hEvent);&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img id=Codehighlighter1_187_497_Open_Image onclick="this.style.display='none'; Codehighlighter1_187_497_Open_Text.style.display='none'; Codehighlighter1_187_497_Closed_Image.style.display='inline'; Codehighlighter1_187_497_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_187_497_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_187_497_Closed_Text.style.display='none'; Codehighlighter1_187_497_Open_Image.style.display='inline'; Codehighlighter1_187_497_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_187_497_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_187_497_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg,&nbsp;NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">(msg.message)<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img id=Codehighlighter1_264_491_Open_Image onclick="this.style.display='none'; Codehighlighter1_264_491_Open_Text.style.display='none'; Codehighlighter1_264_491_Closed_Image.style.display='inline'; Codehighlighter1_264_491_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_264_491_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_264_491_Closed_Text.style.display='none'; Codehighlighter1_264_491_Open_Image.style.display='inline'; Codehighlighter1_264_491_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_264_491_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_264_491_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_QUIT:<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">自定义消息1处理</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">18</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_USER&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">自定义消息2处理</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">22</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_USER&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">101</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p></span><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="FONT-SIZE: 10pt">&nbsp;（2）用消息和事件通讯&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;</span><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;</span></font><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 99.42%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 778px; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">DWORD&nbsp;ThreadProc(LPVOID&nbsp;lParam)<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_33_986_Open_Image onclick="this.style.display='none'; Codehighlighter1_33_986_Open_Text.style.display='none'; Codehighlighter1_33_986_Closed_Image.style.display='inline'; Codehighlighter1_33_986_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_33_986_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_33_986_Closed_Text.style.display='none'; Codehighlighter1_33_986_Open_Image.style.display='inline'; Codehighlighter1_33_986_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_33_986_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_33_986_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(TRUE)<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img id=Codehighlighter1_51_985_Open_Image onclick="this.style.display='none'; Codehighlighter1_51_985_Open_Text.style.display='none'; Codehighlighter1_51_985_Closed_Image.style.display='inline'; Codehighlighter1_51_985_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_51_985_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_51_985_Closed_Text.style.display='none'; Codehighlighter1_51_985_Open_Image.style.display='inline'; Codehighlighter1_51_985_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_51_985_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_51_985_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;ret&nbsp;;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSG&nbsp;msg&nbsp;;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(PeekMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg,&nbsp;NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;PM_REMOVE))&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img id=Codehighlighter1_157_461_Open_Image onclick="this.style.display='none'; Codehighlighter1_157_461_Open_Text.style.display='none'; Codehighlighter1_157_461_Closed_Image.style.display='inline'; Codehighlighter1_157_461_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_157_461_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_157_461_Closed_Text.style.display='none'; Codehighlighter1_157_461_Open_Image.style.display='inline'; Codehighlighter1_157_461_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_157_461_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_157_461_Open_Text><span style="COLOR: #000000">{&nbsp;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">(msg.message)<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img id=Codehighlighter1_199_451_Open_Image onclick="this.style.display='none'; Codehighlighter1_199_451_Open_Text.style.display='none'; Codehighlighter1_199_451_Closed_Image.style.display='inline'; Codehighlighter1_199_451_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_199_451_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_199_451_Closed_Text.style.display='none'; Codehighlighter1_199_451_Open_Image.style.display='inline'; Codehighlighter1_199_451_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_199_451_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_199_451_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">线程退出消息,直接返回</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_QUIT:<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">自定义消息1处理</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_USER&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">自定义消息2处理</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_USER&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">101</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;MsgWaitForMultipleObjects(cObjects,&nbsp;lphObjects,&nbsp;FALSE,INFINITE,QS_POSTMESSAGE);&nbsp;<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(ret&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;(WAIT_OBJECT_0&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;cObjects))<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img id=Codehighlighter1_614_685_Open_Image onclick="this.style.display='none'; Codehighlighter1_614_685_Open_Text.style.display='none'; Codehighlighter1_614_685_Closed_Image.style.display='inline'; Codehighlighter1_614_685_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_614_685_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_614_685_Closed_Text.style.display='none'; Codehighlighter1_614_685_Open_Image.style.display='inline'; Codehighlighter1_614_685_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_614_685_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_614_685_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">有新的消息到来,继续到上步PeekMessage处理</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">29</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img id=Codehighlighter1_710_964_Open_Image onclick="this.style.display='none'; Codehighlighter1_710_964_Open_Text.style.display='none'; Codehighlighter1_710_964_Closed_Image.style.display='inline'; Codehighlighter1_710_964_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_710_964_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_710_964_Closed_Text.style.display='none'; Codehighlighter1_710_964_Open_Image.style.display='inline'; Codehighlighter1_710_964_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_710_964_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_710_964_Open_Text><span style="COLOR: #000000">{&nbsp;<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">是事件受信了</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">34</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(ret&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;WAIT_OBJECT_O)<br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img id=Codehighlighter1_779_806_Open_Image onclick="this.style.display='none'; Codehighlighter1_779_806_Open_Text.style.display='none'; Codehighlighter1_779_806_Closed_Image.style.display='inline'; Codehighlighter1_779_806_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_779_806_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_779_806_Closed_Text.style.display='none'; Codehighlighter1_779_806_Open_Image.style.display='inline'; Codehighlighter1_779_806_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_779_806_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_779_806_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(ret&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;WAIT_OBJECT_O&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img id=Codehighlighter1_863_875_Open_Image onclick="this.style.display='none'; Codehighlighter1_863_875_Open_Text.style.display='none'; Codehighlighter1_863_875_Closed_Image.style.display='inline'; Codehighlighter1_863_875_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_863_875_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_863_875_Closed_Text.style.display='none'; Codehighlighter1_863_875_Open_Image.style.display='inline'; Codehighlighter1_863_875_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_863_875_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_863_875_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(ret&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;WAIT_OBJECT_O&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;cObjects&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img id=Codehighlighter1_942_954_Open_Image onclick="this.style.display='none'; Codehighlighter1_942_954_Open_Text.style.display='none'; Codehighlighter1_942_954_Closed_Image.style.display='inline'; Codehighlighter1_942_954_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_942_954_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_942_954_Closed_Text.style.display='none'; Codehighlighter1_942_954_Open_Image.style.display='inline'; Codehighlighter1_942_954_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_942_954_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_942_954_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span></div>
<p dir=ltr style="MARGIN-RIGHT: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面用到了GetMessage和PeekMessage&nbsp;函数, 这两者都是从消息队列取出消息, 不同的是GetMessage从消息队列删除消息,并且阻塞调用线程. PeekMessage则是查询消息队列,如果有消息就取出,没有消息也立即返回,&nbsp;&nbsp; 是否从消息队列删除消息由最后一个参数决定:PM_REMOVE表示删除,PM_NOREMOVE表示不删除.可以简单地认为,GetMessage是同步的,PeekMessage是异步的.<br><br>收获最大的是对这两个函数的理解:GetMessage和PeekMessage&nbsp;函数,<br><span style="COLOR: red">这两者都是从消息队列取出消息, 不同的是GetMessage从消息队列删除消息,并且阻塞调用线程. PeekMessage则是查询消息队列,如果有消息就取出,没有消息也立即返回,&nbsp;&nbsp; 是否从消息队列删除消息由最后一个参数决定:PM_REMOVE表示删除,PM_NOREMOVE表示不删除.可以简单地认为,GetMessage是同步的,PeekMessage是异步的.</span><br></span></span></p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/80112.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-04-16 10:15 <a href="http://www.cppblog.com/SpringSnow/articles/80112.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:工作线程的相关消息循环 </title><link>http://www.cppblog.com/SpringSnow/articles/80113.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 16 Apr 2009 02:15:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/80113.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/80113.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/80113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/80113.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/80113.html</trackback:ping><description><![CDATA[摘自:<br><a href="http://www.cppblog.com/qinqing1984/archive/2009/04/15/80038.html">http://www.cppblog.com/qinqing1984/archive/2009/04/15/80038.html</a><br><br>
<div class=postTitle><a class=postTitle2 id=viewpost1_TitleUrl href="http://www.cppblog.com/qinqing1984/archive/2009/04/15/80038.html"><font color=#1a8bc8>工作线程的相关消息循环</font></a> </div>
<p dir=ltr style="MARGIN-RIGHT: 0px"><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;首先声明, 这里的工作线程与UI线程是相对的,即没有任何窗口的. 如果需要与主线程或其它辅助线程通讯,有几种方法如事件,消息,信号等,也可以是以上几种方法的综合运用.下面就列出以下两种通讯方法的代码框架</span></p>
<p><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（ 1）&nbsp;只用消息通讯&nbsp;&nbsp;&nbsp;</span><span style="FONT-SIZE: 10pt"></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 99.31%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 479px; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">DWORD&nbsp;ThreadProc(LPVOID&nbsp;lParam)<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_32_514_Open_Image onclick="this.style.display='none'; Codehighlighter1_32_514_Open_Text.style.display='none'; Codehighlighter1_32_514_Closed_Image.style.display='inline'; Codehighlighter1_32_514_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_32_514_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_514_Closed_Text.style.display='none'; Codehighlighter1_32_514_Open_Image.style.display='inline'; Codehighlighter1_32_514_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_32_514_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_32_514_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">创建线程消息队列</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;MSG&nbsp;msg;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;PeekMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg,&nbsp;NULL,&nbsp;WM_USER,&nbsp;WM_USER,&nbsp;PM_NOREMOVE);<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">通知其它线程消息队列已创建好</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SetEvent(hEvent);&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img id=Codehighlighter1_187_497_Open_Image onclick="this.style.display='none'; Codehighlighter1_187_497_Open_Text.style.display='none'; Codehighlighter1_187_497_Closed_Image.style.display='inline'; Codehighlighter1_187_497_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_187_497_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_187_497_Closed_Text.style.display='none'; Codehighlighter1_187_497_Open_Image.style.display='inline'; Codehighlighter1_187_497_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_187_497_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_187_497_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg,&nbsp;NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">(msg.message)<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img id=Codehighlighter1_264_491_Open_Image onclick="this.style.display='none'; Codehighlighter1_264_491_Open_Text.style.display='none'; Codehighlighter1_264_491_Closed_Image.style.display='inline'; Codehighlighter1_264_491_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_264_491_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_264_491_Closed_Text.style.display='none'; Codehighlighter1_264_491_Open_Image.style.display='inline'; Codehighlighter1_264_491_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_264_491_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_264_491_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_QUIT:<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">自定义消息1处理</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">18</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_USER&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">自定义消息2处理</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">22</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_USER&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">101</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p></span><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="FONT-SIZE: 10pt">&nbsp;（2）用消息和事件通讯&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;</span><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;</span></font><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 99.42%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 778px; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">DWORD&nbsp;ThreadProc(LPVOID&nbsp;lParam)<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_33_986_Open_Image onclick="this.style.display='none'; Codehighlighter1_33_986_Open_Text.style.display='none'; Codehighlighter1_33_986_Closed_Image.style.display='inline'; Codehighlighter1_33_986_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_33_986_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_33_986_Closed_Text.style.display='none'; Codehighlighter1_33_986_Open_Image.style.display='inline'; Codehighlighter1_33_986_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_33_986_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_33_986_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(TRUE)<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img id=Codehighlighter1_51_985_Open_Image onclick="this.style.display='none'; Codehighlighter1_51_985_Open_Text.style.display='none'; Codehighlighter1_51_985_Closed_Image.style.display='inline'; Codehighlighter1_51_985_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_51_985_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_51_985_Closed_Text.style.display='none'; Codehighlighter1_51_985_Open_Image.style.display='inline'; Codehighlighter1_51_985_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_51_985_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_51_985_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;ret&nbsp;;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSG&nbsp;msg&nbsp;;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(PeekMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg,&nbsp;NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;PM_REMOVE))&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img id=Codehighlighter1_157_461_Open_Image onclick="this.style.display='none'; Codehighlighter1_157_461_Open_Text.style.display='none'; Codehighlighter1_157_461_Closed_Image.style.display='inline'; Codehighlighter1_157_461_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_157_461_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_157_461_Closed_Text.style.display='none'; Codehighlighter1_157_461_Open_Image.style.display='inline'; Codehighlighter1_157_461_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_157_461_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_157_461_Open_Text><span style="COLOR: #000000">{&nbsp;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">(msg.message)<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img id=Codehighlighter1_199_451_Open_Image onclick="this.style.display='none'; Codehighlighter1_199_451_Open_Text.style.display='none'; Codehighlighter1_199_451_Closed_Image.style.display='inline'; Codehighlighter1_199_451_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_199_451_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_199_451_Closed_Text.style.display='none'; Codehighlighter1_199_451_Open_Image.style.display='inline'; Codehighlighter1_199_451_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_199_451_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_199_451_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">线程退出消息,直接返回</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_QUIT:<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">自定义消息1处理</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_USER&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">自定义消息2处理</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_USER&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">101</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;MsgWaitForMultipleObjects(cObjects,&nbsp;lphObjects,&nbsp;FALSE,INFINITE,QS_POSTMESSAGE);&nbsp;<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(ret&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;(WAIT_OBJECT_0&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;cObjects))<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img id=Codehighlighter1_614_685_Open_Image onclick="this.style.display='none'; Codehighlighter1_614_685_Open_Text.style.display='none'; Codehighlighter1_614_685_Closed_Image.style.display='inline'; Codehighlighter1_614_685_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_614_685_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_614_685_Closed_Text.style.display='none'; Codehighlighter1_614_685_Open_Image.style.display='inline'; Codehighlighter1_614_685_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_614_685_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_614_685_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">有新的消息到来,继续到上步PeekMessage处理</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">29</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img id=Codehighlighter1_710_964_Open_Image onclick="this.style.display='none'; Codehighlighter1_710_964_Open_Text.style.display='none'; Codehighlighter1_710_964_Closed_Image.style.display='inline'; Codehighlighter1_710_964_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_710_964_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_710_964_Closed_Text.style.display='none'; Codehighlighter1_710_964_Open_Image.style.display='inline'; Codehighlighter1_710_964_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_710_964_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_710_964_Open_Text><span style="COLOR: #000000">{&nbsp;<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">是事件受信了</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">34</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(ret&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;WAIT_OBJECT_O)<br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img id=Codehighlighter1_779_806_Open_Image onclick="this.style.display='none'; Codehighlighter1_779_806_Open_Text.style.display='none'; Codehighlighter1_779_806_Closed_Image.style.display='inline'; Codehighlighter1_779_806_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_779_806_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_779_806_Closed_Text.style.display='none'; Codehighlighter1_779_806_Open_Image.style.display='inline'; Codehighlighter1_779_806_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_779_806_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_779_806_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(ret&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;WAIT_OBJECT_O&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img id=Codehighlighter1_863_875_Open_Image onclick="this.style.display='none'; Codehighlighter1_863_875_Open_Text.style.display='none'; Codehighlighter1_863_875_Closed_Image.style.display='inline'; Codehighlighter1_863_875_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_863_875_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_863_875_Closed_Text.style.display='none'; Codehighlighter1_863_875_Open_Image.style.display='inline'; Codehighlighter1_863_875_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_863_875_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_863_875_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(ret&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;WAIT_OBJECT_O&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;cObjects&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img id=Codehighlighter1_942_954_Open_Image onclick="this.style.display='none'; Codehighlighter1_942_954_Open_Text.style.display='none'; Codehighlighter1_942_954_Closed_Image.style.display='inline'; Codehighlighter1_942_954_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_942_954_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_942_954_Closed_Text.style.display='none'; Codehighlighter1_942_954_Open_Image.style.display='inline'; Codehighlighter1_942_954_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_942_954_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_942_954_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span></div>
<p dir=ltr style="MARGIN-RIGHT: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面用到了GetMessage和PeekMessage&nbsp;函数, 这两者都是从消息队列取出消息, 不同的是GetMessage从消息队列删除消息,并且阻塞调用线程. PeekMessage则是查询消息队列,如果有消息就取出,没有消息也立即返回,&nbsp;&nbsp; 是否从消息队列删除消息由最后一个参数决定:PM_REMOVE表示删除,PM_NOREMOVE表示不删除.可以简单地认为,GetMessage是同步的,PeekMessage是异步的.<br><br>收获最大的是对这两个函数的理解:GetMessage和PeekMessage&nbsp;函数,<br><span style="COLOR: red">这两者都是从消息队列取出消息, 不同的是GetMessage从消息队列删除消息,并且阻塞调用线程. PeekMessage则是查询消息队列,如果有消息就取出,没有消息也立即返回,&nbsp;&nbsp; 是否从消息队列删除消息由最后一个参数决定:PM_REMOVE表示删除,PM_NOREMOVE表示不删除.可以简单地认为,GetMessage是同步的,PeekMessage是异步的.</span><br></span></span></p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/80113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-04-16 10:15 <a href="http://www.cppblog.com/SpringSnow/articles/80113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:关于编译和链接 </title><link>http://www.cppblog.com/SpringSnow/articles/70210.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Wed, 24 Dec 2008 01:35:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/70210.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/70210.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/70210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/70210.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/70210.html</trackback:ping><description><![CDATA[<div class=postTitle><a id=viewpost1_TitleUrl href="http://www.cppblog.com/dawnbreak/archive/2008/12/23/70198.html"><font color=#000000>关于编译和链接</font></a> <br>转自:http://www.cppblog.com/dawnbreak/archive/2008/12/23/70198.html</div>
<div class=postText>在此，我想多说关于程序编译的一些规范和方法，一般来说，无论是C、C++，首先要把源文件编译成中间代码文件，在Windows下也就是 .obj 文件，UNIX下是 .o 文件，即 Object File，这个动作叫做编译（compile）。然后再把大量的Object File合成执行文件，这个动作叫作链接（link）。
<p>编译时，编译器需要的是语法的正确，函数与变量的声明的正确。对于后者，通常是你需要告诉编译器头文件的所在位置（头文件中应该只是声明，而定义应该放在C/C++文件中），只要所有的语法正确，编译器就可以编译出中间目标文件。一般来说，每个源文件都应该对应于一个中间目标文件（O文件或是OBJ文件）。
<p>链接时，主要是链接函数和全局变量，所以，我们可以使用这些中间目标文件（O文件或是OBJ文件）来链接我们的应用程序。链接器并不管函数所在的源文件，只管函数的中间目标文件（Object File），在大多数时候，由于源文件太多，编译生成的中间目标文件太多，而在链接时需要明显地指出中间目标文件名，这对于编译很不方便，所以，我们要给中间目标文件打个包，在Windows下这种包叫&#8220;库文件&#8221;（Library File)，也就是 .lib 文件，在UNIX下，是Archive File，也就是 .a 文件。
<p>总结一下，源文件首先会生成中间目标文件，再由中间目标文件生成执行文件。<font color=#ff0000>在编译时，编译器只检测程序语法，和函数、变量是否被声明。如果函数未被声明，编译器会给出一个警告，但可以生成Object File。而在链接程序时，链接器会在所有的Object File中找寻函数的实现，如果找不到，那到就会报链接错误码（Linker Error），在VC下，这种错误一般是：Link 2001错误，意思说是说，链接器未能找到函数的实现。你需要指定函数的Object File.</font></p>
</div>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/70210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2008-12-24 09:35 <a href="http://www.cppblog.com/SpringSnow/articles/70210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>调用SendMessage 产生死锁的问题分析 </title><link>http://www.cppblog.com/SpringSnow/articles/69794.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Fri, 19 Dec 2008 00:42:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/69794.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/69794.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/69794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/69794.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/69794.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.cppblog.com/woaidongmao/archive/2008/12/17/69696.html">调用SendMessage 产生死锁的问题分析</a> </h2>
<p><a href="http://www.cppblog.com/woaidongmao/archive/2008/12/17/69696.html">http://www.cppblog.com/woaidongmao/archive/2008/12/17/69696.html</a></p>
<div>
<p>&#160;</p>
<p align=left><strong><span></span></strong>&nbsp;</p>
<p align=left><strong><span>(</span></strong><strong><span>一<span>)</span></span></strong><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span>SendMessage </span></strong><strong><span>的工作机制 </span></strong></p>
<p align=left><strong><span>首先我要先简要的说明一个和这个话题有关系的消息处理机制： </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span>在<span>Window</span>操作系统当中，窗口时属于所在<span>Thread</span>的也就是说 你这个窗口在那个<span>Thread </span>当中<span>Create </span>的那么你这个窗口就属于那个<span>Thread</span>。同时窗口的消息处理函数也都会在这个<span>Thread </span>当中被执行的。（不要问为什么<span> Window </span>就是这么设计的 嘿嘿） </span></strong></p>
<p align=left><strong>&nbsp;</strong></p>
<p align=left><span>在讲死锁之前我们先把<span>SendMessage</span>的工作机制搞清楚； </span></p>
<p align=left><span>SendMessage </span><span>发送出来的消息 到底进入不进入消息队列，有人说进入，有人说不进入，其实都是错误的，确切的说是<strong>有时进入，有时不进入</strong>。那么什么时候进入，什么时候不进入呢？ 我们举一例子来说：假如在<span> Thread A&nbsp;</span>中有一个 窗口<span>W1</span>，那么 在<span> Thread A </span>中像<span> W1 SendMessage </span>一个消息，那么这个消息将不会被放入消息队列，而是直接调用了<span>W1</span>的消息处理函数来直接处理了这个消息。这是不被放入队列的情况；假如现在又多了一个<span>Thread B </span>，那么在<span> Thread B </span>中 像<span> W1 SendMessage </span>发送消息 这个时候<span> W1 </span>将被放入到<span> Thread A </span>的消息队列当中，这些<span>Thread A </span>中的消息循环的<span>GetMessage </span>会<span>Get</span>到这个消息 并处理之。 这就是进入消息队列情况；根据在哪里我们来看看我的测试结果： </span></p>
<p align=left>&nbsp;</p>
<p align=left><strong><span>测试<span>1</span>：</span></strong><span>我创建了一个无<span>DOC/View </span>之支持的单文档工程： </span></p>
<p align=left><span></span><span>我在<span>CMainFrame</span>添加如下代码： </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ON_WM_CREATE() </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ON_WM_SETFOCUS() </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><u>ON_MESSAGE(WM_USER + 100,OnMy) </u></strong></span></p>
<p align=left><strong><u><span>ON_MESSAGE(WM_USER + 200,OnMy2) </span></u></strong></p>
<p align=left><span>END_MESSAGE_MAP() </span></p>
<p align=left>&nbsp;</p>
<p align=left><strong><span>LRESULT CMainFrame::OnMy(WPARAM wParam,LPARAM lParam) </span></strong></p>
<p align=left><strong><span>{ </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int i = 0; </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return TRUE; </span></strong></p>
<p align=left><strong><span>} </span></strong></p>
<p align=left><strong>&nbsp;</strong></p>
<p align=left><strong><span>LRESULT CMainFrame::OnMy2(WPARAM wParam,LPARAM lParam) </span></strong></p>
<p align=left><strong><span>{ </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int i = 2; </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return TRUE; </span></strong></p>
<p align=left><strong><span>} </span></strong></p>
<p align=left><span>然后我再 </span><span>int</span><span> CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) </span><span>的最后</span><span> </span><span>加入了一行代码：</span><span> </span></p>
<p align=left><span>SendMessage(WM_USER + 100,0,0); </span></p>
<p align=left>&nbsp;</p>
<p align=left><span>此主题相关图片如下：</span><span><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image002_2.gif"><img height=90 alt=clip_image002 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image002_thumb.gif" width=473 border=0 v:shapes="_x0000_i1026"></a></span></p>
<p align=left><span>然后直接<span> F5 </span>运行程序 等到 程序停止在断点上，我们看看<span>Call Stack </span>的调用顺序：</span></p>
<p align=left><span><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image001_4.gif"><img height=20 alt=clip_image001 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image001_thumb_1.gif" width=20 border=0 v:shapes="_x0000_i1027"></a></span><span>此主题相关图片如下：</span><span><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image003_2.gif"><img height=309 alt=clip_image003 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image003_thumb.gif" width=633 border=0 v:shapes="_x0000_i1028"></a></span></p>
<p align=left>&nbsp;</p>
<p align=left><span>然后 我又将<span> SendMessage </span>改成： </span></p>
<p align=left><strong><span>PostMessage(WM_USER + 100,0,0); </span></strong></p>
<p align=left><span>然后直接<span> F5 </span>运行程序 等到 程序停止在断点上，我们再看看<span>Call Stack </span>的调用顺序：</span></p>
<p align=left><span><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image001_6.gif"><img height=20 alt=clip_image001 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image001_thumb_2.gif" width=20 border=0 v:shapes="_x0000_i1029"></a></span><span>此主题相关图片如下：</span><span><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image004_2.gif"><img height=247 alt=clip_image004 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image004_thumb.gif" width=536 border=0 v:shapes="_x0000_i1030"></a></span></p>
<p align=left><span>通过这<span>2</span>个<span> Call Stack </span>大家可以很清楚的看到<span>,</span>执行<strong><span>SendMessage</span></strong>的时候，是直接调用了 <strong><span>AfxWndProcBase</span></strong><span> </span>这个 消息处理函数<span>(MFC </span>通过<span>HOOK </span>将所有窗口的处理函数都重定向到这个 函数上了，<span>AfxWndProcBase()</span>不明白的自己去看《<span>MFC</span>深入浅出》<span>)</span>，大家可以很清楚的看到，在<span>SendMessage </span>到<span> AfxWindProcBase </span>之间根本没有调用<span>CWinApp::Run() </span>，也就是说从<span>SendMessage </span>到执行<span>OnMy()</span>根本没有通过程序的主消息循环的<span>GetMessage </span>（<span>Run </span>内部好像用的<span>PeekMessage</span>记不清楚了）取消息。那么有人会问，<span>SendMessage</span>的内部就不会先发消息放入队列再通过<span>GetMesssage</span>把消息取出来了吗？答根本没必要那样做，那是脱裤子放<span>P</span>多此一举。 </span></p>
<p align=left><strong><span>从这个测试例子的结果我判定<span>SendMessage </span>在<span> Thread A </span>中向<span>&nbsp;W1</span></span></strong></p>
<p align=left><strong><span>SendMessage </span></strong><strong><span>的消息根本不进入消息队列。 </span></strong></p>
<p align=left><strong><span>测试<span>2</span>：</span></strong><span>那么什么时候进入队列呢我来看看这个例子 </span></p>
<p align=left><span>沿用上面那个例子的代码我将<span> OnCreate </span>中的<span> SendMessage </span>和<span> PostMessage </span>都删除掉。然后加入如下代码： </span></p>
<p align=left><strong><span>//Thread Proc </span></strong></p>
<p align=left><strong><span>UINT ThreadProc(LPVOID lParam) </span></strong></p>
<p align=left><strong><span>{ </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CMainFrame * v_pFrameWnd = (CMainFrame *)lParam; </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(v_pFrameWnd) </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>v_pFrameWnd-&gt;SendMessage(WM_USER + 100,0,0); </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return 0; </span></strong></p>
<p align=left><strong><span>} </span></strong></p>
<p align=left><span>并且 在<span> OnCreate </span>种加入如下代码： </span></p>
<p align=center><strong><span>AfxBeginThread(ThreadProc,this); </span></strong></p>
<p align=left><span>然后<span>F5 </span>运行 等待程序停在断点处，看<span>Call Stack </span>如下：</span></p>
<p align=left><span><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image001_8.gif"><img height=20 alt=clip_image001 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image001_thumb_3.gif" width=20 border=0 v:shapes="_x0000_i1031"></a></span><span>此主题相关图片如下：</span><span><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image005_2.gif"><img height=310 alt=clip_image005 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image005_thumb.gif" width=540 border=0 v:shapes="_x0000_i1032"></a></span></p>
<p align=left><span>我们发现这个<span> Call Stack </span>就和刚才那个<span>PostMessage </span>的<span>Call Stack </span>是一样的 这个<span> WM_USER + 100 </span>消息是通过<span> Run </span>内部的<span> GetMessage </span>取出来的 。所以我断定： </span></p>
<p align=left>&nbsp;</p>
<p align=left><strong><span>在<span> Thread B </span>中向<span>W1 SendMessage </span>发送消息 ，消息是放入了<span> Thread&nbsp;A </span>的消息队列中。由于<span>SendMessage</span>的特性只有当消息被执行完毕才能够返回，所以<span>Thread&nbsp;B </span>中的<span>SendMessage </span>要等<span> Thread A </span>当中消息执行完毕后才能够返回。 </span></strong></p>
<p align=left><strong><span>(</span></strong><strong><span>一<span>)</span></span></strong><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span>SendMessage </span></strong><strong><span>产生的 死锁问题 </span></strong></p>
<p align=left><span>Thread </span><span>死锁肯定是发生在<span>2</span>个<span>Thread </span>之间，<span>A</span>等<span>B </span>，<span>B</span>等<span> A</span>，就产生了死锁。大家看了上面测试之后一定会发现，<span>SendMessage </span>的死锁和上面的第二个例子有关系，也就是 说 通过<span> Thread&nbsp;B </span>向<span> W1 </span>发送消息的时候又可能会产生死锁。 </span></p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left><span>那么死锁 何时产生呢 ？通过上面的例子我们知道了<span>&nbsp;</span>如果<span>Thread B </span>向<span> W1 SendMessage</span>一个消息，那么<span> Thread B </span>的这个<span>SendMessage </span>就要等<span> Thread A </span>的队列中的 消息执行完毕才能够返回，如果在<span> Thread B SendMessage </span>的同时<span>&nbsp;Thread A </span>等待<span> Thread B </span>中的某一处理完毕才能够继续处理消息的话，那么这个时候就发送了死锁。 </span></p>
<p align=left>&nbsp;</p>
<p align=left><span></span><span>我们继续以测试来说明： </span></p>
<p align=left><span></span><span>测试<span>3</span>： </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>首先在<span> CMainFrame</span>中加入一个 成员变量：</span><strong><span>m_bThreadExit </span></strong><strong><span>（<span>Public</span>）</span></strong><span> </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>我们将<span> UINT ThreadProc(LPVOID lParam) </span>加入一样代码如下： </span></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>UINT ThreadProc(LPVOID lParam) </span></strong></p>
<p align=left><strong><span>{ </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CMainFrame * v_pFrameWnd = (CMainFrame *)lParam; </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(v_pFrameWnd) </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>v_pFrameWnd-&gt;SendMessage(WM_USER + 100,0,0); </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>v_pFrameWnd-&gt;m_bThreadExit = TRUE; </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return 0; </span></strong></p>
<p align=left><strong><span>} </span></strong></p>
<p align=left><span>然后再<span> OnCreate </span>当中添加如下代码： </span></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span>m_bThreadExit = FALSE; </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>AfxBeginThread(ThreadProc,this); </span></strong></p>
<p align=left><strong><span>&nbsp;</span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>while(TRUE) </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(m_bThreadExit) </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Sleep(55); </span></strong></p>
<p align=left><strong><span>} </span></strong></p>
<p align=left><strong>&nbsp;</strong></p>
<p align=left><span>&nbsp;OK </span><span>编译<span> F5 </span>运行 发现程序 进入无响应状态，好这时我么让程序 暂停： </span></p>
<p align=left><span>看看<span> 2</span>个<span>Thread </span>的<span> Call Stack </span>都停在那里了？ </span></p>
<p align=left><span>Main Thread</span><span>如下： </span></p>
<p>&nbsp;</p>
<p align=left><span><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image001_10.gif"><img height=20 alt=clip_image001 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image001_thumb_4.gif" width=20 border=0 v:shapes="_x0000_i1033"></a></span><span>此主题相关图片如下：</span><span><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image006_2.gif"><img height=303 alt=clip_image006 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image006_thumb.gif" width=551 border=0 v:shapes="_x0000_i1034"></a></span></p>
<p align=left><span>在看看 另一个线成： </span></p>
<p align=left><span><br><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image001_12.gif"><img height=20 alt=clip_image001 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image001_thumb_5.gif" width=20 border=0 v:shapes="_x0000_i1035"></a></span><span>此主题相关图片如下：</span><span><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image007_2.gif"><img height=345 alt=clip_image007 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/SendMessage_144BE/clip_image007_thumb.gif" width=652 border=0 v:shapes="_x0000_i1036"></a></span></p>
<p align=left><strong><span>这会 是不是 很明了了 </span></strong></p>
<p align=left><strong><span>MainThread&nbsp;</span></strong><strong><span>停在 循环内 等待<span> m_bThreadExit </span>为<span> True</span>，而 另一个线成 则等待<span> MainThread </span>处理完毕<span> WM_USER + 100 </span>这个消息，结果你等我，我等你，死了。。。。 </span></strong></p>
<p align=left><strong><span>(</span></strong><strong><span>一<span>)</span></span></strong><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span>处理办法 </span></strong></p>
<p align=left><span>1</span><span>．</span>&nbsp;<span>针对上面的例子 我们 可以通过 把<strong><span>SendMessage</span></strong><span> </span>改成 <strong><span>PostMessage</span></strong><span> </span>的方法来放弃等待。 这样就解决了 </span></p>
<p align=left><span>2</span><span>．</span>&nbsp;<span>有些时候 第<span>1</span>种方法不符合要求比如下面这中情况 </span></p>
<p align=left><strong><span>UINT ThreadProc(LPVOID lParam) </span></strong></p>
<p align=left><strong><span>{ </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CMainFrame * v_pFrameWnd = (CMainFrame *)lParam; </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(v_pFrameWnd) </span></strong></p>
<p>&nbsp;</p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>v_pFrameWnd-&gt;SetWindowText("lvyang"); </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>v_pFrameWnd-&gt;m_bThreadExit = TRUE; </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return 0; </span></strong></p>
<p align=left><strong><span>} </span></strong></p>
<p align=left><span>这里面的<span>CWnd</span>：：<span>SetWindowText</span>里面实际上调用的是：：<span>SetWindowText </span>而：：<span>SetWindowText </span>里面有调用<span> SendMessage </span>发送一个消息给<span>CWnd </span>的窗口 ，因为：：<span>SetWindowText </span>内部的我们没有办法来修改，那我只能去修改<span> MainThread </span>当中的<span> While </span>循环了。 </span></p>
<p align=left>&nbsp;</p>
<p align=left><span>那如何修改呢？<span> ThreadProc </span>当中<span> SetWindowText</span>之所以被诸塞，就是因为 它向<span> MainThread SendMessage </span>的消息没有得到处理，那么我们让他处理的不就<span>OK</span>了吗？好那我们就让他处理，代码如下： </span></p>
<p align=left><strong><span>MSG msg; </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>while(TRUE) </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(m_bThreadExit) </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><em><span>if(::PeekMessage(&amp;msg,NULL,NULL,NULL,PM_NOREMOVE)) </span></em></strong></p>
<p align=left><strong><em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ </span></em></strong></p>
<p align=left><strong><em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(::GetMessage(&amp;msg,NULL,NULL,NULL)) </span></em></strong></p>
<p align=left><strong><em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ </span></em></strong></p>
<p align=left><strong><em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(!PreTranslateMessage(&amp;msg)) </span></em></strong></p>
<p align=left><strong><em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ </span></em></strong></p>
<p align=left><strong><em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>::TranslateMessage(&amp;msg); </span></em></strong></p>
<p align=left><strong><em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>::DispatchMessage(&amp;msg); </span></em></strong></p>
<p align=left><strong><em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} </span></em></strong></p>
<p align=left><strong><em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} </span></em></strong></p>
<p align=left><strong><em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} </span></em></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Sleep(55); </span></strong></p>
<p align=left><strong><span>} </span></strong></p>
<p align=left><strong><span>终于搞完了 </span></strong></p>
</div>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/69794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2008-12-19 08:42 <a href="http://www.cppblog.com/SpringSnow/articles/69794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：浅层数据结构（结构型）vs 深层数据结构（聚合型）</title><link>http://www.cppblog.com/SpringSnow/articles/65421.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 28 Oct 2008 15:43:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/65421.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/65421.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/65421.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/65421.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/65421.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.cppblog.com/woaidongmao/archive/2008/10/25/64977.html"><font color=#223355>浅层数据结构（结构型）vs 深层数据结构（聚合型）</font></a> </h2>
<div class=postbody>
<p>&nbsp;</p>
<p>构建系统数据模型时，有2共选择，以：group-&gt;account-&gt;son account举例</p>
<p>1、系统由多个group组成；</p>
<p>2、一个group有多个account;</p>
<p>3、一个account有多个son account.</p>
<p>&nbsp;</p>
<p>有2种数据模型构建方式选择；</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/4cac8ae978bb_1AE5/image_2.png"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=388 alt=image src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/4cac8ae978bb_1AE5/image_thumb.png" width=845 border=0></a> </p>
<p>1、模式一的数据模型由3张表构成：groups表，accounts表，son accounts表。是浅层数据结构（结构型），每张表的深度是1。accounts表将有一个[group]字段关联到groups表里面的某条记录；son accounts表将有一个[account]字段关联到accounts表里面的某条记录。可以说这是一种经典的数据结构，结构型数据库就是由这样深度为1的二维型数据表构成，多张表之间的关系通过增加关联字段来标明；</p>
<p>2、模式二的数据模型中，把group视作一个整体，它是数据层的一个基本单元（unit），数据层由多个group对象组成，group对象的深度是3，是深层数据结构（聚合型）。现实的模型对应为对象型数据库；</p>
<p>&nbsp;</p>
<p>现在的问题是：模式一简单还是模式二简单？哪一种是更为优越的选择？我倾向于模式一，因为：</p>
<p>1、结构型数据建模是经典的，目前依然是主流的，得到数据库的广泛支持，即使不使用数据库，也容易序列化到存储，并且我相信群众，相信主流意志的正确性；</p>
<p>2、模式二的对象型数据建模，group是数据元，是数据操作的唯一入口，所以需要提供account，son account的操作接口，account又需要提供son account的操作接口，假设对象深度再多增加几层，那这是一个庞大且累赘的冗余。另外一点是树形的对象不容易序列化，没有太多数据库支持；</p>
<p>3、模式二的层次太深，复杂度级数上升，违反了系统弱化成小类模型的原则（多个类，每个类的复杂度都很低），而这里，group将是一个很大的类。</p>
<p>4、第一感觉：模式一的复杂度我能控制，模式二就没有把握，所以心里更认同模式一；</p>
<p>5、虽然模式二直观的表明了数据的聚合-组合关系，与现实模型完全隐射，在理论上应该是更好的选择。但是就人的理解能力的倾向来说：我认为理解广度的事务比较理解深度的事务而言更有优势；</p>
<p>6、写到这里，我突然想说一句：<font color=#ff0000>化深度为广度，符合人的认知规律，降低了复杂度。</font></p>
</div>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/65421.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2008-10-28 23:43 <a href="http://www.cppblog.com/SpringSnow/articles/65421.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：不错的管理文章</title><link>http://www.cppblog.com/SpringSnow/articles/65140.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Sun, 26 Oct 2008 13:56:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/65140.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/65140.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/65140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/65140.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/65140.html</trackback:ping><description><![CDATA[&nbsp;转自 http://www.joy2u.co.uk<br><br>一、 素养<br><br>蓝斯登原则：在你往上爬的时候，一定要保持梯子的整洁，否则你下来时可能会滑倒。<br>提出者：美国管理学家蓝斯登。<br>点评：进退有度，才不至进退维谷；宠辱皆忘，方可以宠辱不惊。<br><br>卢维斯定理 ：谦虚不是把自己想得很糟，而是完全不想自己。<br>提出者：美国心理学家卢维斯<br>点评：如果把自己想得太好，就很容易将别人想得很糟。<br><br>托利得定理：测验一个人的智力是否属于上乘，只看脑子里能否同时容纳两种相反的思想，而无碍于其处世行事。<br>提出者：法国社会心理学家托利得<br>点评：思可相反，得须相成。<br><br>二、统御<br><br>刺猬理论：刺猬在天冷时彼此靠拢取暖，但保持一定距离，以免互相刺伤。<br>点评：保持亲密的重要方法，乃是保持适当的距离。<br><br>鲦鱼效应：鲦鱼因个体弱小而常常群居，并以强健者为自然首领。将一只稍强的鲦鱼脑后控制行为的部分割除后，此鱼便失去自制力，行动也发生紊乱，但其他鲦鱼却仍像从前一样盲目追随。<br>提出者：德国动物学家霍斯特<br>点评：1、下属的悲剧总是领导一手造成的。 2、下属觉得最没劲的事，是他们跟着一位最差劲的领导。<br><br>雷鲍夫法则 ：在你着手建立合作和信任时要牢记我们语言中：<br>1、最重要的八个字是：我承认我犯过错误<br>2、最重要的七个字是：你干了一件好事<br>3、最重要的六个字是：你的看法如何<br>4、最重要的五个字是：咱们一起干<br>5、最重要的四个字是：不妨试试<br>6、最重要的三个字是：谢谢您<br>7、最重要的两个字是：咱们<br>8、最重要的一个字是：您<br>提出者：美国管理学家雷鲍夫<br>点评：1、最重要的四个字是：不妨试试； 2、最重要的一个字是：您<br><br>洛伯定理：对于一个经理人来说，最要紧的不是你在场时的情况，而是你不在场时发生了什么。<br>提出者：美国管理学家洛伯<br>点评：如果只想让下属听你的，那么当你不在身边时他们就不知道应该听谁的了。<br><br>三、沟通<br><br>斯坦纳定理 ：在哪里说得愈少，在哪里听到的就愈多。<br>提出者：美国心理学家斯坦纳<br>点评：只有很好听取别人的，才能更好说出自己的。<br><br>费斯诺定理：人两只耳朵却只有一张嘴巴，这意味着人应该多听少讲。<br>提出者：英国联合航空公司总裁兼总经理费斯诺<br>点评：说得过多了，说的就会成为做的障碍。<br><br>牢骚效应：凡是公司中有对工作发牢骚的人，那家公司或老板一定比没有这种人或有这种人而把牢骚埋在肚子里公司要成功得多。<br>提出者：美国密歇根大学社会研究院<br>点评：1、牢骚是改变不合理现状的催化剂。 2、牢骚虽不总是正确的，但认真对待牢骚却总是正确的。<br><br>避雷针效应：在高大建筑物顶端安装一个金属棒，用金属线与埋在地下的一块金属板连接起来，利用金属棒的尖端放电，使云层所带的电和地上的电逐渐中和，从而保护建筑物等避免雷击。<br>点评：善疏则通，能导必安<br><br>四、协调<br><br>氨基酸组合效应：组成人体蛋白的八种氨基酸，只要有一种含量不足，其他七种就无法合成蛋白质。<br>点评：当缺一不可时，一就是一切。<br><br>米格-25效应：前苏联研制的米格-25喷气式战斗机的许多零部件与美国的相比都落后，但因设计者考虑了整体性能，故能在升降、速度、应急反应等方面成为当时世界一流。<br>点评：所谓最佳整体，乃是个体的最佳组合。<br><br>磨合效应：新组装的机器，通过一定时期的使用，把磨擦面上的加工痕迹磨光而变得更加密合。<br>点评：要想达到完整的契合，须双方都做出必要的割舍。<br>　<br><br>五、指导<br><br>波特定理：当遭受许多批评时，下级往往只记住开头的一些，其余就不听了，因为他们忙于思索论据来反驳开头的批评。<br>提出者：英国行为学家波特<br>点评：总盯着下属的失误，是一个领导者的最大失误。<br><br>蓝斯登定律 ：跟一位朋友一起工作，远较在父亲之下工作有趣得多。<br>提出者：美国管理学家蓝斯登<br>点评：可敬不可亲，终难敬；有权没有威，常失权。<br><br>吉尔伯特法则 ：工作危机最确凿的信号，是没有人跟你说该怎样作。<br>提出者：英国人力培训专家吉尔伯特<br>点评：真正危险的事，是没人跟你谈危险。<br><br>权威暗示效应：一化学家称，他将测验一瓶臭气的传播速度，他打开瓶盖15秒后，前排学生即举手，称自己闻到臭气，而后排的人则陆续举手，纷纷称自己也已闻到，其实瓶中什么也没有。<br>点评：迷信则轻信，盲目必盲从。<br>　<br><br>六、组织<br><br>奥尼尔定理 ：所有的政治都是地方的。<br>提出者：美国前众议院院长奥尼尔<br>点评：只有能切身体会到的，群众才认为那是真实的。<br><br>定位效应：社会心理学家曾作过一个试验：在召集会议时先让人们自由选择位子，之后到室外休息片刻再进入室内入座，如此五至六次，发现大多数人都选择他们第一次坐过的位子。<br>点评：凡是自己认定的，人们大都不想轻易改变它。<br><br>艾奇布恩定理：如果你遇见员工而不认得，或忘了他的名字，那你的公司就太大了点。<br>提出者：英国史蒂芬约瑟剧院导演亚伦艾奇布恩<br>点评：摊子一旦铺得过大，你就很难把它照顾周全。<br>　<br><br>七、培养<br><br>吉格勒定理 ：除了生命本身，没有任何才能不需要后天的锻炼。<br>提出者：美国培训专家吉格吉格勒<br>点评：水无积无辽阔，人不养不成才。<br><br>犬獒效应：当年幼的藏犬长出牙齿并能撕咬时，主人就把它们放到一个没有食物和水的封闭环境里让这些幼犬自相撕咬，最后剩下一只活着的犬，这只犬称为獒。据说十只犬才能产生一只獒。<br>点评：困境是造就强者的学校。<br>　<br><br>八、选拔<br><br>近因效应 ：最近或最后的印象对人的认知有强烈的影响。<br>提出者：美国社会心理学家洛钦斯。<br>点评：结果往往会被视为过程的总结。<br><br>洒井法则：在招工时用尽浑身解数，使出各种方法，不如使自身成为一个好公司，这样人才自然而然会汇集而来。<br>提出者：日本企业管理顾问酒井正敬。<br>点评：不能吸引人才，已有的人才也留不住。<br><br>美即好效应：对一个外表英俊漂亮的人，人们很容易误认为他或她的其他方面也很不错。<br>提出者：美国心理学家丹尼尔麦克尼尔。<br>点评：印象一旦以情绪为基础，这一印象常会偏离事实。<br>　<br><br>九、任用<br><br>奥格尔维法则：如果我们每个人都雇用比我们自己都更强的人，我们就能成为巨人公司。<br>提出者：美国奥格尔维马瑟公司总裁奥格尔维。<br>点评：如果你所用的人都比你差，那么他们就只能作出比你更差的事情。<br><br>皮尔卡丹定理 ：用人上一加一不等于二，搞不好等于零。<br>提出者：法国著名企业家皮尔卡丹。<br>点评：组合失当，常失整体优势，安排得宜，才成最佳配置。<br>　<br><br>十、激励<br><br>马蝇效应：再懒惰的马，只要身上有马蝇叮咬，它也会精神抖擞，飞快奔跑。<br>点评：有正确的刺激，才会有正确的反应。<br><br>倒u形假说：当一个人处于轻度兴奋时，能把工作作得最好。当一个人一点儿兴奋都没有时，也就没有作好工作的动力了；相应地，当一个人处于极度兴奋时，随之而来的压力可能会使他完不成本该完成的工作。世界网坛名将贝克尔之所以被称为常胜将军，其秘诀之一即是在比赛中自始至终防止过度兴奋，而保持半兴奋状态。所以有人亦将倒u形假说称为贝克尔境界。<br>提出者：英国心理学家罗伯特?耶基斯和多德林。<br>点评：1、激情过热，激情就会把理智烧光。 2、热情中的冷静让人清醒，冷静中的热情使人执着。<br>　<br><br>十一、调研<br><br>特伯论断 ：在数字中找不到安全。<br>提出者：美国经济学家特伯。<br>点评：数字是死的，情况是活的。<br><br>摩斯科定理 ：你得到的第一个回答，不一定是最好的回答。<br>提出者：美国管理学家摩斯科。<br>点评：刨根得根，问底知底。<br>　<br><br>十二、预测<br><br>罗杰斯论断：成功的公司不会等待外界的影响来决定自己的命运，而是始终向前看。<br>提出者：美国IBM公司前总裁罗杰斯。<br>点评：只想随波逐流，难有理想彼岸。<br><br>萨盖定律：戴一块手表的人知道准确的时间，戴两块手表的人便不敢确定几点了。<br>提出者：英国心理学家萨盖。<br>点评：若选错误参照，必无正确比较。<br><br>隧道视野效应：一个人若身处隧道，他看到的就只是前后非常狭窄的视野。<br>点评：1、不拓心路，难开视野。2、视野不宽，脚下的路也会愈走愈窄。<br>　<br><br>十三、目标<br><br>巴菲特定律 ：在其他人都投了资的地方去投资，你是不会发财的。<br>提出者：美国股神巴菲特。<br>点评：1、善于走自己的路，才可望走别人没走过的路。2、特色不特，优势无优。<br><br>古特雷定理 ：每一处出口都是另一处的入口。<br>提出者：美国管理学家古特雷。<br>点评：上一个目标是下一个目标的基础，下一个目标是上一个目标的延续。<br>　<br><br>十四、计划<br><br>列文定理：那些犹豫着迟迟不能作出计划的人，通常是因为对自己的能力没有把握。<br>提出者：法国管理学家列文。<br>点评：如果没有能力去筹划，就只有时间去后悔了。<br><br>弗洛斯特法则 ：在筑墙之前应该知道把什么圈出去，把什么圈进来。<br>提出者：美国思想家弗洛斯特。<br>点评：开始就明确了界限，最终就不会作出超越界限的事来。<br>　<br><br>十五、参谋<br><br>波克定理 ：只有在争辩中，才可能诞生最好的主意和最好的决定。<br>提出者：美国庄臣公司总经理詹姆士?波克。<br>点评：无磨擦便无磨合，有争论才有高论。<br><br>韦奇定理：即使你已有了主见，但如果有十个朋友看法和你相反，你就很难不动摇。<br>提出者：美国洛杉矶加州大学经济学家伊渥?韦奇。<br>点评：1、未听之时不应有成见，既听之后不可无主见。 2、不怕开始众说纷纭，只怕最后莫衷一是。<br>　<br><br>十六、决策<br><br>福克兰定律 ：没有必要作出决定时，就有必要不作决定。<br>提出者：法国管理学家福克兰。<br>点评：当不知如何行动时，最好的行动就是不采取任何行动。<br><br>王安论断：犹豫不决固然可以免去一些作错事的机会，但也失去了成功的机遇。<br>提出者：美籍华裔企业家王安博士。<br>点评：寡断能使好事由好变坏，果断可将危机转危为安。<br>　<br><br>十七、执行<br><br>格瑞斯特定理 ：杰出的策略必须加上杰出的执行才能奏效。<br>提出者：美国企业家格瑞斯特。<br>点评：好事干实更好，实事办好愈实。<br><br>吉德林法则 ：把难题清清楚楚地写出来，便已经解决了一半。<br>提出者：美国通用汽车公司管理顾问查尔斯?吉德林。<br>点评：杂乱无章的思维，不可能产生有条有理的行动。<br>　<br><br>十八、信息<br><br>沃尔森法则 ：把信息和情报放在第一位，金钱就会滚滚而来。<br>提出者：美国企业家沃尔森。<br>点评：你能得到多少，往往取决于你能知道多少。<br><br>塔马拉效应：塔马拉是捷克雷达专家弗?佩赫发明的一种雷达，它与其他雷达的最大不同是不发射信号而只接收信号，故不会被敌方反雷达装置发现。<br>点评：善藏者人不可知，能知者人无以藏。<br>　<br><br>十九、监督<br><br>小池定理 ：越是沉醉，就越是抓住眼前的东西不放。<br>提出者：日本管理学家小池敬。<br>点评：自我陶醉不易清醒，自以为是不喜批评。<br><br>赫勒法则 ：当人们知道自己的工作成绩有人检查的时候会加倍努力。<br>提出者：英国管理学家赫勒。<br>点评：只有在相互信任的情况下，监督才会成为动力。<br>　<br><br>二十、控制<br><br>横山法则：最有效并持续不断的控制不是强制，而是触发个人内在的自发控制。<br>提出者：日本社会学家横山宁夫。<br>点评：有自觉性才有积极性，无自决权便无主动权<br><br>蝴蝶效应：紊乱学研究者称，南半球某地的一只蝴蝶偶尔扇动一下翅膀所引起的微弱气流，几星期后可变成席卷北半球某地的一场龙卷风。他们将这种由一个极小起因，经过一定的时间，在其他因素的参与作用下，发展成极为巨大和复杂后果的现象称为蝴蝶效应。<br>点评：善终者慎始，谨小者慎微。<br><br>阿什法则 ：承认问题是解决问题的第一步。<br>提出者：美国企业家阿什。<br>点评：你愈是躲着问题，问题愈会揪住你不放。<br>　<br><br>二十一、法纪<br><br>洛克忠告 ：规定应该少定，一旦定下之后，便得严格遵守。<br>提出者：英国教育家洛克 。<br>点评：简则易循，严则必行。<br><br>热炉法则：当人用手去碰烧热的火炉时，就会受到烫的惩罚，其有以下三个特点：即时性、预警性、平等性。<br>点评：罪与罚能相符，法与治可相期。<br>　<br><br>二十二、改革<br><br>柯美雅定律：世上没有十全十美的东西，所以任何东西都有改革的余地。<br>提出者：美国社会心理学家柯美雅。<br>点评：不拘于常规，才能激发出创造力。<br><br>达维多夫定律 ：没有创新精神的人永远也只能是一个执行者。<br>提出者：前苏联心理学家达维多夫<br>点评：只有敢为人先的人，才最有资格成为真正的先驱者。<br><br>自吃幼崽效应：美国硅谷企业竞争十分激烈，以至于各公司都积极寻找自己的致命弱点，所有公司共同的生存之道是：拿出更好看产品来击败自己的原有产品。有人将这种行为戏称为自吃幼崽。<br>点评：1、自己不逼自己，别人迟早会逼你。 2、敢于对过去告一个段落，才有信心掀开新的一章。<br>　<br><br>二十三、创新<br><br>舍恩定理：新思想只有落到真正相信它，对它着迷的人手里才能开花结果。<br>提出者：美国麻省理工学院教授舍恩。<br>点评：只有信之不疑，才能持之以恒。<br><br>吉宁定理 ：真正的错误是害怕犯错误。<br>提出者：美国管理学家吉宁。<br>点评：不怕错误的人，错误往往也离他最远。<br><br>卡贝定理 ：放弃是创新的钥匙。<br>提出者：美国电话电报公司前总经理卡贝。<br>点评：在未学会放弃之前，你将很难懂得什么是争取。&nbsp;
<img src ="http://www.cppblog.com/SpringSnow/aggbug/65140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2008-10-26 21:56 <a href="http://www.cppblog.com/SpringSnow/articles/65140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序员的九重境界</title><link>http://www.cppblog.com/SpringSnow/articles/64660.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 21 Oct 2008 15:40:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/64660.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/64660.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/64660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/64660.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/64660.html</trackback:ping><description><![CDATA[第一重： <br>在哪本电脑杂志上看见软件工程师这个职业介绍，或者走在大街上看见某某软件培训机构鼓吹培训完就能年薪10万的广告，有些羡慕那些编程序的，自己有些蠢蠢欲动。 <br>第二重： <br>用控制台或者说SDK之类的东西写了一个&#8220;HELLO WORLD!&#8221;,感觉编程这个东西，太简单没难度。 <br>第三重： <br>学会了简单的使用某某工具例如VC，知道怎么利用工具创建对话框之类的东西了，认为自己已经有了&#8220;扎实&#8221;的基础，出去找工作四面碰壁之后感叹人心不古世态炎凉。 <br>第四重： <br>以极低的要求找到工作，突然发现自己不会的实在是太多太多，不求甚解是无奈之举。这个阶段写代码写完之后主要是试，试的标准：&#8220;能运行就是成功，不能运行就是失败。&#8221;一个小模块写完之后被黑盒蹂躏几十次稀松平常。 <br>第五重： <br>突然意识到不能再瞎干了，于是知道了如何规范的写代码，尽力的把代码写的短小精悍，看一堆关于算法的书，并且会把自己的或者别人的优秀代码分门别类存起来，以便经常参考使用。 <br>第六重： <br>做的时间越长，发现自己不会的越来越多，每每遇到不太理解的必然刨根问底，写完一段代码，一定仔仔细细把程序研究个透，不让他出现一点泄漏一点警告才罢休，以挑战白盒作为乐趣。 <br>第七重： <br>把各种工具研究个稀巴烂，即使一个全新的语言或者工具，也能在半个月之内熟练使用，这个时候，仍然认为自己距离高手还有很大差距，遇到新手来公司面试，很惊讶这些人居然连怎么操作内存都不会就敢出来混了? <br>第八重： <br>把编程工具用烦了，开始喜欢控制台或者说SDK，纯粹的API编程变成了自己的最大乐趣。 <br>第九重： <br>在电脑杂志上看见软件工程师的职业介绍，或者走在大街上看见某某软件培训机构鼓吹培训完就能年薪10万的广告，想对后来人说些什么却终究发现无话可说，只好一笑而过。 <br><br>第一重到第四重，需要努力，第五重到第六重，需要悟性，想到第九重，需要智商和福缘。<br><br>在CSDN上看到这个介绍，想想自己也就在第五重，输入想学习的阶段。那么一点悟性是需要好好悟一下的。<br><br>先要从第五重跳到第6重才行。
<img src ="http://www.cppblog.com/SpringSnow/aggbug/64660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2008-10-21 23:40 <a href="http://www.cppblog.com/SpringSnow/articles/64660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>google面试题</title><link>http://www.cppblog.com/SpringSnow/articles/64658.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 21 Oct 2008 15:36:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/64658.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/64658.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/64658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/64658.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/64658.html</trackback:ping><description><![CDATA[几星期前，一个朋友接受了Google公司的面试，他透露了面试中的一些问题。顺便，我把从其他几个曾经面试过的人那里听来的内容也整理在一起。最大的互联网公司Google的一份面试题集，看看你是否能够回答出来。其中很多问题都是开放式的，正确的解答有许多种，所以在这里就不提供答案了。 <br><br><br>一辆学校班车里面能装多少个高尔夫球？ <br>你被缩小到只有硬币厚度那么点高（不是压扁，是按比例缩小），然后被扔到一个空的玻璃搅拌器中，搅拌刀片一分钟后就开始转动。你怎么办？ <br>要是让你清洗整个西雅图的所有窗子，你会收取多少费用？ <br>怎么才能识别出电脑的内存堆栈是向上溢出还是向下溢出？ <br>你要向你8岁的侄子解释什么是数据库，请用三句话完成。 <br>时钟的指针一天内会重合几次？ <br>你需要从A地去B地，但你不知道能不能到，这时该怎么办？ <br>好比你有一个衣橱，里面塞满了各种衬衫，你会怎么整理这些衬衫，好让你以后找衬衫的时候容易些？ <br>有个小镇有100对夫妇，每个丈夫都在欺骗他的妻子。妻子们都无法识破自己丈夫的谎言，但是她们却能知道其他任何一个男人是否在撒谎。镇上的法律规定不准通奸，妻子一旦证明丈夫不忠就应该立刻杀死他，镇上所有妇女都必须严格遵守这项法律。有一天，镇上的女王宣布，至少有一个丈夫是不忠的。这是怎么发生的呢？ <br>在一个重男轻女的国家里，每个家庭都想生男孩，如果他们生的孩子是女孩，就再生一个，直到生下的是男孩为止。这样的国家，男女比例会是多少？ <br>如果在高速公路上30分钟内到一辆车开过的几率是0.95，那么在10分钟内看到一辆车开过的几率是多少 （假设为常概率条件下） <br>如果你看到钟的时间是3:15，那一刻时针和分针的夹角是多少？（肯定不是0度！） <br>4个人晚上要穿过一座索桥回到他们的营地。可惜他们手上只有一支只能再坚持17分钟的手电筒。通过索桥必须要拿着手电，而且索桥每次只能撑得起两个人的份量。这四个人过索桥的速度都不一样，第一个走过索桥需要1分钟，第二个2分钟，第三个5分钟，最慢的那个要10分钟。他们怎样才能在17分钟内全部走过索桥？ <br>你和朋友参加聚会，包括你们两人在内一共有10个人在场。你朋友想跟你打赌，说这里每有一个人生日和你相同，你就给他1元，每有一个人生日和你不同，他给你2元。你会接受么？ <br>全世界有多少个钢琴调音师？ <br>你有8个一样大小的球，其中7个的重量是一样的，另一个比较重。怎样能够用天平仅称两次将那个重一些的球找出来。 <br>有5个海盗，按照等级从5到1排列。最大的海盗有权提议他们如何分享100枚金币。但其他人要对此表决，如果多数反对，那他就会被杀死。他应该提出怎样的方案，既让自己拿到尽可能多的金币又不会被杀死？（提示：有一个海盗能拿到98%的金币）
<img src ="http://www.cppblog.com/SpringSnow/aggbug/64658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2008-10-21 23:36 <a href="http://www.cppblog.com/SpringSnow/articles/64658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软面试算法题——摘自CSDN</title><link>http://www.cppblog.com/SpringSnow/articles/64657.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 21 Oct 2008 15:35:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/64657.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/64657.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/64657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/64657.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/64657.html</trackback:ping><description><![CDATA[(1) <br>一个整数数列，元素取值可能是0~65535中的任意一个数，相同数值不会重复出现。0是例外，可以反复出现。 <br>请设计一个算法，当你从该数列中随意选取5个数值，判断这5个数值是否连续相邻。 <br>注意： <br>- 5个数值允许是乱序的。比如： 8 7 5 0 6 <br>- 0可以通配任意数值。比如：8 7 5 0 6 中的0可以通配成9或者4 <br>- 0可以多次出现。 <br>- 复杂度如果是O(n2)则不得分。 <br><br>(2) <br>设计一个算法，找出二叉树上任意两个结点的最近共同父结点。 <br>复杂度如果是O(n2)则不得分。 <br><br>(3) <br>一棵排序二叉树，令 f=(最大值+最小值)/2，设计一个算法，找出距离f值最近、大于f值的结点。 <br>复杂度如果是O(n2)则不得分。 <br><br>(4) <br>一个整数数列，元素取值可能是1~N（N是一个较大的正整数）中的任意一个数，相同数值不会重复出现。设计一个算法，找出数列中符合条件的数对的个数，满足数对中两数的和等于N+1。 <br>复杂度最好是O(n)，如果是O(n2)则不得分。 
<img src ="http://www.cppblog.com/SpringSnow/aggbug/64657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2008-10-21 23:35 <a href="http://www.cppblog.com/SpringSnow/articles/64657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket的基本原理</title><link>http://www.cppblog.com/SpringSnow/articles/57763.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Fri, 01 Aug 2008 07:09:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/57763.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/57763.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/57763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/57763.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/57763.html</trackback:ping><description><![CDATA[引一个老师的话：&#8220;来网络中心不懂网络&#8221;。的确在这里学习了近一年，网络的皮毛都没摸着，惭愧！！甚至汗颜。<br>做的项目有网络的，但一直不属于我涉及范围，让我眼馋羡慕，不过想想自己也不懂，外加也没个氛围，从一开始想，到后面不想，甚至到现在有些懒得不想碰了。也只能说明任何一个人，大多像我这样的，不是机遇没来找你，而是你与他擦身而过罢了。<br>今天也闲得发慌，突然想到了，学习一下。<br>
<h2><a title="Permanent Link to &#10;            基于 TCP/IP 的 SOCKET 编程的基本原理" href="http://zeuscn.net/studio/2007/09/14/tcp-ip-socket/" rel=bookmark><u><font color=#810081>基于 TCP/IP 的 SOCKET 编程的基本原理</font></u></a></h2>
目的： <em>TCP/IP 所组建网络的不同机器之间利用客户/服务器模式建立通信连接。</em><br>方法：<em>为建立该连接，开发人员只要提供一些基本的连接信息，其余由操作系统内核来完成。</em><br><br><em>提供哪些信息呢？<br>以机器A通过 TCP/IP 与机器B进行网络通信为例，对于机器A来说我们需要知道如下信息：<br>1、机器B的TCP/IP地址：<br>2、与机器B中哪一个进程(或软件系统)联系。</em><br><br>同样的对于第一个我还可以理解，第二个就不是很清楚。作者缓缓到来，原来使用标准接口的时候，无须定义，因为我们知道和谁进行交互，然而使用其它的则没有那么明了，所以就需要提供第二个参数了。<br><br><em>以上两个需要提供的参数，在套接字中分别表示为机器B的地址和机器B的通信端口。通过在同一机器的不同通信软件中定义不同端口地址，来表示机器A是与机器B中哪套系统通信。不管是利用何种协议，完全建立一个网络连接需要五个基本信息。它们分别是<strong>双方的地址</strong>、<strong>约定的通讯端口</strong>和<strong>协议类型</strong>。SOCKET 通信编程接口并不是专门为 TCP/IP 通信提供的，因此套接字通信编程需要在参数中指明通信协议类型。套接字是利用客户/服务器模式来实现通信的，客户端软件和服务器端软件的具体实现也有所不同。<br><br>具体来说，在客户端利用基于 TCP/IP 和 SOCKET 通信编程的基本步骤是：<br>① 声明一个套接字类型的变量，需要在该变量定义中提供本机 IP 地址和通信端口并指明协议类型，由于在此介绍的是基于 TCP/IP 的套接字通信，因此协议类型应该是 TCP/IP，在编程接口中该类型用 AF-INET 来表示；<br>② 向对方发出连接请求，连接时编程者需要提供对方 TCP/IP 地址和通信端口，同时 SOCKET 实现程序自动向对提供本机 TCP/IP 地址和通信端口；<br>③ 如果连接成功，会收到对方的应答信号，这以后的通信就可以通过套接字的相关操作来实现了。<br><br></em>步骤：第一步是要声明一个套接字类型的变量，并在该变量定义中提供本机的IP地址、通信端口和协议类型。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二步向对方发送连接请求。此时需要知道对方的地址和端口，并向对方提供地址和通信端口。<br><br>看起来挺简单的，今年一月份还想做一个代理服务器的小程序，一直搞不清楚怎么回事，最后作罢。<br><br>努力呀。<br><br>学习内容的来源：<a href="http://zeuscn.net/studio/2007/09/14/tcp-ip-socket/">http://zeuscn.net/studio/2007/09/14/tcp-ip-socket/</a><br>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/57763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2008-08-01 15:09 <a href="http://www.cppblog.com/SpringSnow/articles/57763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>