??xml version="1.0" encoding="utf-8" standalone="yes"?>久久AAAA片一区二区,中文字幕久久亚洲一区,精品久久久久久国产91http://www.shnenglu.com/SpringSnow/category/7661.html雪化了,花开了,春天来了zh-cnMon, 22 Jun 2009 04:13:36 GMTMon, 22 Jun 2009 04:13:36 GMT60? COMlg?/title><link>http://www.shnenglu.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.shnenglu.com/SpringSnow/articles/88252.html</guid><wfw:comment>http://www.shnenglu.com/SpringSnow/comments/88252.html</wfw:comment><comments>http://www.shnenglu.com/SpringSnow/articles/88252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/SpringSnow/comments/commentRss/88252.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/SpringSnow/services/trackbacks/88252.html</trackback:ping><description><![CDATA[<div id="n7bj9dr" class=postTitle><a class=postTitle2 id=viewpost1_TitleUrl href="http://www.shnenglu.com/3522021224/archive/2007/06/22/26803.html"><u><font color=#800080>COMlg?/font></u></a> </div> <div id="7tnzfzt" class=postText style="FONT-SIZE: 10pt"> <p>面向对象的思想难以适应q种分布式Y件模型,于是lg化程序设计思想得到了迅速的发展?/p> <p>按照lg化的E序设计的思想Q复杂的应用E序被设计成一些小的,功能单一的组件模块,q些lg模块可以q行在同一台机器上Q也可以q行在不同的机器上?/p> <p>Z实现q样的应用YӞl徏E序和组建程序之间需要一些极为细致的规范Q?只有lgE序遵守了这些共同的规范Q然间系l才能正常运行?/p> <p>为此QOMG和Microsoft分别提出了CORBA(Common Object Request Breaker Architecture)和COM(Component Object model)标准Q目前CORBA模型主要应用于UNIX操作pȝq_上,而COM 则主要应用于Microsoft Windows操作pȝq_上?</p> <p><br>在COM标准中,一个组件程序也被称Z个模块,它可以是一个动态连接库(DLL), 被称E内lg(in-of-process component)也可以是一个可执行E序(EXE)Q被UCؓq程外组?out-of-process component). </p> <p><br>COM对象是徏立在二进制可执行代码U的基础上,而C++{语a中的对象是徏立在源代码基础上的Q因此COM对象是语a无关的。这一Ҏ用不同编E语a开发的lg对象q行交互成ؓ可能?/p> <p>在Microsoft Windowspȝq_上,COM技术被应用于系l的各个层次Q从底层的COM对象理C层的应用E序交互都用CCOM标准?</p> <p><br>概述</p> <p>COM既提Zlg之间q行交互的规范,也提供了实现交互的环境, 因ؓlg对象之间交互的规范不依赖于Q何特定的语言Q所以COM也可以是不同语言协作开发的一U标准?</p> <p><br>OLE技术以COM规范为基QOLE充分发挥了COM标准的优势,使Windows操作pȝ上的应用E序h极强的可交互性。如果没有OLE的支持,Windows操作pȝ则会逊色很多?</p> <p><br>但是QCOM规范q不局限于OLE技术,实际上,OLE技术只是COM的一个应用而已Q这几年QOLE技术在q行|络互连是显C出了很大的局限性,而COM则表现出了极强的适应能力?</p> <p><br>COM标准包括规范和实C大部分,规范部分定义了组件和lg之间通信的机Ӟq些规范不依赖于M特定的语a和操作系l,只要按照该规范,M语言都可以? COM标准的实现部分是COM库,COM库ؓCOM规范的具体实现提供了一些核心服务?</p> <p><br>COM是面对对象的软g模型Q因而对象是他的基本要素之一。类gC++中对象的概念Q对象是某个c?class)的一个实?而类则是一l相关的数据和功能组和在一L一个定义。用对象的应用(或另一个对?成ؓ客户Q有时也成ؓ对象的用戗?</p> <p><br>接口是一l逻辑上相关的函数集合Q其函数也被UCؓ接口成员函数。对象通过接口成员函数为客h供各UŞ式的服务?</p> <p><br>在COM模型中,对象本n对于客户来说是不可见的,客户h服务Ӟ只能通过接口q行。每一个接口都׃?28位的全局唯一标识W?GUID,Globally Unique Identifier)来标识。客户通过GUID获得接口的指针,在通过接口指针Q客户就可以调用其相应的成员函数?</p> <p><br>一般来_接口是不变的Q只要客h望的接口在组建对象中q存在,它就可以l箋使用该接口所提供的服务。对象可以支持多个接口,因此对组件对象的升可通过增加接口的办法实玎ͼq样得到的新接口可以不媄响老接口的使用?</p> <p><br>客户如何来标识COM对象呢?与接口类|每个对象也用一?28位GUID来标识,UCؓCLSID(class identifier,cL识符或类ID)Q用CLSID标识对象可以保证(概率意义?在全球范围内的唯一性?</p> <p><br>只要pȝ中含有这cCOM对象的信息,q包括COM对象所在的模块文g(DLL或EXE文g)以及COM对象在代码中的入口点Q客L序就可以由此CLSID来创建COM对象?</p> <p><br>那么客户怎么使用COM对象所提供的服务呢Q客戯得的又是什么呢Q?/p> <p>实际上,客户成功创徏对象后,它得到的是一个指向对象某个接口的指针Q因为COM对象臛_实现一个接口,所以客户就可以调用该接口提供的所有服务?</p> <p><br>但是COM对象可以有自q状态,正是q种状态才使客h觉到COM对象的存在。如果客户同时拥有两个相同CLSID的对象,则两个对象可以有不同的状态,客户完全不必兛_COM对象是怎么实现的,以及两个对象的状态数据之间有什么关p?数组或者链?。当ӞCOM对象也可以是无状态的Q这UCOM对象以提供功能服务ؓ主,可以用来代替传统的API函数接口Q得应用程序编E接口更为有序,l织层次性更强?</p> <p><br>COM本n除了规范之外Q也有实现的部分Q其中包括一些核心的pȝU代码,也正是这部分核心代码Q才使得对象和客户之间可通过接口在二q制代码U进行交??/p> <p>在Microsoft Windows操作pȝ环境下,q些库以.dll文g的Ş势存在,其中包括以下内容:</p> <p>(1) 提供了少量的API函数实现客户和服务端COM应用的创E。在客户端,主要是一些创建函?而在服务器端Q提供一些对象的讉K支持?/p> <p>(2) COM通过注册表查找本地服务器即EXEE序Q以及程序名与CLSID的{换等?/p> <p>(3) 提供了一些标准的内存控制ҎQ应用控制q程中内存的分配?/p> <p>COM库一般不在应用程序层实现Q而在操作pȝ层次上实玎ͼ因此一个操作系l只有一个COM库实现。而且COM库的实现必须依赖于具体的pȝq_Q尤其是pȝ底层的一些标准?/p> <p>COM库可以保证所有的lg按照l一的方式进行交互操作,而且它我们在编写COM应用Ӟ可以不用~写行COM通信而必需的大量基代码Q而是直接利用COM库提供的APIq行~程Q从而大大加快了开发的速度。例如,现在COM库的版本都支持远E组件即分布式COMQ我们不用编写Q何网l或者RPC(remote procedure call)的代码,可以实现在|络上进行程序之间的通信?</p> <p><br>如果我们用面向对象语a来实现COM对象Q则很自然可以用cȝ定义对象。在C语言中,对象的概念可能变成一个逻辑概念Q如果两个对象同时存在,则在接口实现中必L知道所q行的操作是针对哪个对象的,q个q程可由COM接口的定义保证?</p> <p><br>COM规范使用GUID来标识COM对象的思想源于OSF(Open Software Foundation)采用的UUID(Universallz Unique Identifier), UUID被定义ؓDCE(Distributed Computing Environment)的一部分Q主要用于表识RPC通信的双斏V?</p> <p><br>除了装性和重用性,C++对象q有一个重要特性是多态性。正是C++对象的多态性,才体CC++语言用类描述事物的高度抽象的特征;COM对象?h多态性,但这U多态性需要通过COM对象所h的接口才能体现出来,像C++对象的多态性需要通过?virtual)函数才能体现一栗?</p> <p><br>从API到COM接口</p> <p>假如我们要实C个字处理应用pȝQ它需要一个查字典的功能,按照lg化程序设计的ҎQ自然应该把查字典的功能攑ֈ一个组?.dll)E序中实现。如果以后字典程序的查找法或者字典库改变了,只要应用E序和组件之间的接口不变Q则新的lgE序仍然可以被应用系l用。这是采用lgE序带来的灵zL?</p> <p><br>Z把应用系l和lgE序q接hQ又能它们协同工作Q最单的做法是先定义一l查字典的函敎ͼ而且q组函数可能一般化Q不要加入特定的与字典库相关的知识?</p> <p><br>函数<br> 功能说明<br> <br>Initialize<br> 初始?br> <br>LoadLibrary<br> 装入字典?br> <br>InsertWord<br> 插入一个单?br> <br>DeleteWord<br> 删除一个单?br> <br>LookupWord<br> 查找单词<br> <br>RestoreLibrary<br> 把内存中的字典库存入指定的文件中<br> <br>FreeLibrary<br> 释放字典?br> </p> <p>q面型的API接口层可以很好地把两个程序连接v来,但存在以下一些问题:</p> <p>(1) 当API函数非常多时Q用会非常不方便,需要对函数q行l织?/p> <p>(2) API函数需要标准化Q按照统一的调用方式进行处理,以适应不同的语a~程实现。参数的传递顺序,参数cdQ寒暑返回处理都需要标准化?/p> <p>COM定义了一套完整的接口规范Q不仅可以I补以上API作ؓlg借口的不Iq充分发挥了lg对象的优势,q实Clg对象的多态性?/p> <p>接口定义和标?<br>从技术上Ԍ接口是包含了一l函数的数据l构Q通过q组数据l构Q客户代码可以调用组件对象的功能。接口定义了一l成员函敎ͼq组成员函数是组件对象暴露出来的所有信息,客户E序利用q些函数或的lg对象的服务?</p> <p><br>客户E序用一个指向接口数据机构的指针来调用接口成员函数。接口指针实际上又指向另一个指针,q第二个指针指向一l函敎ͼUCؓ接口函数?虚函数表)Q接口函数表中每一ؓ4个字节长的函数指针,每个函数指针与对象的具体实现q接h。通过q种方式Q客户只要获得了接口指针Q就可以调用到对象的实际功能?</p> <p><br>对于一个接口来_他的虚函数表vtable是确定的Q因此接口的成员函数个数是不变的Q而且成员函数的先后顺序也是不变的;对于每个成员函数来说Q其参数和返回g是确定的?</p> <p><br>在一个接口的定义中,所有这些信息都必须在二q制一U确定,不管什么语aQ只要能支持q样的内存结构描qͼ也就是能够支?#8220;structure“?#8220;record“cdQƈ且这U类型能够包含双重的指向函数指针表的成员Q则它就可以支持接口的描qͼ从而可以用于编写COMlg或者用COMlg?/p> <p>接口描述语言IDL</p> <p>COM规范在采用OSF的DCE规范描述q程调用接口IDL的基上,q行扩展形成了COM接口的描q语a?/p> <p>COM规范使用的IDL接口描述语言不仅可用于定义COM接口Q同时还定义了一些常用的数据cdQ也可以描述自定义的数据l构Q对于接口成员函敎ͼ我们可以指定每个参数的类型,输入输出Ҏ,甚至支持可变长度的数l的描述。IDL支持指针cdQ与C/C++很类伹{?/p> <p>Microsoft Visual C++提供了MIDL工具Q可以把IDL接口描述文g~译成C/C++兼容的接口描q头文g(.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>q程内组?/p> <p>因ؓq程内组件和客户E序q行在同一个进E地址I间中,所以一旦客L序与lgE序建立起通信关系之后Q客L序得到的接口指针指向lgE序中接口的vtableQ这个vtable包含了所有成员函数地址Q客户代码可以直接调用这些成员函敎ͼ所以其效率非常高?/p> <p>因ؓDLLE序是在q行时刻被客戯入到内存中的Q所以DLL模块本n也是独立的,它ƈ不依赖于客户E序?/p> <p>在C++语言中,Z使编制的DLLE序更ؓ通用Q一般指定DLL的引出函C用_stdcall调用习惯Q如果用了_cdecl调用习惯Q则有些~程语言环境׃能用这些DLLE序。C++~译器ؓDLLE序的每个引出函数生成了一个修饰名Q这些修饰名对于不同的编译器q不兼容Q因此,从通用性角度出发,我们在每个函数定义前加上extern ?C“ 说明W。在Visual C++ 开发环境中Q下面的说明语句可以很好的说明一个引出函敎ͼ</p> <p>extern ? C“ int _stdcall MyFunction(int n);</p> <p>Z~制DLLE序Q我们可以按照这L步骤Q?/p> <p>(1) 创徏一个DLL工程</p> <p>(2) Ҏ个引出函敎ͼ使用extern ? C“说明W,以及_stdcall修饰W,如上面对MyFunction函数的说明?/p> <p>(3) 按照传统的编E方法,我们q应该编写一个DEF文gQ用来描qDLLE序的模块信息。在Win32q_上,我们可以不用DEF文gQ而是直接在函数说明时使用_declspec(dllexport)说明W,例如Q?/p> <p>extern ? C“_declspec(dllexport) int _stdcall MyFunction(int n);</p> <p>按照q样的方法徏立v来的DLL模块可以被其他程序调用,因ؓC++q接器会把所有引出函数的信息q接到最l的目标代码中?</p> <p><br>从客L序一Ҏ看,有三个系l函数可用于操作DLLE序QLoadLibrary, GetProcAddress, 和FreeLibrary?</p> <p><br>一般地Q对于DLLE序的用过E按照这L步骤q行Q?/p> <p>首先Q客L序用LoadLibrary函数装入DLLQ该函数q回模块的实例句柄,供以后操作该模块使用?/p> <p>然后Q客L序可以调用GetProcAddress函数获得DLL中引出的函数的地址Q我们既可以按函数的序号(在DEF文g中指?也可以按函数的名字来获取引出函数的地址Q因为客L序和DLLE序在相同的内存地址I间中,所以客L序可以直接调用这些引出函数?/p> <p>最后FreeLibraryQ把DLLE序卸出内存Q以侉K放资源?</p> <p><br>说明Q?/p> <p>(1) DLLE序不仅可以引出函数Q也可以引出全局变量Q因为客L序和DLLE序在同一个地址I间Q所以,把DLL中的全局变量引出到客L序中是有意义的。引用的Ҏq不复杂Q或者把变量名放到DEF文g的EXPORTS部分Qƈ加上DATA选项; 或者在变量说明前面加上_declspec(dllexport)说明W?/p> <p>(2) DumpBin 通过/Exports选项可以列出DLLE序中的所有被引出的信息?/p> <p>(3) 客户E序本n也可以是一个DLLE序Q但它一定先被装入到q程I间中,以便可以调用pȝ函数操作作ؓ服务E序的DLL模块?/p> <p>q程外组?<br>因ؓq程外组件程序和客户E序位于不同的进E空间之中,他们使用不同的地址I间Q所以组件和客户之间的通信必须跨越q程边界Q这涉及到以下一些问题:</p> <p>(1) 一个进E如何调用另外一个进E中的函?/p> <p>(2) 参数如何从一个进E被传递到另外一个进E中</p> <p>Windowsq_上,在不同进E之间进行通信的办法很多,包括DDE, named pipe,或者共享内存等{,COM采用了LPC(Local Procedure Call)和RPC(Remote Procedure Call)</p> <p>RegEdit可检查CLSID子键下的COM对象(63? <br>Microsoft Visual C++提供OleView.exeQ可列出当前机器上的所有类别信息,以及每一U类别下的组件对象列表?/p> <p>RegSvr32 D:\DicComp\DictComp.dll</p> <p>RegSvr32 /u D:\DicComp\DictComp.dll</p> <p>DLLlg必须有DllRegisterServer和DllUnregisterServer两个用于注册的入口函敎ͼ才能用RegSvr32注册?/p> <p>COM规定Q支持自注册的进E外lg必须支持两个命o行参?RegServer?UnregServerQ以便完成注册或注销操作?<br>Class Factory</p> <p>实际上,客户E序q不直接调用lgE序的引出函敎ͼ它调用COM库的函数q行lg对象的创建工作,COM库的创徏函数Ҏ注册表的信息调用lgE序的入口函数来创徏lg对象。组件程序需要提供一个标准的入口函数DLLGetObjectClassQ用于提供本l程序的lg信息?/p> <p>Class Factory和DLLGetObjectClass函数 <br>cd是COM对象的生产基圎ͼCOM库通过cd创徏COM对象; 对应每一个COMc,有一个类厂专门用于该COMcȝ对象创操作。类厂本w也是一个COM对象Q它支持一个特D的接口QIClassFactoryQ其定义如下Q?/p> <p>Class IClassFactory : public IUnknown</p> <p>{<br>virtual HRESULT _stdcall CreateInstance(IUnknown *pUnknownOuter, const IID& iid, void **ppv) = 0;<br>virtual HRESULT _stdcall LockServer(BOOL bLock) = 0;</p> <p>};</p> <p>接口IClassFactory有一个重要的成员函数CreateInstanceQ用于创建对应的COM对象。因为每个类厂之针对特定的COMcd象,所以CreateInstance成员函数知道该创Z么样的COM对象。在CreateInstance成员函数的参CQ第一个参数pUnknownOuter用于对象被聚合的情ŞQ没有聚合设成NULL。IClassFactory的另一个成员函数LockServer用于控制l徏的生存周期?/p> <p>因ؓcd本n也是个COM对象Q它被用于其它COM对象的创E,那么cd对象又由谁来创徏呢?{案是DLLGetClassObject引出函数。DLLGetClassObject函数q不是COM库的函数Q而是q件程序实现的引出函数Q我们先看一下DLLGetClassObject函数的原型:</p> <p>HRESULT DLLGetClassObject(const CLSID& clsid,<br>Const IID& iid,<br>(void **) ppv<br>);</p> <p>COM库在接到对象创徏的指令后Q它要调q程内组件的DLLGetClassObject函数Q由该函数创cd对象Qƈq回cd对象的接口指针,COM库或者客户一旦有了类厂的接口指针Q它们就可以通过cd接口IClassFactory的成员函数CreateInstance创徏相应的COM对象?/p> <p>COM库与cd的交互(67) <br>在COM库中Q有三个API函数可用于对象的创徏Q它们分别是CoGetClassObject, CoCreateInstance和CoCreateInstanceEx。通常情况下,客户E序调用其中之一完成对象的创建,q返回对象的初始接口指针。COM库与cd也通过q三个函数进行交互?br></p> </div> <img src ="http://www.shnenglu.com/SpringSnow/aggbug/88252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/SpringSnow/" target="_blank">Sandy</a> 2009-06-22 09:51 <a href="http://www.shnenglu.com/SpringSnow/articles/88252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>?深入出ShellExecute http://www.shnenglu.com/SpringSnow/articles/80685.htmlSandySandyWed, 22 Apr 2009 01:46:00 GMThttp://www.shnenglu.com/SpringSnow/articles/80685.htmlhttp://www.shnenglu.com/SpringSnow/comments/80685.htmlhttp://www.shnenglu.com/SpringSnow/articles/80685.html#Feedback0http://www.shnenglu.com/SpringSnow/comments/commentRss/80685.htmlhttp://www.shnenglu.com/SpringSnow/services/trackbacks/80685.html

深入出ShellExecute
译者:徐景?/font>(原作:Nishant S)

Q: 如何打开一个应用程序?
ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );
?
ShellExecute(this->m_hWnd,"open","notepad.exe",
"c:\\MyLog.log","",SW_SHOW );
正如您所看到的,我ƈ没有传递程序的完整路径?br>Q: 如何打开一个同pȝE序相关q的文档Q?
ShellExecute(this->m_hWnd,"open",
"c:\\abc.txt","","",SW_SHOW );
Q: 如何打开一个网?
ShellExecute(this->m_hWnd,"open",
"http://www.google.com","","", SW_SHOW );
Q: 如何Ȁzȝ关程序,发送EMAILQ?
ShellExecute(this->m_hWnd,"open",
"mailto:nishinapp@yahoo.com","","", SW_SHOW );
Q: 如何用系l打印机打印文档Q?
ShellExecute(this->m_hWnd,"print",
"c:\\abc.txt","","", SW_HIDE);
Q: 如何用系l查扑֊能来查找指定文gQ?
ShellExecute(m_hWnd,"find","d:\\nish",
NULL,NULL,SW_SHOW);
Q: 如何启动一个程序,直到它运行结束?
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(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
或:
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
if(CreateProcess("c:\\winnt\\notepad.exe", NULL,
NULL,NULL,FALSE,0,NULL,
NULL,&StartupInfo,&ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
MessageBox("The process could not be started...");
}
Q: 如何昄文g或文件夹的属性?
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(&ShExecInfo);


Sandy 2009-04-22 09:46 发表评论
]]>
?工作U程的相x息@?http://www.shnenglu.com/SpringSnow/articles/80112.htmlSandySandyThu, 16 Apr 2009 02:15:00 GMThttp://www.shnenglu.com/SpringSnow/articles/80112.htmlhttp://www.shnenglu.com/SpringSnow/comments/80112.htmlhttp://www.shnenglu.com/SpringSnow/articles/80112.html#Feedback0http://www.shnenglu.com/SpringSnow/comments/commentRss/80112.htmlhttp://www.shnenglu.com/SpringSnow/services/trackbacks/80112.htmlhttp://www.shnenglu.com/qinqing1984/archive/2009/04/15/80038.html

         首先声明, q里的工作线E与UIU程是相对的,x有Q何窗口的. 如果需要与ȝE或其它辅助U程通讯,有几U方法如事g,消息,信号{?也可以是以上几种Ҏ的综合运?下面列Z下两U通讯Ҏ的代码框?/span>

        Q?1Q?nbsp;只用消息通讯   

 1DWORD ThreadProc(LPVOID lParam)
 2{
 3    //创徏U程消息队列
 4    MSG msg;
 5    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
 6    //通知其它U程消息队列已创建好
 7    SetEvent(hEvent); 
 8
 9    while(true)
10    {
11        GetMessage(&msg, NULL, 00);
12        switch(msg.message)
13         {
14            case WM_QUIT:
15                  return 1;
16
17            //自定义消?处理
18            case WM_USER + 100:
19                  break;
20
21            //自定义消?处理
22            case WM_USER + 101:
23                  break;
24         }

25    }

26    return 0;
27}

         Q?Q用消息和事仉讯                

 1DWORD ThreadProc(LPVOID lParam)
 2 {
 3  while (TRUE)
 4 {
 5       DWORD ret ; 
 6       MSG msg ; 
 7 
 8       while (PeekMessage(&msg, NULL, 00, PM_REMOVE)) 
 9       
10         switch(msg.message)
11          {
12            //U程退出消?直接q回
13             case WM_QUIT:
14                 return 1;
15
16            //自定义消?处理
17             case WM_USER + 100:
18                 break;
19             //自定义消?处理
20            case WM_USER + 101:
21                break;
22          }

23        }

24        ret = MsgWaitForMultipleObjects(cObjects, lphObjects, FALSE,INFINITE,QS_POSTMESSAGE); 
25
26        if (ret == (WAIT_OBJECT_0 + cObjects))
27        {
28           //有新的消息到?l箋C步PeekMessage处理
29           continue;
30        }
 
31        else 
32        
33           //是事件受信了
34          if (ret == WAIT_OBJECT_O)
35          {               
36          }

37          else if (ret == WAIT_OBJECT_O + 1)
38          {
39          }

40          else if(ret == WAIT_OBJECT_O + cObjects - 1)
41          {
42          }

43        }
    
44     return 0;
45}

       上面用到了GetMessage和PeekMessage 函数, q两者都是从消息队列取出消息, 不同的是GetMessage从消息队列删除消?q且d调用U程. PeekMessage则是查询消息队列,如果有消息就取出,没有消息也立卌?   是否从消息队列删除消息由最后一个参数决?PM_REMOVE表示删除,PM_NOREMOVE表示不删?可以单地认ؓ,GetMessage是同步的,PeekMessage是异步的.

收获最大的是对q两个函数的理解:GetMessage和PeekMessage 函数,
q两者都是从消息队列取出消息, 不同的是GetMessage从消息队列删除消?q且d调用U程. PeekMessage则是查询消息队列,如果有消息就取出,没有消息也立卌?   是否从消息队列删除消息由最后一个参数决?PM_REMOVE表示删除,PM_NOREMOVE表示不删?可以单地认ؓ,GetMessage是同步的,PeekMessage是异步的.



Sandy 2009-04-16 10:15 发表评论
]]>
?工作U程的相x息@?http://www.shnenglu.com/SpringSnow/articles/80113.htmlSandySandyThu, 16 Apr 2009 02:15:00 GMThttp://www.shnenglu.com/SpringSnow/articles/80113.htmlhttp://www.shnenglu.com/SpringSnow/comments/80113.htmlhttp://www.shnenglu.com/SpringSnow/articles/80113.html#Feedback0http://www.shnenglu.com/SpringSnow/comments/commentRss/80113.htmlhttp://www.shnenglu.com/SpringSnow/services/trackbacks/80113.htmlhttp://www.shnenglu.com/qinqing1984/archive/2009/04/15/80038.html

         首先声明, q里的工作线E与UIU程是相对的,x有Q何窗口的. 如果需要与ȝE或其它辅助U程通讯,有几U方法如事g,消息,信号{?也可以是以上几种Ҏ的综合运?下面列Z下两U通讯Ҏ的代码框?/span>

        Q?1Q?nbsp;只用消息通讯   

 1DWORD ThreadProc(LPVOID lParam)
 2{
 3    //创徏U程消息队列
 4    MSG msg;
 5    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
 6    //通知其它U程消息队列已创建好
 7    SetEvent(hEvent); 
 8
 9    while(true)
10    {
11        GetMessage(&msg, NULL, 00);
12        switch(msg.message)
13         {
14            case WM_QUIT:
15                  return 1;
16
17            //自定义消?处理
18            case WM_USER + 100:
19                  break;
20
21            //自定义消?处理
22            case WM_USER + 101:
23                  break;
24         }

25    }

26    return 0;
27}

         Q?Q用消息和事仉讯                

 1DWORD ThreadProc(LPVOID lParam)
 2 {
 3  while (TRUE)
 4 {
 5       DWORD ret ; 
 6       MSG msg ; 
 7 
 8       while (PeekMessage(&msg, NULL, 00, PM_REMOVE)) 
 9       
10         switch(msg.message)
11          {
12            //U程退出消?直接q回
13             case WM_QUIT:
14                 return 1;
15
16            //自定义消?处理
17             case WM_USER + 100:
18                 break;
19             //自定义消?处理
20            case WM_USER + 101:
21                break;
22          }

23        }

24        ret = MsgWaitForMultipleObjects(cObjects, lphObjects, FALSE,INFINITE,QS_POSTMESSAGE); 
25
26        if (ret == (WAIT_OBJECT_0 + cObjects))
27        {
28           //有新的消息到?l箋C步PeekMessage处理
29           continue;
30        }
 
31        else 
32        
33           //是事件受信了
34          if (ret == WAIT_OBJECT_O)
35          {               
36          }

37          else if (ret == WAIT_OBJECT_O + 1)
38          {
39          }

40          else if(ret == WAIT_OBJECT_O + cObjects - 1)
41          {
42          }

43        }
    
44     return 0;
45}

       上面用到了GetMessage和PeekMessage 函数, q两者都是从消息队列取出消息, 不同的是GetMessage从消息队列删除消?q且d调用U程. PeekMessage则是查询消息队列,如果有消息就取出,没有消息也立卌?   是否从消息队列删除消息由最后一个参数决?PM_REMOVE表示删除,PM_NOREMOVE表示不删?可以单地认ؓ,GetMessage是同步的,PeekMessage是异步的.

收获最大的是对q两个函数的理解:GetMessage和PeekMessage 函数,
q两者都是从消息队列取出消息, 不同的是GetMessage从消息队列删除消?q且d调用U程. PeekMessage则是查询消息队列,如果有消息就取出,没有消息也立卌?   是否从消息队列删除消息由最后一个参数决?PM_REMOVE表示删除,PM_NOREMOVE表示不删?可以单地认ؓ,GetMessage是同步的,PeekMessage是异步的.



Sandy 2009-04-16 10:15 发表评论
]]>
?关于~译和链?http://www.shnenglu.com/SpringSnow/articles/70210.htmlSandySandyWed, 24 Dec 2008 01:35:00 GMThttp://www.shnenglu.com/SpringSnow/articles/70210.htmlhttp://www.shnenglu.com/SpringSnow/comments/70210.htmlhttp://www.shnenglu.com/SpringSnow/articles/70210.html#Feedback0http://www.shnenglu.com/SpringSnow/comments/commentRss/70210.htmlhttp://www.shnenglu.com/SpringSnow/services/trackbacks/70210.html关于~译和链?/font>
转自:http://www.shnenglu.com/dawnbreak/archive/2008/12/23/70198.html
在此Q我惛_说关于程序编译的一些规范和ҎQ一般来_无论是C、C++Q首先要把源文g~译成中间代码文Ӟ在Windows下也是 .obj 文gQUNIX下是 .o 文gQ即 Object FileQ这个动作叫做编译(compileQ。然后再把大量的Object File合成执行文gQ这个动作叫作链接(linkQ?

~译Ӟ~译器需要的是语法的正确Q函C变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位|(头文件中应该只是声明Q而定义应该放在C/C++文g中)Q只要所有的语法正确Q编译器可以编译出中间目标文g。一般来_每个源文仉应该对应于一个中间目标文ӞO文g或是OBJ文gQ?

链接Ӟ主要是链接函数和全局变量Q所以,我们可以使用q些中间目标文gQO文g或是OBJ文gQ来链接我们的应用程序。链接器q不函数所在的源文Ӟ只管函数的中间目标文ӞObject FileQ,在大多数时候,׃源文件太多,~译生成的中间目标文件太多,而在链接旉要明昑֜指出中间目标文g名,q对于编译很不方便,所以,我们要给中间目标文g打个包,在Windows下这U包?#8220;库文?#8221;QLibrary File)Q也是 .lib 文gQ在UNIX下,是Archive FileQ也是 .a 文g?

ȝ一下,源文仉先会生成中间目标文gQ再׃间目标文件生成执行文件?font color=#ff0000>在编译时Q编译器只检程序语法,和函数、变量是否被声明。如果函数未被声明,~译器会l出一个警告,但可以生成Object File。而在链接E序Ӟ链接器会在所有的Object File中找d数的实现Q如果找不到Q那到就会报链接错误码(Linker ErrorQ,在VC下,q种错误一般是QLink 2001错误Q意思说是说Q链接器未能扑ֈ函数的实现。你需要指定函数的Object File.



Sandy 2008-12-24 09:35 发表评论
]]>
调用SendMessage 产生死锁的问题分?http://www.shnenglu.com/SpringSnow/articles/69794.htmlSandySandyFri, 19 Dec 2008 00:42:00 GMThttp://www.shnenglu.com/SpringSnow/articles/69794.htmlhttp://www.shnenglu.com/SpringSnow/comments/69794.htmlhttp://www.shnenglu.com/SpringSnow/articles/69794.html#Feedback0http://www.shnenglu.com/SpringSnow/comments/commentRss/69794.htmlhttp://www.shnenglu.com/SpringSnow/services/trackbacks/69794.html调用SendMessage 产生死锁的问题分?/a>

http://www.shnenglu.com/woaidongmao/archive/2008/12/17/69696.html

 

 

()       SendMessage 的工作机?

首先我要先简要的说明一个和q个话题有关pȝ消息处理机制Q?

    ?span>Window操作pȝ当中Q窗口时属于所?span>Thread的也是?你这个窗口在那个Thread 当中Create 的那么你q个H口属于那?span>Thread。同时窗口的消息处理函数也都会在q个Thread 当中被执行的。(不要问ؓ什?span> Window 是q么设计?嘿嘿Q?

 

在讲死锁之前我们先把SendMessage的工作机制搞清楚Q?

SendMessage 发送出来的消息 到底q入不进入消息队列,有h说进入,有h说不q入Q其实都是错误的Q确切的说是有时q入Q有时不q入。那么什么时候进入,什么时候不q入呢? 我们举一例子来说Q假如在 Thread A 中有一?H口W1Q那??span> Thread A 中像 W1 SendMessage 一个消息,那么q个消息不会被攑օ消息队列Q而是直接调用?span>W1的消息处理函数来直接处理了这个消息。这是不被放入队列的情况Q假如现在又多了一?span>Thread B Q那么在 Thread B ??span> W1 SendMessage 发送消?q个时?span> W1 被攑օ?span> Thread A 的消息队列当中,q些Thread A 中的消息循环?span>GetMessage ?span>Get到这个消?q处理之?q就是进入消息队列情况;Ҏ在哪里我们来看看我的试l果Q?

 

1Q?/span>我创Z一个无DOC/View 之支持的单文档工E:

我在CMainFramed如下代码Q?

        BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

               ON_WM_CREATE()

               ON_WM_SETFOCUS()

               ON_MESSAGE(WM_USER + 100,OnMy)

ON_MESSAGE(WM_USER + 200,OnMy2)

END_MESSAGE_MAP()

 

LRESULT CMainFrame::OnMy(WPARAM wParam,LPARAM lParam)

{

             int i = 0;

             return TRUE;

}

 

LRESULT CMainFrame::OnMy2(WPARAM wParam,LPARAM lParam)

{

             int i = 2;

             return TRUE;

}

然后我再 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 的最?/span> 加入了一行代码:

SendMessage(WM_USER + 100,0,0);

 

此主题相兛_片如下:
clip_image002

然后直接 F5 q行E序 {到 E序停止在断点上Q我们看?span>Call Stack 的调用顺序:


clip_image001
此主题相兛_片如下:
clip_image003

 

然后 我又?span> SendMessage ҎQ?

PostMessage(WM_USER + 100,0,0);

然后直接 F5 q行E序 {到 E序停止在断点上Q我们再看看Call Stack 的调用顺序:


clip_image001
此主题相兛_片如下:
clip_image004

通过q?span>2?span> Call Stack 大家可以很清楚的看到,执行SendMessage的时候,是直接调用了 AfxWndProcBase q个 消息处理函数(MFC 通过HOOK 所有窗口的处理函数都重定向到这?函数上了Q?span>AfxWndProcBase()不明白的自己ȝ?span>MFC深入出?span>)Q大家可以很清楚的看刎ͼ?span>SendMessage ?span> AfxWindProcBase 之间Ҏ没有调用CWinApp::Run() Q也是说从SendMessage 到执?span>OnMy()Ҏ没有通过E序的主消息循环?span>GetMessage Q?span>Run 内部好像用的PeekMessageC清楚了)取消息。那么有Z问,SendMessage的内部就不会先发消息攑օ队列再通过GetMesssage把消息取出来了吗Q答Ҏ没必要那样做Q那是脱裤子?span>P多此一举?

从这个测试例子的l果我判?span>SendMessage ?span> Thread A 中向 W1

SendMessage 的消息根本不q入消息队列?

2Q?/span>那么什么时候进入队列呢我来看看q个例子

沿用上面那个例子的代码我?span> OnCreate 中的 SendMessage ?span> PostMessage 都删除掉。然后加入如下代码:

//Thread Proc

UINT ThreadProc(LPVOID lParam)

{

             CMainFrame * v_pFrameWnd = (CMainFrame *)lParam;

             if(v_pFrameWnd)

             {

                v_pFrameWnd->SendMessage(WM_USER + 100,0,0);

             }

             return 0;

}

q且 ?span> OnCreate U加入如下代码:

AfxBeginThread(ThreadProc,this);

然后F5 q行 {待E序停在断点处,?span>Call Stack 如下Q?/span>


clip_image001
此主题相兛_片如下:
clip_image005

我们发现q个 Call Stack 和刚才那个PostMessage ?span>Call Stack 是一L q个 WM_USER + 100 消息是通过 Run 内部?span> GetMessage 取出来的 。所以我断定Q?

 

?span> Thread B 中向W1 SendMessage 发送消?Q消息是攑օ?span> Thread A 的消息队列中。由?span>SendMessage的特性只有当消息被执行完毕才能够q回Q所?span>Thread B 中的SendMessage 要等 Thread A 当中消息执行完毕后才能够q回?

()       SendMessage 产生?死锁问题

Thread 死锁肯定是发生在2?span>Thread 之间Q?span>A{?span>B Q?span>B{?span> AQ就产生了死锁。大家看了上面测试之后一定会发现Q?span>SendMessage 的死锁和上面的第二个例子有关p,也就??通过 Thread B ?span> W1 发送消息的时候又可能会生死锁?

 

 

那么死锁 何时产生?Q通过上面的例子我们知道了 如果Thread B ?span> W1 SendMessage一个消息,那么 Thread B 的这?span>SendMessage p{?span> Thread A 的队列中?消息执行完毕才能够返回,如果?span> Thread B SendMessage 的同?span> Thread A {待 Thread B 中的某一处理完毕才能够l处理消息的话,那么q个时候就发送了死锁?

 

我们l箋以测试来说明Q?

3Q?

    首先?span> CMainFrame中加入一?成员变量Q?/span>m_bThreadExit Q?span>PublicQ?/span>

    我们?span> UINT ThreadProc(LPVOID lParam) 加入一样代码如下:

       UINT ThreadProc(LPVOID lParam)

{

          CMainFrame * v_pFrameWnd = (CMainFrame *)lParam;

          if(v_pFrameWnd)

          {

             v_pFrameWnd->SendMessage(WM_USER + 100,0,0);

          }

          v_pFrameWnd->m_bThreadExit = TRUE;

          return 0;

}

然后?span> OnCreate 当中d如下代码Q?

                             m_bThreadExit = FALSE;

          AfxBeginThread(ThreadProc,this);

 

          while(TRUE)

          {

             if(m_bThreadExit)

                break;

             Sleep(55);

}

 

 OK ~译 F5 q行 发现E序 q入无响应状态,好这时我么让E序 暂停Q?

看看 2?span>Thread ?span> Call Stack 都停在那里了Q?

Main Thread如下Q?

 

clip_image001此主题相兛_片如下:
clip_image006

在看?另一个线成:



clip_image001
此主题相兛_片如下:
clip_image007

q会 是不?很明了了

MainThread 停在 循环?{待 m_bThreadExit ?span> TrueQ?另一个线?则等?span> MainThread 处理完毕 WM_USER + 100 q个消息Q结果你{我Q我{你Q死了。。。?

()       处理办法

1Q?/span> 针对上面的例?我们 可以通过 ?strong>SendMessage Ҏ PostMessage 的方法来攑ּ{待?q样p决了

2Q?/span> 有些时?W?span>1U方法不W合要求比如下面q中情况

UINT ThreadProc(LPVOID lParam)

{

          CMainFrame * v_pFrameWnd = (CMainFrame *)lParam;

          if(v_pFrameWnd)

 

          {

          v_pFrameWnd->SetWindowText("lvyang");

          }

          v_pFrameWnd->m_bThreadExit = TRUE;

          return 0;

}

q里面的CWndQ:SetWindowText里面实际上调用的是:Q?span>SetWindowText 而:Q?span>SetWindowText 里面有调?span> SendMessage 发送一个消息给CWnd 的窗?Q因为:Q?span>SetWindowText 内部的我们没有办法来修改Q那我只能去修改 MainThread 当中?span> While 循环了?

 

那如何修改呢Q?span> ThreadProc 当中 SetWindowText之所以被诸塞Q就是因?它向 MainThread SendMessage 的消息没有得到处理,那么我们让他处理的不?span>OK了吗Q好那我们就让他处理Q代码如下:

MSG msg;

       while(TRUE)

       {

          if(m_bThreadExit)

             break;

          if(::PeekMessage(&msg,NULL,NULL,NULL,PM_NOREMOVE))

          {

             if(::GetMessage(&msg,NULL,NULL,NULL))

             {

                if(!PreTranslateMessage(&msg))

                {

                   ::TranslateMessage(&msg);

                   ::DispatchMessage(&msg);

                }

             }

          }

          Sleep(55);

}

l于搞完?



Sandy 2008-12-19 08:42 发表评论
]]>
转:层数据l构Q结构型Qvs 深层数据l构Q聚合型Q?/title><link>http://www.shnenglu.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.shnenglu.com/SpringSnow/articles/65421.html</guid><wfw:comment>http://www.shnenglu.com/SpringSnow/comments/65421.html</wfw:comment><comments>http://www.shnenglu.com/SpringSnow/articles/65421.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/SpringSnow/comments/commentRss/65421.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/SpringSnow/services/trackbacks/65421.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.shnenglu.com/woaidongmao/archive/2008/10/25/64977.html"><font color=#223355>层数据l构Q结构型Qvs 深层数据l构Q聚合型Q?/font></a> </h2> <div id="7vphrxj" class=postbody> <p> </p> <p>构徏pȝ数据模型Ӟ?共选择Q以Qgroup->account->son account举例</p> <p>1、系l由多个groupl成Q?/p> <p>2、一个group有多个account;</p> <p>3、一个account有多个son account.</p> <p> </p> <p>?U数据模型构建方式选择Q?/p> <p><a href="http://www.shnenglu.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.shnenglu.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/4cac8ae978bb_1AE5/image_thumb.png" width=845 border=0></a> </p> <p>1、模式一的数据模型由3张表构成Qgroups表,accounts表,son accounts表。是层数据l构Q结构型Q,每张表的深度?。accounts表将有一个[group]字段兌到groups表里面的某条记录Qson accounts表将有一个[account]字段兌到accounts表里面的某条记录。可以说q是一U经典的数据l构Q结构型数据库就是由q样深度?的二l型数据表构成,多张表之间的关系通过增加兌字段来标明;</p> <p>2、模式二的数据模型中Q把group视作一个整体,它是数据层的一个基本单元(unitQ,数据层由多个group对象l成Qgroup对象的深度是3Q是深层数据l构Q聚合型Q。现实的模型对应为对象型数据库;</p> <p> </p> <p>现在的问题是Q模式一单还是模式二单?哪一U是更ؓ优越的选择Q我們֐于模式一Q因为:</p> <p>1、结构型数据建模是经典的Q目前依然是L的,得到数据库的q泛支持Q即使不使用数据库,也容易序列化到存储,q且我相信群众,怿L意志的正性;</p> <p>2、模式二的对象型数据建模Qgroup是数据元Q是数据操作的唯一入口Q所以需要提供accountQson account的操作接口,account又需要提供son account的操作接口,假设对象深度再多增加几层Q那q是一个庞大且累赘的冗余。另外一Ҏ树Ş的对象不Ҏ序列化,没有太多数据库支持;</p> <p>3、模式二的层ơ太深,复杂度C升,q反了系l弱化成类模型的原则(多个c,每个cȝ复杂度都很低Q,而这里,group是一个很大的cR?/p> <p>4、第一感觉Q模式一的复杂度我能控制Q模式二没有把握,所以心里更认同模式一Q?/p> <p>5、虽然模式二直观的表明了数据的聚?l合关系Q与现实模型完全隐射Q在理论上应该是更好的选择。但是就人的理解能力的們֐来说Q我认ؓ理解q度的事务比较理解深度的事务而言更有优势Q?/p> <p>6、写到这里,我突然想说一句:<font color=#ff0000>化深度ؓq度Q符合h的认知规律,降低了复杂度?/font></p> </div> <img src ="http://www.shnenglu.com/SpringSnow/aggbug/65421.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/SpringSnow/" target="_blank">Sandy</a> 2008-10-28 23:43 <a href="http://www.shnenglu.com/SpringSnow/articles/65421.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:不错的管理文?/title><link>http://www.shnenglu.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.shnenglu.com/SpringSnow/articles/65140.html</guid><wfw:comment>http://www.shnenglu.com/SpringSnow/comments/65140.html</wfw:comment><comments>http://www.shnenglu.com/SpringSnow/articles/65140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/SpringSnow/comments/commentRss/65140.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/SpringSnow/services/trackbacks/65140.html</trackback:ping><description><![CDATA[ 转自 http://www.joy2u.co.uk<br><br>一?素养<br><br>蓝斯d则:在你往上爬的时候,一定要保持梯子的整z,否则你下来时可能会滑倒?br>提出者:国理学家蓝斯癅R?br>点评Q进退有度Q才不至q退l谷Q宠q忘,方可以宠׃惊?br><br>卢维斯定?Q谦虚不是把自己惛_很糟Q而是完全不想自己?br>提出者:国心理学家卢维?br>点评Q如果把自己惛_太好Q就很容易将别h惛_很糟?br><br>托利得定理:验一个h的智力是否属于上乘,只看脑子里能否同时容U两U相反的思想Q而无于其处世行事?br>提出者:法国C会心理学家托利?br>点评Q思可相反Q得ȝ成?br><br>二、统?br><br>刺猬理论Q刺猬在天冷时彼此靠拢取暖,但保持一定距,以免互相Z?br>点评Q保持亲密的重要ҎQ乃是保持适当的距R?br><br>鲦鱼效应Q鱼因个体弱小而常常群居,q以强健者ؓ自然首领。将一只稍强的鲦鱼脑后控制行ؓ的部分割除后Q此g失去自制力,行动也发生紊乱,但其他鱼却仍像从前一L目追随?br>提出者:德国动物学家霍斯?br>点评Q?、下属的悲剧L领导一手造成的?2、下属觉得最没劲的事Q是他们跟着一位最差劲的领对{?br><br>雷鲍夫法?Q在你着手徏立合作和信Q时要牢记我们语言中:<br>1、最重要的八个字是:我承认我犯过错误<br>2、最重要的七个字是:你干了一件好?br>3、最重要的六个字是:你的看法如何<br>4、最重要的五个字是:׃一起干<br>5、最重要的四个字是:不妨试试<br>6、最重要的三个字是:谢谢?br>7、最重要的两个字是:׃<br>8、最重要的一个字是:?br>提出者:国理学家雷鲍?br>点评Q?、最重要的四个字是:不妨试试Q?2、最重要的一个字是:?br><br>z伯定理Q对于一个经理h来说Q最要紧的不是你在场时的情况Q而是你不在场时发生了什么?br>提出者:国理学家z伯<br>点评Q如果只惌下属听你的,那么当你不在w边时他们就不知道应该听谁的了?br><br>三、沟?br><br>斯坦U_?Q在哪里说得愈少Q在哪里听到的就愈多?br>提出者:国心理学家斯坦U?br>点评Q只有很好听取别人的Q才能更好说q?br><br>Ҏ诺定理:Z只x却只有一张嘴_q意味着人应该多听少讌Ӏ?br>提出者:英国联合航空公司总裁兼ȝ理费斯诺<br>点评Q说得过多了Q说的就会成为做的障?br><br>牢骚效应Q凡是公怸有对工作发牢骚的人,那家公司或老板一定比没有q种人或有这Uh而把牢骚埋在肚子里公司要成功得多?br>提出者:国密歇根大学社会研I<br>点评Q?、牢骚是改变不合理现状的催化剂?2、牢骚虽不L正确的,但认真对待牢骚却L正确的?br><br>遉K针效应:在高大徏{物端安装一个金属棒Q用金属U与埋在C的一块金属板q接hQ利用金属棒的尖端放电,使云层所带的电和C的电逐渐中和Q从而保护徏{物{避免雷凅R?br>点评Q善疏则通,能导必安<br><br>四、协?br><br>氨基酸组合效应:l成Z蛋白的八U}基酸Q只要有一U含量不I其他七种无法合成蛋白质?br>点评Q当~Z不可Ӟ一是一切?br><br>cx-25效应Q前苏联研制的米?25h式战斗机的许多零部g与美国的相比都落后,但因设计者考虑了整体性能Q故能在升降、速度、应急反应等斚w成ؓ当时世界一?br>点评Q所谓最x体,乃是个体的最佳组合?br><br>合效应Q新l装的机器,通过一定时期的使用Q把擦面上的加工痕q磨光而变得更加密合?br>点评Q要惌到完整的契合Q须双方都做出必要的割舍?br> <br><br>五、指?br><br>波特定理Q当遭受许多批评Ӟ下往往只记住开头的一些,其余׃听了Q因Z们忙于思烦论据来反驛_头的批评?br>提出者:英国行ؓ学家波特<br>点评Qȝ着下属的失误,是一个领D的最大失误?br><br>蓝斯d?Q跟一位朋友一起工作,q较在父亲之下工作有得多?br>提出者:国理学家蓝斯?br>点评Q可敬不可亲Q终难敬Q有权没有威Q常失权?br><br>吉尔伯特法则 Q工作危机最凿的信P是没有h跟你说该怎样作?br>提出者:英国人力培训专家吉尔伯特<br>点评Q真正危险的事,是没你谈危险?br><br>权威暗示效应Q一化学家称Q他测验一瓶臭气的传播速度Q他打开瓶盖15U后Q前排学生即举手Q称自己d臭气Q而后排的人则陆箋举手Q纷UL自己也已dQ其实瓶中什么也没有?br>点评Q迷信则MQ盲目必盲从?br> <br><br>六、组l?br><br>奥尼定?Q所有的政治都是地方的?br>提出者:国前众议院院长奥尼?br>点评Q只有能切n体会到的Q群众才认ؓ那是真实的?br><br>定位效应Q社会心理学家曾作过一个试验:在召集会议时先让Z自由选择位子Q之后到室外休息片刻再进入室内入座,如此五至六次Q发现大多数人都选择他们W一ơ坐q的位子?br>点评Q凡是自p定的Qh们大都不惌易改变它?br><br>艑֥布恩定理Q如果你遇见员工而不认得Q或忘了他的名字Q那你的公司太大了炏V?br>提出者:英国史蒂芬约瑟剧院导演亚伦艾奇布?br>点评Q摊子一旦铺得过大,你就很难把它照顾周全?br> <br><br>七、培?br><br>吉格勒定?Q除了生命本w,没有M才能不需要后天的ȝ?br>提出者:国培训专家吉格吉格?br>点评Q水无积无辽阔,ZM成才?br><br>犬獒效应Q当q幼的藏犬长出牙齿ƈ能撕咬时Q主人就把它们放C个没有食物和水的闭环境里让q些q犬自相撕咬Q最后剩下一只活着的犬Q这只犬UCؓ獒。据说十只犬才能产生一只獒?br>点评Q困境是造就的学校?br> <br><br>八、选拔<br><br>q因效应 Q最q或最后的印象对h的认知有强烈的媄响?br>提出者:国C会心理学家z钦斯?br>点评Q结果往往会被视ؓq程的ȝ?br><br>z井法则Q在招工时用浑w解敎ͼ使出各种ҎQ不如自n成ؓ一个好公司Q这样h才自然而然会汇集而来?br>提出者:日本企业理N酒井正敬?br>点评Q不能吸引h才,已有的h才也留不住?br><br>即好效应:对一个外表英俊漂亮的人,Z很容易误认ؓ他或她的其他斚w也很不错?br>提出者:国心理学家丹尼麦克尼?br>点评Q印象一旦以情A为基Q这一印象怼偏离事实?br> <br><br>九、Q?br><br>奥格维法则Q如果我们每个h都雇用比我们自己都更强的人,我们p成ؓ巨h公司?br>提出者:国奥格维马瑟公司总裁奥格维?br>点评Q如果你所用的人都比你差,那么他们只能作出比你更差的事情?br><br>皮尔卡丹定理 Q用Z一加一不等于二Q搞不好{于零?br>提出者:法国著名企业家皮卡丏V?br>点评Q组合失当,常失整体优势Q安排得宜,才成最佳配|?br> <br><br>十、激?br><br>马蝇效应Q再懒惰的马Q只要n上有马蝇叮咬Q它也会_抖擞Q飞快奔跑?br>点评Q有正确的刺ȀQ才会有正确的反应?br><br>倒u形假_当一个h处于d兴奋Ӟ能把工作作得最好。当一个h一点儿兴奋都没有时Q也没有作好工作的动力了;相应圎ͼ当一个h处于极度兴奋Ӟ随之而来的压力可能会使他完不成本该完成的工作。世界网坛名贝克尔之所以被UCؓ常胜军Q其U诀之一x在比赛中自始至终防止q度兴奋Q而保持半兴奋状态。所以有Z倒u形假说称克尔境界?br>提出者:英国心理学家|伯?耶基斯和多d林?br>点评Q?、激情过热,Ȁ情就会把理智烧光?2、热情中的冷静让人清醒,冷静中的热情使h执着?br> <br><br>十一、调?br><br>特伯论断 Q在数字中找不到安全?br>提出者:国l济学家特伯?br>点评Q数字是ȝQ情冉|zȝ?br><br>摩斯U定?Q你得到的第一个回{,不一定是最好的回答?br>提出者:国理学家摩斯U?br>点评Q刨根得根,问底知底?br> <br><br>十二、预?br><br>|杰斯论断:成功的公怸会等待外界的影响来决定自q命运Q而是始终向前看?br>提出者:国IBM公司前总裁|杰斯?br>点评Q只想随波逐流Q难有理惛_岸?br><br>萨盖定律Q戴一块手表的人知道准的旉Q戴两块手表的h便不敢确定几点了?br>提出者:英国心理学家萨盖?br>点评Q若选错误参照,必无正确比较?br><br>隧道视野效应Q一个h若n处隧道,他看到的只是前后非常狭H的视野?br>点评Q?、不拓心路,隑ּ视野?、视野不宽,脚下的\也会愈走愈窄?br> <br><br>十三、目?br><br>巴菲特定?Q在其他人都投了资的地方L资,你是不会发胦的?br>提出者:国股神巴菲牏V?br>点评Q?、善于走自己的\Q才可望走别人没走过的\?、特色不特,优势无优?br><br>古特雷定?Q每一处出口都是另一处的入口?br>提出者:国理学家古特雗?br>点评Q上一个目标是下一个目标的基础Q下一个目标是上一个目标的延箋?br> <br><br>十四、计?br><br>列文定理Q那些犹豫着q迟不能作出计划的hQ通常是因为对自己的能力没有把握?br>提出者:法国理学家列文?br>点评Q如果没有能力去{划Q就只有旉d悔了?br><br>弗洛斯特法则 Q在{墙之前应该知道把什么圈出去Q把什么圈q来?br>提出者:国思想家弗z斯牏V?br>点评Q开始就明确了界限,最l就不会作出越界限的事来?br> <br><br>十五、参?br><br>波克定理 Q只有在争辩中,才可能诞生最好的L和最好的军_?br>提出者:国庄臣公司ȝ理詹姆士?波克?br>点评Q无擦便无合Q有争论才有高论?br><br>韦奇定理Q即使你已有了主见,但如果有十个朋友看法和你相反Q你很难不动摇?br>提出者:国z杉矶加州大学经学家伊?韦奇?br>点评Q?、未听之时不应有成见Q既听之后不可无主见?2、不怕开始众说纷U,只怕最后莫衷一是?br> <br><br>十六、决{?br><br>克兰定?Q没有必要作出决定时Q就有必要不作决定?br>提出者:法国理学家克兰?br>点评Q当不知如何行动Ӟ最好的行动是不采取Q何行动?br><br>王安论断Q犹豫不军_然可以免M些作错事的机会,但也失去了成功的机遇?br>提出者:籍华裔企业家王安博士?br>点评Q寡断能使好事由好变坏,果断可将危机转危为安?br> <br><br>十七、执?br><br>格瑞斯特定理 Q杰出的{略必须加上杰出的执行才能奏效?br>提出者:国企业家格瑞斯牏V?br>点评Q好事干实更好,实事办好愈实?br><br>吉d林法?Q把N清清楚楚地写出来Q便已经解决了一半?br>提出者:国通用汽R公司理N查尔?吉d林?br>点评Q杂乱无章的思维Q不可能产生有条有理的行动?br> <br><br>十八、信?br><br>沃尔法?Q把信息和情报放在第一位,金钱׃滚滚而来?br>提出者:国企业家沃森?br>点评Q你能得到多,往往取决于你能知道多?br><br>塔马拉效应:塔马拉是捷克雯专家?佩赫发明的一U雷达,它与其他雯的最大不同是不发信可只接收信号Q故不会被敌方反雯装置发现?br>点评Q善藏者h不可知,能知者h无以藏?br> <br><br>十九、监?br><br>池定理 Q越是沉醉,p是抓住眼前的东西不放?br>提出者:日本理学家池敬?br>点评Q自我陶醉不易清醒,自以为是不喜批评?br><br>赫勒法则 Q当Z知道自己的工作成l有人检查的时候会加倍努力?br>提出者:英国理学家赫勒?br>点评Q只有在怺信Q的情况下Q监督才会成为动力?br> <br><br>二十、控?br><br>横山法则Q最有效q持l不断的控制不是强制Q而是触发个h内在的自发控制?br>提出者:日本C会学家横山宁夫?br>点评Q有自觉性才有积极性,无自x便无d?br><br>蝴蝶效应Q紊乱学研究者称Q南半球某地的一只蝴蝶偶扇动一下翅膀所引v的微弱气,几星期后可变成席卷北半球某地的一场龙卷风。他们将q种׃个极v因,l过一定的旉Q在其他因素的参与作用下Q发展成极ؓ巨大和复杂后果的现象UCؓ蝴蝶效应?br>点评Q善l者慎始,谨小者慎微?br><br>阿什法则 Q承认问题是解决问题的第一步?br>提出者:国企业安什?br>点评Q你愈是w着问题Q问题愈会揪住你不放?br> <br><br>二十一、法U?br><br>z克忠告 Q规定应该少定,一旦定下之后,便得严格遵守?br>提出者:英国教育家洛??br>点评Q简则易循,严则必行?br><br>热炉法则Q当人用手去烧热的火炉Ӟ׃受到烫的惩罚Q其有以下三个特点:x性、预警性、^{性?br>点评Q罪与罚能相W,法与d相期?br> <br><br>二十二、改?br><br>柯美雅定律:世上没有十全十美的东西,所以Q何东襉K有改革的余地?br>提出者:国C会心理学家柯美雅?br>点评Q不拘于常规Q才能激发出创造力?br><br>辄多夫定律 Q没有创新精的人永q也只能是一个执行者?br>提出者:前苏联心理学家达l多?br>点评Q只有敢Zh先的人,才最有资格成为真正的先驱者?br><br>自吃q崽效应Q美国硅谷企业竞争十分激烈,以至于各公司都积极寻找自q致命qQ所有公司共同的生存之道是:拿出更好看品来击|自己的原有品。有人将q种行ؓ戏称吃幼崽?br>点评Q?、自׃D己,别hq早会g?2、敢于对q去告一个段落,才有信心掀开新的一章?br> <br><br>二十三、创?br><br>舍恩定理Q新思想只有落到真正怿它,对它着qL人手里才能开q果?br>提出者:国ȝ理工学院教授舍恩?br>点评Q只有信之不疑,才能持之以恒?br><br>吉宁定理 Q真正的错误是害怕犯错误?br>提出者:国理学家吉宁?br>点评Q不怕错误的人,错误往往也离他最q?br><br>卡贝定理 Q放弃是创新的钥匙?br>提出者:国电话甉|公司前ȝ理卡贝?br>点评Q在未学会放弃之前,你将很难懂得什么是争取?nbsp; <img src ="http://www.shnenglu.com/SpringSnow/aggbug/65140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/SpringSnow/" target="_blank">Sandy</a> 2008-10-26 21:56 <a href="http://www.shnenglu.com/SpringSnow/articles/65140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>E序员的九重境界http://www.shnenglu.com/SpringSnow/articles/64660.htmlSandySandyTue, 21 Oct 2008 15:40:00 GMThttp://www.shnenglu.com/SpringSnow/articles/64660.htmlhttp://www.shnenglu.com/SpringSnow/comments/64660.htmlhttp://www.shnenglu.com/SpringSnow/articles/64660.html#Feedback0http://www.shnenglu.com/SpringSnow/comments/commentRss/64660.htmlhttp://www.shnenglu.com/SpringSnow/services/trackbacks/64660.html在哪本电脑杂志上看见软g工程师这个职业介l,或者走在大街上看见某某软g培训机构鼓吹培训完就能年?0万的q告Q有些M慕那些编E序的,自己有些蠢蠢Ʋ动?
W二重:
用控制台或者说SDK之类的东西写了一?#8220;HELLO WORLD!”,感觉~程q个东西Q太单没隑ֺ?
W三重:
学会了简单的使用某某工具例如VCQ知道怎么利用工具创徏对话框之cȝ东西了,认ؓ自己已经有了“扎实”的基Q出L工作四面壁之后感叹人心不古世态炎凉?
W四重:
以极低的要求扑ֈ工作Q突然发现自׃会的实在是太多太多,不求甚解是无奈之举。这个阶D写代码写完之后主要是试Q试的标准:“能运行就是成功,不能q行是p|?#8221;一个小模块写完之后被黑盒蹂w几十次E村^常?
W五重:
H然意识C能再瞎干了,于是知道了如何规范的写代码,力的把代码写的短小_悍Q看一堆关于算法的书,q且会把自己的或者别人的优秀代码分门别类存v来,以便l常参考用?
W六重:
做的旉长Q发现自׃会的来多Q每每遇C太理解的必然刨根问底Q写完一D代码,一定仔仔细l把E序研究个透,不让他出CҎ漏一点警告才|休Q以挑战白盒作ؓ乐趣?
W七重:
把各U工LI个E巴烂Q即使一个全新的语言或者工P也能在半个月之内熟练使用Q这个时候,仍然认ؓ自己距离高手q有很大差距Q遇到新手来公司面试Q很惊讶q些人居然连怎么操作内存都不会就敢出来؜?
W八重:
把编E工L烦了Q开始喜Ƣ控制台或者说SDKQ纯_的API~程变成了自q最大乐?
W九重:
在电脑杂志上看见软g工程师的职业介绍Q或者走在大街上看见某某软g培训机构鼓吹培训完就能年?0万的q告Q想对后来h说些什么却l究发现无话可说Q只好一W而过?

W一重到W四重,需要努力,W五重到W六重,需要悟性,惛_W九重,需要智商和缘?br>
在CSDN上看到这个介l,x自己也就在第五重Q输入想学习的阶Dc那么一Ҏ性是需要好好悟一下的?br>
先要从第五重跛_W?重才行?

Sandy 2008-10-21 23:40 发表评论
]]>
google面试?/title><link>http://www.shnenglu.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.shnenglu.com/SpringSnow/articles/64658.html</guid><wfw:comment>http://www.shnenglu.com/SpringSnow/comments/64658.html</wfw:comment><comments>http://www.shnenglu.com/SpringSnow/articles/64658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/SpringSnow/comments/commentRss/64658.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/SpringSnow/services/trackbacks/64658.html</trackback:ping><description><![CDATA[几星期前Q一个朋友接受了Google公司的面试,他透露了面试中的一些问题。顺便,我把从其他几个曾l面试过的h那里听来的内容也整理在一赗最大的互联|公司Google的一份面试题集,看看你是否能够回{出来。其中很多问题都是开攑ּ的,正确的解{有许多U,所以在q里׃提供{案了?<br><br><br>一辆学校班车里面能装多个高尔夫球Q?<br>你被~小到只有硬币厚度那么点高(不是压扁Q是按比例羃)Q然后被扔到一个空的玻璃搅拌器中,搅拌刀片一分钟后就开始{动。你怎么办? <br>要是让你清洗整个襉K囄所有窗子,你会收取多少费用Q?<br>怎么才能识别出电脑的内存堆栈是向上溢是向下溢出? <br>你要向你8岁的侄子解释什么是数据库,L三句话完成?<br>旉的指针一天内会重合几ơ? <br>你需要从A地去B圎ͼ但你不知道能不能刎ͼq时该怎么办? <br>好比你有一个衣,里面塞满了各U衬衫,你会怎么整理q些衬衫Q好让你以后找衬衫的时候容易些Q?<br>有个镇?00对夫妇,每个丈夫都在ƺ骗他的d。妻子们都无法识破自׃夫的谎言Q但是她们却能知道其他Q何一个男人是否在撒谎。镇上的法律规定不准通奸Q妻子一旦证明丈夫不忠就应该立刻杀MQ镇上所有妇女都必须严格遵守q项法律。有一天,镇上的女王宣布,臛_有一个丈夫是不忠的。这是怎么发生的呢Q?<br>在一个重甯女的国家里,每个家庭都想生男孩,如果他们生的孩子是女孩,再生一个,直到生下的是男孩为止。这L国家Q男x例会是多? <br>如果在高速公路上30分钟内到一辆R开q的几率?.95Q那么在10分钟内看C辆R开q的几率是多?Q假设ؓ常概率条件下Q?<br>如果你看到钟的时间是3:15Q那一L针和分针的夹角是多少Q(肯定不是0度!Q?<br>4个h晚上要穿q一座烦桥回C们的营地。可惜他们手上只有一支只能再坚持17分钟的手늭。通过索桥必须要拿着手电Q而且索桥每次只能撑得起两个h的䆾量。这四个索桥的速度都不一PW一个走q烦桥需?分钟Q第二个2分钟Q第三个5分钟Q最慢的那个?0分钟。他们怎样才能?7分钟内全部走q烦桥? <br>你和朋友参加聚会Q包括你们两人在内一共有10个h在场。你朋友惌你打赌,说这里每有一个h生日和你相同Q你q?元,每有一个h生日和你不同Q他l你2元。你会接受么Q?<br>全世界有多少个钢琴调韛_Q?<br>你有8个一样大的球,其中7个的重量是一LQ另一个比较重。怎样能够用天q仅UCơ将那个重一些的球找出来?<br>?个v盗,按照{??排列。最大的L有权提议他们如何分n100枚金币。但其他Ҏ表决Q如果多数反对,那他׃被杀歅R他应该提出怎样的方案,既让自己拿到可能多的金币又不会被杀死?Q提C:有一个v盗能拿到98%的金币) <img src ="http://www.shnenglu.com/SpringSnow/aggbug/64658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/SpringSnow/" target="_blank">Sandy</a> 2008-10-21 23:36 <a href="http://www.shnenglu.com/SpringSnow/articles/64658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微Y面试法题——摘自CSDNhttp://www.shnenglu.com/SpringSnow/articles/64657.htmlSandySandyTue, 21 Oct 2008 15:35:00 GMThttp://www.shnenglu.com/SpringSnow/articles/64657.htmlhttp://www.shnenglu.com/SpringSnow/comments/64657.htmlhttp://www.shnenglu.com/SpringSnow/articles/64657.html#Feedback0http://www.shnenglu.com/SpringSnow/comments/commentRss/64657.htmlhttp://www.shnenglu.com/SpringSnow/services/trackbacks/64657.html一个整数数列,元素取值可能是0~65535中的L一个数Q相同数g会重复出现?是例外,可以反复出现?
误计一个算法,当你从该数列中随意选取5个数|判断q?个数值是否连l相邅R?
注意Q?
- 5个数值允许是乱序的。比如: 8 7 5 0 6
- 0可以通配L数倹{比如:8 7 5 0 6 中的0可以通配?或?
- 0可以多次出现?
- 复杂度如果是O(n2)则不得分?

(2)
设计一个算法,扑և二叉树上L两个l点的最q共同父l点?
复杂度如果是O(n2)则不得分?

(3)
一|序二叉树Qo f=(最大?最?/2Q设计一个算法,扑և距离f值最q、大于f值的l点?
复杂度如果是O(n2)则不得分?

(4)
一个整数数列,元素取值可能是1~NQN是一个较大的正整敎ͼ中的L一个数Q相同数g会重复出现。设计一个算法,扑և数列中符合条件的数对的个敎ͼ满数对中两数的和等于N+1?
复杂度最好是O(n)Q如果是O(n2)则不得分?

Sandy 2008-10-21 23:35 发表评论
]]>
socket的基本原?/title><link>http://www.shnenglu.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.shnenglu.com/SpringSnow/articles/57763.html</guid><wfw:comment>http://www.shnenglu.com/SpringSnow/comments/57763.html</wfw:comment><comments>http://www.shnenglu.com/SpringSnow/articles/57763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/SpringSnow/comments/commentRss/57763.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/SpringSnow/services/trackbacks/57763.html</trackback:ping><description><![CDATA[引一个老师的话Q?#8220;来网l中心不懂网l?#8221;。的在q里学习了近一q_|络的皮毛都没摸着Q惭愧!Q甚x颜?br>做的目有网l的Q但一直不属于我涉及范_让我眼馋慕Q不q想惌׃不懂Q外加也没个氛围Q从一开始想Q到后面不想Q甚臛_现在有些懒得不想C。也只能说明M一个hQ大多像我这LQ不是机遇没来找你,而是你与他擦w而过|了?br>今天也闲得发慌,H然惛_了,学习一下?br> <h2><a title="Permanent Link to Z TCP/IP ?SOCKET ~程的基本原? rel=bookmark><u><font color=#810081>Z TCP/IP ?SOCKET ~程的基本原?/font></u></a></h2> 目的Q?<em>TCP/IP 所l徏|络的不同机器之间利用客?服务器模式徏立通信q接?/em><br>ҎQ?em>为徏立该q接Q开发h员只要提供一些基本的q接信息Q其余由操作pȝ内核来完成?/em><br><br><em>提供哪些信息呢?<br>以机器A通过 TCP/IP 与机器Bq行|络通信ZQ对于机器A来说我们需要知道如下信息:<br>1、机器B的TCP/IP地址Q?br>2、与机器B中哪一个进E?或Y件系l?联系?/em><br><br>同样的对于第一个我q可以理解,W二个就不是很清楚。作者缓~到来,原来使用标准接口的时候,无须定义Q因为我们知道和谁进行交互,然而用其它的则没有那么明了,所以就需要提供第二个参数了?br><br><em>以上两个需要提供的参数Q在套接字中分别表示为机器B的地址和机器B的通信端口。通过在同一机器的不同通信软g中定义不同端口地址Q来表示机器A是与机器B中哪套系l通信。不是利用何种协议Q完全徏立一个网l连接需要五个基本信息。它们分别是<strong>双方的地址</strong>?strong>U定的通讯端口</strong>?strong>协议cd</strong>。SOCKET 通信~程接口q不是专门ؓ TCP/IP 通信提供的,因此套接字通信~程需要在参数中指明通信协议cd。套接字是利用客?服务器模式来实现通信的,客户端Y件和服务器端软g的具体实C有所不同?br><br>具体来说Q在客户端利用基?TCP/IP ?SOCKET 通信~程的基本步骤是Q?br>?声明一个套接字cd的变量,需要在该变量定义中提供本机 IP 地址和通信端口q指明协议类型,׃在此介绍的是Z TCP/IP 的套接字通信Q因此协议类型应该是 TCP/IPQ在~程接口中该cd?AF-INET 来表C;<br>?向对方发接请求,q接时编E者需要提供对?TCP/IP 地址和通信端口Q同?SOCKET 实现E序自动向对提供本机 TCP/IP 地址和通信端口Q?br>?如果q接成功Q会收到Ҏ的应{信Pq以后的通信可以通过套接字的相关操作来实C?br><br></em>步骤Q第一步是要声明一个套接字cd的变量,q在该变量定义中提供本机的IP地址、通信端口和协议类型?br>             W二步向Ҏ发送连接请求。此旉要知道对方的地址和端口,q向Ҏ提供地址和通信端口?br><br>看v来挺单的Q今q一月䆾q想做一个代理服务器的小E序Q一直搞不清楚怎么回事Q最后作|?br><br>努力呀?br><br>学习内容的来源:<a >http://zeuscn.net/studio/2007/09/14/tcp-ip-socket/</a><br> <img src ="http://www.shnenglu.com/SpringSnow/aggbug/57763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/SpringSnow/" target="_blank">Sandy</a> 2008-08-01 15:09 <a href="http://www.shnenglu.com/SpringSnow/articles/57763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.chianyuxun.cn" target="_blank">ĻۺϾþò</a>| <a href="http://www.beijianyi.cn" target="_blank">ҹƷþ</a>| <a href="http://www.dashi1.cn" target="_blank">þþþþAv뾫Ʒר</a>| <a href="http://www.vwdg.cn" target="_blank">þþƷAVDz18</a>| <a href="http://www.zzzjjj.cn" target="_blank">޾ƷþëƬ</a>| <a href="http://www.pd2n.cn" target="_blank">Ʒպþ</a>| <a href="http://www.tangwoshi.cn" target="_blank">þ91Ʒ91</a>| <a href="http://www.sdyuyangjixie.cn" target="_blank">þó˹Ʒ</a>| <a href="http://www.hsjituan.com.cn" target="_blank">99þùۺϾƷ</a>| <a href="http://www.u18718.cn" target="_blank">18պҹþó</a>| <a href="http://www.rolanskin.cn" target="_blank">޹Ʒþһ</a>| <a href="http://www.http2009.cn" target="_blank">99ξþþŷƷվ </a>| <a href="http://www.szltw.cn" target="_blank">ŷҹAŴƬþ</a>| <a href="http://www.ysmyy.com.cn" target="_blank">þþƷһ</a>| <a href="http://www.cn987.cn" target="_blank">97rþþƷ99</a>| <a href="http://www.gn-online.com.cn" target="_blank">þþþø߳ëƬȫ </a>| <a href="http://www.co1txk.cn" target="_blank">޹þþۺ</a>| <a href="http://www.daocheyingxiang.cn" target="_blank">999Ʒþþþþ</a>| <a href="http://www.epfb.cn" target="_blank">ٸþþþþþþþ</a>| <a href="http://www.crs24.cn" target="_blank">޹Ʒ18þþþþ</a>| <a href="http://www.h3cedu.cn" target="_blank">þ91Ʒ91</a>| <a href="http://www.nanghang.cn" target="_blank">þþƷ</a>| <a href="http://www.sooppp.cn" target="_blank">ɫݺݾþۺ</a>| <a href="http://www.93jk.cn" target="_blank">þþžžþƷ</a>| <a href="http://www.dcjx02.cn" target="_blank">ŷѹۿþ</a>| <a href="http://www.xford.cn" target="_blank">þ¾ƷĻ</a>| <a href="http://www.gzxwlt.cn" target="_blank">޾ƷþþþAV鶹</a>| <a href="http://www.hydqgs.cn" target="_blank">޾þһ</a>| <a href="http://www.huameizc.cn" target="_blank">þþƷ99Ʒ</a>| <a href="http://www.youhezulin.cn" target="_blank">ɫAVԾþþþþ</a>| <a href="http://www.97xxri.cn" target="_blank">޹Ʒþþþ</a>| <a href="http://www.thankers.com.cn" target="_blank">þþþƷձһ</a>| <a href="http://www.iaicy.cn" target="_blank">ݺɫþۺѿ </a>| <a href="http://www.u2860.cn" target="_blank">ղƷþþþþþɫ</a>| <a href="http://www.icaew.com.cn" target="_blank">VVþþ</a>| <a href="http://www.9258bbs.cn" target="_blank">ƷžžþƵ</a>| <a href="http://www.lefanz.cn" target="_blank">7777Ʒ˾þþô߽</a>| <a href="http://www.yxwelding.com.cn" target="_blank">Ʒһþþ </a>| <a href="http://www.xqt007.cn" target="_blank">ƷþþþþþþӰԺ</a>| <a href="http://www.w4749.cn" target="_blank">þþƷŷպƷ</a>| <a href="http://www.ciao-surveys.cn" target="_blank">þþƷ7777</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>