锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产一区二区久久精品,在线精品亚洲,亚洲精品黄网在线观看http://www.shnenglu.com/Khan/category/773.html璺極婕紝闀夸慨榪滐紝鎴戜滑涓嶈兘娌℃湁閽?/description>zh-cnTue, 20 May 2008 13:13:02 GMTTue, 20 May 2008 13:13:02 GMT60鏄ㄥぉ鐜ヾelphi綰跨▼,鎵懼埌涓綃囨枃绔?寮虹儓鎺ㄨ崘澶у鐪嬬湅,tthread浠g爜鍒嗘瀽http://www.shnenglu.com/Khan/archive/2006/11/21/15503.htmlKhan's NotebookKhan's NotebookTue, 21 Nov 2006 03:46:00 GMThttp://www.shnenglu.com/Khan/archive/2006/11/21/15503.htmlhttp://www.shnenglu.com/Khan/comments/15503.htmlhttp://www.shnenglu.com/Khan/archive/2006/11/21/15503.html#Feedback1http://www.shnenglu.com/Khan/comments/commentRss/15503.htmlhttp://www.shnenglu.com/Khan/services/trackbacks/15503.html

Delphi涓殑綰跨▼綾宦?br />聽
杞創(chuàng)浜?鍗庡榛戝鍚岀洘 http://www.77169.org

Delphi涓湁涓涓嚎紼嬬被TThread鏄敤鏉ュ疄鐜板綰跨▼緙栫▼鐨勶紝榪欎釜緇濆ぇ澶氭暟Delphi涔﹁棄閮芥湁璇村埌錛屼絾鍩烘湰涓婇兘鏄

TThread綾葷殑鍑犱釜鎴愬憳浣滀竴綆鍗曚粙緇嶏紝鍐嶈鏄庝竴涓婨xecute鐨勫疄鐜板拰Synchronize鐨勭敤娉曞氨瀹屼簡銆傜劧鑰岃繖騫朵笉鏄綰跨▼緙?br />紼嬬殑鍏ㄩ儴錛屾垜鍐欐鏂囩殑鐩殑鍦ㄤ簬瀵規(guī)浣滀竴涓ˉ鍏呫?/p>

綰跨▼鏈川涓婃槸榪涚▼涓竴孌靛茍鍙戣繍琛岀殑浠g爜銆備竴涓繘紼嬭嚦灝戞湁涓涓嚎紼嬶紝鍗蟲墍璋撶殑涓葷嚎紼嬨傚悓鏃惰繕鍙互鏈夊涓瓙綰跨▼銆?br />褰撲竴涓繘紼嬩腑鐢ㄥ埌瓚呰繃涓涓嚎紼嬫椂錛屽氨鏄墍璋撶殑鈥滃綰跨▼鈥濄?br />閭d箞榪欎釜鎵璋撶殑鈥滀竴孌典唬鐮佲濇槸濡備綍瀹氫箟鐨勫憿錛熷叾瀹炲氨鏄竴涓嚱鏁版垨榪囩▼錛堝Delphi鑰岃█錛夈?br />濡傛灉鐢╓indows API鏉ュ垱寤虹嚎紼嬬殑璇濓紝鏄氳繃涓涓彨鍋欳reateThread鐨凙PI鍑芥暟鏉ュ疄鐜扮殑錛屽畠鐨勫畾涔変負(fù)錛?br />HANDLE CreateThread(
聽聽聽 LPSECURITY_ATTRIBUTES lpThreadAttributes,
聽聽聽 DWORD dwStackSize,
聽聽聽 LPTHREAD_START_ROUTINE lpStartAddress,
聽聽聽 LPVOID lpParameter,
聽聽聽 DWORD dwCreationFlags,
聽聽聽 LPDWORD lpThreadId
);

鍏跺悇鍙傛暟濡傚畠浠殑鍚嶇О鎵璇達紝鍒嗗埆鏄細綰跨▼灞炴э紙鐢ㄤ簬鍦∟T涓嬭繘琛岀嚎紼嬬殑瀹夊叏灞炴ц緗紝鍦?X涓嬫棤鏁堬級錛屽爢鏍堝ぇ灝忥紝
璧峰鍦板潃錛屽弬鏁幫紝鍒涘緩鏍囧織錛堢敤浜庤緗嚎紼嬪垱寤烘椂鐨勭姸鎬侊級錛岀嚎紼婭D錛屾渶鍚庤繑鍥炵嚎紼婬andle銆傚叾涓殑璧峰鍦板潃灝辨槸綰?br />紼嬪嚱鏁扮殑鍏ュ彛錛岀洿鑷崇嚎紼嬪嚱鏁扮粨鏉燂紝綰跨▼涔熷氨緇撴潫浜嗐?/p>

鍥犱負(fù)CreateThread鍙傛暟寰堝錛岃屼笖鏄疻indows鐨凙PI錛屾墍浠ュ湪C Runtime Library閲屾彁渚涗簡涓涓氱敤鐨勭嚎紼嬪嚱鏁幫紙鐞嗚涓?br />鍙互鍦ㄤ換浣曟敮鎸佺嚎紼嬬殑OS涓嬌鐢級錛?br />unsigned long _beginthread(void (_USERENTRY *__start)(void *), unsigned __stksize, void *__arg);

Delphi涔熸彁渚涗簡涓涓浉鍚屽姛鑳界殑綾諱技鍑芥暟錛?br />function BeginThread(
聽聽聽 SecurityAttributes: Pointer;
聽聽聽 StackSize: LongWord;
聽聽聽 ThreadFunc: TThreadFunc;
聽聽聽 Parameter: Pointer;
聽聽聽 CreationFlags: LongWord;
聽聽聽 var ThreadId: LongWord
): Integer;

榪欎笁涓嚱鏁扮殑鍔熻兘鏄熀鏈浉鍚岀殑錛屽畠浠兘鏄皢綰跨▼鍑芥暟涓殑浠g爜鏀懼埌涓涓嫭绔嬬殑綰跨▼涓墽琛屻傜嚎紼嬪嚱鏁頒笌涓鑸嚱鏁扮殑
鏈澶т笉鍚屽湪浜庯紝綰跨▼鍑芥暟涓鍚姩錛岃繖涓変釜綰跨▼鍚姩鍑芥暟灝辮繑鍥炰簡錛屼富綰跨▼緇х畫鍚戜笅鎵ц錛岃岀嚎紼嬪嚱鏁板湪涓涓嫭绔嬬殑綰?br />紼嬩腑鎵ц錛屽畠瑕佹墽琛屽涔咃紝浠涔堟椂鍊欒繑鍥烇紝涓葷嚎紼嬫槸涓嶇涔熶笉鐭ラ亾鐨勩?br />姝e父鎯呭喌涓嬶紝綰跨▼鍑芥暟榪斿洖鍚庯紝綰跨▼灝辯粓姝簡銆備絾涔熸湁鍏跺畠鏂瑰紡錛?/p>

Windows API錛?br />VOID ExitThread( DWORD dwExitCode );

C Runtime Library錛?br />void _endthread(void);

Delphi Runtime Library錛?br />procedure EndThread(ExitCode: Integer);

涓轟簡璁板綍涓浜涘繀瑕佺殑綰跨▼鏁版嵁錛堢姸鎬?灞炴х瓑錛夛紝OS浼氫負(fù)綰跨▼鍒涘緩涓涓唴閮∣bject錛屽鍦╓indows涓偅涓狧andle渚挎槸榪?br />涓唴閮∣bject鐨凥andle錛屾墍浠ュ湪綰跨▼緇撴潫鐨勬椂鍊欒繕搴旇閲婃斁榪欎釜Object銆?/p>

铏界劧璇寸敤API鎴朢TL(Runtime Library)宸茬粡鍙互寰堟柟渚垮湴榪涜澶氱嚎紼嬬紪紼嬩簡錛屼絾鏄繕鏄渶瑕佽繘琛岃緝澶氱殑緇嗚妭澶勭悊錛屼負(fù)姝?br />Delphi鍦–lasses鍗曞厓涓綰跨▼浣滀簡涓涓緝濂界殑灝佽錛岃繖灝辨槸VCL鐨勭嚎紼嬬被錛歍Thread
浣跨敤榪欎釜綾諱篃寰堢畝鍗曪紝澶у鏁扮殑Delphi涔︾睄閮芥湁璇達紝鍩烘湰鐢ㄦ硶鏄細鍏堜粠TThread媧劇敓涓涓嚜宸辯殑綰跨▼綾伙紙鍥犱負(fù)TThread
鏄竴涓娊璞$被錛屼笉鑳界敓鎴愬疄渚嬶級錛岀劧鍚庢槸Override鎶借薄鏂規(guī)硶錛欵xecute錛堣繖灝辨槸綰跨▼鍑芥暟錛屼篃灝辨槸鍦ㄧ嚎紼嬩腑鎵ц鐨勪唬鐮?br />閮ㄥ垎錛夛紝濡傛灉闇瑕佺敤鍒板彲瑙哣CL瀵硅薄錛岃繕闇瑕侀氳繃Synchronize榪囩▼榪涜銆傚叧浜庝箣鏂歸潰鐨勫叿浣撶粏鑺傦紝榪欓噷涓嶅啀璧樿堪錛岃
鍙傝冪浉鍏充功綾嶃?/p>

鏈枃鎺ヤ笅鏉ヨ璁ㄨ鐨勬槸TThread綾繪槸濡備綍瀵圭嚎紼嬭繘琛屽皝瑁呯殑錛屼篃灝辨槸娣卞叆鐮旂┒涓涓婽Thread綾葷殑瀹炵幇銆傚洜涓哄彧鏄湡姝e湴
浜嗚В浜嗗畠錛屾墠鏇村ソ鍦頒嬌鐢ㄥ畠銆?br />涓嬮潰鏄疍ELPHI7涓璗Thread綾葷殑澹版槑錛堟湰鏂囧彧璁ㄨ鍦╓indows騫沖彴涓嬬殑瀹炵幇錛屾墍浠ュ幓鎺変簡鎵鏈夋湁鍏矻inux騫沖彴閮ㄥ垎鐨勪唬鐮?br />錛夛細

TThread = class
private
聽聽聽 FHandle: THandle;
聽聽聽 FThreadID: THandle;
聽聽聽 FCreateSuspended: Boolean;
聽聽聽 FTerminated: Boolean;
聽聽聽 FSuspended: Boolean;
聽聽聽 FFreeOnTerminate: Boolean;
聽聽聽 FFinished: Boolean;
聽聽聽 FReturnValue: Integer;
聽聽聽 FOnTerminate: TNotifyEvent;
聽聽聽 FSynchronize: TSynchronizeRecord;
聽聽聽 FFatalException: TObject;
聽聽聽 procedure CallOnTerminate;
聽聽聽 class procedure Synchronize(ASyncRec: PSynchronizeRecord); overload;
聽聽聽 function GetPriority: TThreadPriority;
聽聽聽 procedure SetPriority(Value: TThreadPriority);
聽聽聽 procedure SetSuspended(Value: Boolean);
protected
聽聽聽 procedure CheckThreadError(ErrCode: Integer); overload;
聽聽聽 procedure CheckThreadError(Success: Boolean); overload;
聽聽聽 procedure DoTerminate; virtual;
聽聽聽 procedure Execute; virtual; abstract;
聽聽聽 procedure Synchronize(Method: TThreadMethod); overload;
聽聽聽 property ReturnValue: Integer read FReturnValue write FReturnValue;
聽聽聽 property Terminated: Boolean read FTerminated;
public
聽聽聽 constructor Create(CreateSuspended: Boolean);
聽聽聽 destructor Destroy; override;
聽聽聽 procedure AfterConstruction; override;
聽聽聽 procedure Resume;
聽聽聽 procedure Suspend;
聽聽聽 procedure Terminate;
聽聽聽 function WaitFor: LongWord;
聽聽聽 class procedure Synchronize(AThread: TThread; AMethod: TThreadMethod); overload;
聽聽聽 class procedure StaticSynchronize(AThread: TThread; AMethod: TThreadMethod);
聽聽聽 property FatalException: TObject read FFatalException;
聽聽聽 property FreeOnTerminate: Boolean read FFreeOnTerminate write FFreeOnTerminate;
聽聽聽 property Handle: THandle read FHandle;
聽聽聽 property Priority: TThreadPriority read GetPriority write SetPriority;
聽聽聽 property Suspended: Boolean read FSuspended write SetSuspended;
聽聽聽 property ThreadID: THandle read FThreadID;
聽聽聽 property OnTerminate: TNotifyEvent read FOnTerminate write FOnTerminate;
end;

TThread綾誨湪Delphi鐨凴TL閲岀畻鏄瘮杈冪畝鍗曠殑綾伙紝綾繪垚鍛樹篃涓嶅錛岀被灞炴ч兘寰堢畝鍗曟槑鐧斤紝鏈枃灝嗗彧瀵瑰嚑涓瘮杈冮噸瑕佺殑綾?br />鎴愬憳鏂規(guī)硶鍜屽敮涓鐨勪簨浠訛細OnTerminate浣滆緇嗗垎鏋愩?br />棣栧厛灝辨槸鏋勯犲嚱鏁幫細
constructor TThread.Create(CreateSuspended: Boolean);
begin
聽聽聽 inherited Create;
聽聽聽 AddThread;
聽聽聽 FSuspended := CreateSuspended;
聽聽聽 FCreateSuspended := CreateSuspended;
聽聽聽 FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);
聽聽聽 if FHandle = 0 then
聽聽聽聽聽聽聽 raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]);
end;
铏界劧榪欎釜鏋勯犲嚱鏁版病鏈夊灝戜唬鐮侊紝浣嗗嵈鍙互綆楁槸鏈閲嶈鐨勪竴涓垚鍛橈紝鍥犱負(fù)綰跨▼灝辨槸鍦ㄨ繖閲岃鍒涘緩鐨勩?br />鍦ㄩ氳繃Inherited璋冪敤TObject.Create鍚庯紝絎竴鍙ュ氨鏄皟鐢ㄤ竴涓繃紼嬶細AddThread錛屽叾婧愮爜濡備笅錛?br />procedure AddThread;
begin
聽聽聽 InterlockedIncrement(ThreadCount);
end;

鍚屾牱鏈変竴涓搴旂殑RemoveThread錛?br />procedure RemoveThread;
begin
聽聽聽 InterlockedDecrement(ThreadCount);
end;
瀹冧滑鐨勫姛鑳藉緢綆鍗曪紝灝辨槸閫氳繃澧炲噺涓涓叏灞鍙橀噺鏉ョ粺璁¤繘紼嬩腑鐨勭嚎紼嬫暟銆傚彧鏄繖閲岀敤浜庡鍑忓彉閲忕殑騫朵笉鏄父鐢ㄧ殑
Inc/Dec榪囩▼錛岃屾槸鐢ㄤ簡InterlockedIncrement/InterlockedDecrement榪欎竴瀵硅繃紼嬶紝瀹冧滑瀹炵幇鐨勫姛鑳藉畬鍏ㄤ竴鏍鳳紝閮芥槸
瀵瑰彉閲忓姞涓鎴栧噺涓銆備絾瀹冧滑鏈変竴涓渶澶х殑鍖哄埆錛岄偅灝辨槸InterlockedIncrement/InterlockedDecrement鏄嚎紼嬪畨鍏ㄧ殑銆?br />鍗沖畠浠湪澶氱嚎紼嬩笅鑳戒繚璇佹墽琛岀粨鏋滄紜紝鑰孖nc/Dec涓嶈兘銆傛垨鑰呮寜鎿嶄綔緋葷粺鐞嗚涓殑鏈鏉ヨ錛岃繖鏄竴瀵光滃師璇濇搷浣溿?/p>

浠ュ姞涓涓轟緥鏉ヨ鏄庝簩鑰呭疄鐜扮粏鑺備笂鐨勪笉鍚岋細
涓鑸潵璇達紝瀵瑰唴瀛樻暟鎹姞涓鐨勬搷浣滃垎瑙d互鍚庢湁涓変釜姝ラ錛?br />1銆?浠庡唴瀛樹腑璇誨嚭鏁版嵁
2銆?鏁版嵁鍔犱竴
3銆?瀛樺叆鍐呭瓨
鐜板湪鍋囪鍦ㄤ竴涓袱涓嚎紼嬬殑搴旂敤涓敤Inc榪涜鍔犱竴鎿嶄綔鍙兘鍑虹幇鐨勪竴縐嶆儏鍐碉細
1銆?綰跨▼A浠庡唴瀛樹腑璇誨嚭鏁版嵁錛堝亣璁句負(fù)3錛?br />2銆?綰跨▼B浠庡唴瀛樹腑璇誨嚭鏁版嵁錛堜篃鏄?錛?br />3銆?綰跨▼A瀵規(guī)暟鎹姞涓錛堢幇鍦ㄦ槸4錛?br />4銆?綰跨▼B瀵規(guī)暟鎹姞涓錛堢幇鍦ㄤ篃鏄?錛?br />5銆?綰跨▼A灝嗘暟鎹瓨鍏ュ唴瀛橈紙鐜板湪鍐呭瓨涓殑鏁版嵁鏄?錛?br />6銆?綰跨▼B涔熷皢鏁版嵁瀛樺叆鍐呭瓨錛堢幇鍦ㄥ唴瀛樹腑鐨勬暟鎹繕鏄?錛屼絾涓や釜綰跨▼閮藉瀹冨姞浜嗕竴錛屽簲璇ユ槸5鎵嶅錛屾墍浠ヨ繖閲屽嚭鐜頒簡
閿欒鐨勭粨鏋滐級

鑰岀敤InterlockIncrement榪囩▼鍒欐病鏈夎繖涓棶棰橈紝鍥犱負(fù)鎵璋撯滃師璇濇槸涓縐嶄笉鍙腑鏂殑鎿嶄綔錛屽嵆鎿嶄綔緋葷粺鑳戒繚璇佸湪涓涓?br />鈥滃師璇濇墽琛屽畬姣曞墠涓嶄細榪涜綰跨▼鍒囨崲銆傛墍浠ュ湪涓婇潰閭d釜渚嬪瓙涓紝鍙湁褰撶嚎紼婣鎵ц瀹屽皢鏁版嵁瀛樺叆鍐呭瓨鍚庯紝綰跨▼B鎵嶅彲
浠ュ紑濮嬩粠涓彇鏁板茍榪涜鍔犱竴鎿嶄綔錛岃繖鏍峰氨淇濊瘉浜嗗嵆浣挎槸鍦ㄥ綰跨▼鎯呭喌涓嬶紝緇撴灉涔熶竴瀹氫細鏄紜殑銆?/p>

鍓嶉潰閭d釜渚嬪瓙涔熻鏄庝竴縐嶁滅嚎紼嬭闂啿紿佲濈殑鎯呭喌錛岃繖涔熷氨鏄負(fù)浠涔堢嚎紼嬩箣闂撮渶瑕佲滃悓姝モ濓紙Synchronize錛夛紝鍏充簬榪?br />涓紝鍦ㄥ悗闈㈣鍒板悓姝ユ椂榪樹細鍐嶈緇嗚璁恒?/p>

璇村埌鍚屾錛屾湁涓涓澶栬瘽錛氬姞鎷垮ぇ婊戦搧鍗㈠ぇ瀛︾殑鏁欐巿鏉庢槑鏇懼氨Synchronize涓璇嶅湪鈥滅嚎紼嬪悓姝モ濅腑琚瘧浣溾滃悓姝モ濇彁鍑?br />榪囧紓璁紝涓漢璁や負(fù)浠栬鐨勫叾瀹炲緢鏈夐亾鐞嗐傚湪涓枃涓滃悓姝モ濈殑鎰忔濇槸鈥滃悓鏃跺彂鐢熲濓紝鑰屸滅嚎紼嬪悓姝モ濈洰鐨勫氨鏄伩鍏嶈繖
縐嶁滃悓鏃跺彂鐢熲濈殑浜嬫儏銆傝屽湪鑻辨枃涓紝Synchronize鐨勬剰鎬濇湁涓や釜錛氫竴涓槸浼犵粺鎰忎箟涓婄殑鍚屾錛圱o occur at the same
time錛夛紝鍙︿竴涓槸鈥滃崗璋冧竴鑷粹濓紙To operate in unison錛夈傚湪鈥滅嚎紼嬪悓姝モ濅腑鐨凷ynchronize涓璇嶅簲璇ユ槸鎸囧悗闈竴縐?br />鎰忔濓紝鍗斥滀繚璇佸涓嚎紼嬪湪璁塊棶鍚屼竴鏁版嵁鏃訛紝淇濇寔鍗忚皟涓鑷達紝閬垮厤鍑洪敊鈥濄備笉榪囧儚榪欐牱璇戝緱涓嶅噯鐨勮瘝鍦↖T涓氳繕鏈夊緢澶?br />錛屾棦鐒跺凡緇忔槸綰﹀畾淇楁垚浜嗭紝鏈枃涔熷皢緇х畫娌跨敤錛屽彧鏄湪榪欓噷璇存槑涓涓嬶紝鍥犱負(fù)杞歡寮鍙戞槸涓欏圭粏鑷寸殑宸ヤ綔錛岃寮勬竻妤氱殑
錛岀粷涓嶈兘鍚硦銆?/p>

鎵繙浜嗭紝鍥炲埌TThread鐨勬瀯閫犲嚱鏁頒笂錛屾帴涓嬫潵鏈閲嶈灝辨槸榪欏彞浜嗭細
FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);
榪欓噷灝辯敤鍒頒簡鍓嶉潰璇村埌鐨凞elphi RTL鍑芥暟BeginThread錛屽畠鏈夊緢澶氬弬鏁幫紝鍏抽敭鐨勬槸絎笁銆佸洓涓や釜鍙傛暟銆傜涓変釜鍙傛暟灝辨槸
鍓嶉潰璇村埌鐨勭嚎紼嬪嚱鏁幫紝鍗沖湪綰跨▼涓墽琛岀殑浠g爜閮ㄥ垎銆傜鍥涗釜鍙傛暟鍒欐槸浼犻掔粰綰跨▼鍑芥暟鐨勫弬鏁幫紝鍦ㄨ繖閲屽氨鏄垱寤虹殑綰跨▼
瀵硅薄錛堝嵆Self錛夈傚叾瀹冪殑鍙傛暟涓紝絎簲涓槸鐢ㄤ簬璁劇疆綰跨▼鍦ㄥ垱寤哄悗鍗蟲寕璧鳳紝涓嶇珛鍗蟲墽琛岋紙鍚姩綰跨▼鐨勫伐浣滄槸鍦?br />AfterConstruction涓牴鎹瓹reateSuspended鏍囧織鏉ュ喅瀹氱殑錛夛紝絎叚涓槸榪斿洖綰跨▼ID銆?/p>

鐜板湪鏉ョ湅TThread鐨勬牳蹇冿細綰跨▼鍑芥暟ThreadProc銆傛湁鎰忔濈殑鏄繖涓嚎紼嬬被鐨勬牳蹇冨嵈涓嶆槸綰跨▼鐨勬垚鍛橈紝鑰屾槸涓涓叏灞鍑芥暟
錛堝洜涓築eginThread榪囩▼鐨勫弬鏁扮害瀹氬彧鑳界敤鍏ㄥ眬鍑芥暟錛夈備笅闈㈡槸瀹冪殑浠g爜錛?/p>

function ThreadProc(Thread: TThread): Integer;
var
聽聽聽 FreeThread: Boolean;
begin
聽聽聽聽聽 try
聽聽聽聽聽聽聽聽聽聽聽 if not Thread.Terminated then
聽聽聽聽聽聽聽聽聽聽聽 try
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 Thread.Execute;
聽聽聽聽聽聽聽聽聽聽聽 except
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 Thread.FFatalException := AcquireExceptionObject;
聽聽聽聽聽聽聽聽聽聽聽 end;
聽聽聽聽聽 finally
聽聽聽聽聽聽聽聽聽聽聽 FreeThread := Thread.FFreeOnTerminate;
聽聽聽聽聽聽聽聽聽聽聽 Result := Thread.FReturnValue;
聽聽聽聽聽聽聽聽聽聽聽 Thread.DoTerminate;
聽聽聽聽聽聽聽聽聽聽聽 Thread.FFinished := True;
聽聽聽聽聽聽聽聽聽聽聽 SignalSyncEvent;
聽聽聽聽聽聽聽聽聽聽聽 if FreeThread then Thread.Free;
聽聽聽聽聽聽聽聽聽聽聽 EndThread(Result);
聽聽聽聽聽 end;
end;
铏界劧涔熸病鏈夊灝戜唬鐮侊紝浣嗗嵈鏄暣涓猅Thread涓渶閲嶈鐨勯儴鍒嗭紝鍥犱負(fù)榪欐浠g爜鏄湡姝e湪綰跨▼涓墽琛岀殑浠g爜銆備笅闈㈠浠g爜浣?br />閫愯璇存槑錛?br />棣栧厛鍒ゆ柇綰跨▼綾葷殑Terminated鏍囧織錛屽鏋滄湭琚爣蹇椾負(fù)緇堟錛屽垯璋冪敤綰跨▼綾葷殑Execute鏂規(guī)硶鎵ц綰跨▼浠g爜錛屽洜涓篢Thread
鏄娊璞$被錛孍xecute鏂規(guī)硶鏄娊璞℃柟娉曪紝鎵浠ユ湰璐ㄤ笂鏄墽琛屾淳鐢熺被涓殑Execute浠g爜銆?/p>

鎵浠ヨ錛孍xecute灝辨槸綰跨▼綾諱腑鐨勭嚎紼嬪嚱鏁幫紝鎵鏈夊湪Execute涓殑浠g爜閮介渶瑕佸綋浣滅嚎紼嬩唬鐮佹潵鑰冭檻錛屽闃叉璁塊棶鍐茬獊絳夈?br />濡傛灉Execute鍙戠敓寮傚父錛屽垯閫氳繃AcquireExceptionObject鍙栧緱寮傚父瀵硅薄錛屽茍瀛樺叆綰跨▼綾葷殑FFatalException鎴愬憳涓?br />鏈鍚庢槸綰跨▼緇撴潫鍓嶅仛鐨勪竴浜涙敹灝懼伐浣溿傚眬閮ㄥ彉閲廎reeThread璁板綍浜嗙嚎紼嬬被鐨凢reeOnTerminated灞炴х殑璁劇疆錛岀劧鍚庡皢綰?br />紼嬭繑鍥炲艱緗負(fù)綰跨▼綾葷殑榪斿洖鍊煎睘鎬х殑鍊箋傜劧鍚庢墽琛岀嚎紼嬬被鐨凞oTerminate鏂規(guī)硶銆?/p>

DoTerminate鏂規(guī)硶鐨勪唬鐮佸涓嬶細
procedure TThread.DoTerminate;
begin
聽聽聽 if Assigned(FOnTerminate) then Synchronize(CallOnTerminate);
end;

寰堢畝鍗曪紝灝辨槸閫氳繃Synchronize鏉ヨ皟鐢–allOnTerminate鏂規(guī)硶錛岃孋allOnTerminate鏂規(guī)硶鐨勪唬鐮佸涓嬶紝灝辨槸綆鍗曞湴璋冪敤
OnTerminate浜嬩歡錛?br />procedure TThread.CallOnTerminate;
begin
聽聽聽 if Assigned(FOnTerminate) then FOnTerminate(Self);
end;

鍥犱負(fù)OnTerminate浜嬩歡鏄湪Synchronize涓墽琛岀殑錛屾墍浠ユ湰璐ㄤ笂瀹冨茍涓嶆槸綰跨▼浠g爜錛岃屾槸涓葷嚎紼嬩唬鐮侊紙鍏蜂綋瑙佸悗闈㈠
Synchronize鐨勫垎鏋愶級銆?/p>

鎵ц瀹孫nTerminate鍚庯紝灝嗙嚎紼嬬被鐨凢Finished鏍囧織璁劇疆涓篢rue銆傛帴涓嬫潵鎵цSignalSyncEvent榪囩▼錛屽叾浠g爜濡備笅錛?br />procedure SignalSyncEvent;
begin
聽聽聽 SetEvent(SyncEvent);
end;

涔熷緢綆鍗曪紝灝辨槸璁劇疆涓涓嬩竴涓叏灞Event錛歋yncEvent錛屽叧浜嶦vent鐨勪嬌鐢紝鏈枃灝嗗湪鍚庢枃璇﹁堪錛岃孲yncEvent鐨勭敤閫斿皢
鍦╓aitFor榪囩▼涓鏄庛?/p>

鐒跺悗鏍規(guī)嵁FreeThread涓繚瀛樼殑FreeOnTerminate璁劇疆鍐沖畾鏄惁閲婃斁綰跨▼綾伙紝鍦ㄧ嚎紼嬬被閲婃斁鏃訛紝榪樻湁涓浜涗簺鎿嶄綔錛岃瑙佹帴
涓嬫潵鐨勬瀽鏋勫嚱鏁板疄鐜般?br />鏈鍚庤皟鐢‥ndThread緇撴潫綰跨▼錛岃繑鍥炵嚎紼嬭繑鍥炲箋傝嚦姝わ紝綰跨▼瀹屽叏緇撴潫銆?br />璇村畬鏋勯犲嚱鏁幫紝鍐嶆潵鐪嬫瀽鏋勫嚱鏁幫細
destructor TThread.Destroy;
begin
聽 if (FThreadID <> 0) and not FFinished then聽 begin
聽聽聽聽聽 Terminate;
聽聽聽聽聽 if FCreateSuspended then
聽聽聽聽聽聽聽聽聽 Resume;
聽聽聽聽聽 WaitFor;
聽 end;
聽 if FHandle <> 0 then CloseHandle(FHandle);
聽 inherited Destroy;
聽 FFatalException.Free;
聽 RemoveThread;
end;

鍦ㄧ嚎紼嬪璞¤閲婃斁鍓嶏紝棣栧厛瑕佹鏌ョ嚎紼嬫槸鍚﹁繕鍦ㄦ墽琛屼腑錛屽鏋滅嚎紼嬭繕鍦ㄦ墽琛屼腑錛堢嚎紼婭D涓嶄負(fù)0錛屽茍涓旂嚎紼嬬粨鏉熸爣蹇楁湭璁?br />緗級錛屽垯璋冪敤Terminate榪囩▼緇撴潫綰跨▼銆俆erminate榪囩▼鍙槸綆鍗曞湴璁劇疆綰跨▼綾葷殑Terminated鏍囧織錛屽涓嬮潰鐨勪唬鐮侊細

procedure TThread.Terminate;
begin
聽聽聽 FTerminated := True;
end;

鎵浠ョ嚎紼嬩粛鐒跺繀欏葷戶緇墽琛屽埌姝e父緇撴潫鍚庢墠琛岋紝鑰屼笉鏄珛鍗崇粓姝㈢嚎紼嬶紝榪欎竴鐐硅娉ㄦ剰銆?/p>

鍦ㄨ繖閲岃涓鐐歸澶栬瘽錛氬緢澶氫漢閮介棶榪囨垜錛屽浣曟墠鑳解滅珛鍗斥濈粓姝㈢嚎紼嬶紙褰撶劧鏄寚鐢═Thread鍒涘緩鐨勭嚎紼嬶級銆傜粨鏋滃綋鐒舵槸
涓嶈錛佺粓姝㈢嚎紼嬬殑鍞竴鍔炴硶灝辨槸璁〦xecute鏂規(guī)硶鎵ц瀹屾瘯錛屾墍浠ヤ竴鑸潵璇達紝瑕佽浣犵殑綰跨▼鑳藉灝藉揩緇堟錛屽繀欏誨湪
Execute鏂規(guī)硶涓湪杈冪煭鐨勬椂闂村唴涓嶆柇鍦版鏌erminated鏍囧織錛屼互渚胯兘鍙婃椂鍦伴鍑恒傝繖鏄璁$嚎紼嬩唬鐮佺殑涓涓緢閲嶈鐨勫師
鍒欙紒

褰撶劧濡傛灉浣犱竴瀹氳鑳解滅珛鍗斥濋鍑虹嚎紼嬶紝閭d箞TThread綾諱笉鏄竴涓ソ鐨勯夋嫨錛屽洜涓哄鏋滅敤API寮哄埗緇堟綰跨▼鐨勮瘽錛屾渶緇?br />浼氬鑷碩Thread綰跨▼瀵硅薄涓嶈兘琚紜噴鏀撅紝鍦ㄥ璞℃瀽鏋勬椂鍑虹幇Access Violation銆傝繖縐嶆儏鍐典綘鍙兘鐢ˋPI鎴朢TL鍑芥暟鏉ュ垱
寤虹嚎紼嬨?/p>

濡傛灉綰跨▼澶勪簬鍚姩鎸傝搗鐘舵侊紝鍒欏皢綰跨▼杞叆榪愯鐘舵侊紝鐒跺悗璋冪敤WaitFor榪涜絳夊緟錛屽叾鍔熻兘灝辨槸絳夊緟鍒扮嚎紼嬬粨鏉熷悗鎵嶇戶
緇悜涓嬫墽琛屻傚叧浜嶹aitFor鐨勫疄鐜幫紝灝嗘斁鍒板悗闈㈣鏄庛?/p>

綰跨▼緇撴潫鍚庯紝鍏抽棴綰跨▼Handle錛堟甯哥嚎紼嬪垱寤虹殑鎯呭喌涓婬andle閮芥槸瀛樺湪鐨勶級錛岄噴鏀炬搷浣滅郴緇熷垱寤虹殑綰跨▼瀵硅薄銆?br />鐒跺悗璋冪敤TObject.Destroy閲婃斁鏈璞★紝騫墮噴鏀懼凡緇忔崟鑾風(fēng)殑寮傚父瀵硅薄錛屾渶鍚庤皟鐢≧emoveThread鍑忓皬榪涚▼鐨勭嚎紼嬫暟銆?/p>

鍏跺畠鍏充簬Suspend/Resume鍙婄嚎紼嬩紭鍏堢駭璁劇疆絳夋柟闈紝涓嶆槸鏈枃鐨勯噸鐐癸紝涓嶅啀璧樿堪銆備笅闈㈣璁ㄨ鐨勬槸鏈枃鐨勫彟涓や釜閲嶇偣
錛歋ynchronize鍜學(xué)aitFor銆?/p>

浣嗘槸鍦ㄤ粙緇嶈繖涓や釜鍑芥暟涔嬪墠錛岄渶瑕佸厛浠嬬粛鍙﹀涓や釜綰跨▼鍚屾鎶鏈細浜嬩歡鍜屼復(fù)鐣屽尯銆?/p>

浜嬩歡錛圗vent錛変笌Delphi涓殑浜嬩歡鏈夋墍涓嶅悓銆備粠鏈川涓婅錛孍vent鍏跺疄鐩稿綋浜庝竴涓叏灞鐨勫竷?yōu)當(dāng)鍙橀噺銆傚畠鏈変袱涓祴鍊兼搷浣?br />錛歋et鍜孯eset錛岀浉褰撲簬鎶婂畠璁劇疆涓篢rue鎴朏alse銆傝屾鏌ュ畠鐨勫兼槸閫氳繃WaitFor鎿嶄綔榪涜銆傚搴斿湪Windows騫沖彴涓婏紝鏄笁
涓狝PI鍑芥暟錛歋etEvent銆丷esetEvent銆乄aitForSingleObject錛堝疄鐜癢aitFor鍔熻兘鐨凙PI榪樻湁鍑犱釜錛岃繖鏄渶綆鍗曠殑涓涓級銆?/p>

榪欎笁涓兘鏄師璇紝鎵浠vent鍙互瀹炵幇涓鑸竷?yōu)當(dāng)鍙橀噺涓嶈兘瀹炵幇鐨勫湪澶毦U跨▼涓殑搴旂敤銆係et鍜孯eset鐨勫姛鑳藉墠闈㈠凡緇忚榪囦簡
錛岀幇鍦ㄦ潵璇翠竴涓媁aitFor鐨勫姛鑳斤細

WaitFor鐨勫姛鑳芥槸媯鏌vent鐨勭姸鎬佹槸鍚︽槸Set鐘舵侊紙鐩稿綋浜嶵rue錛夛紝濡傛灉鏄垯绔嬪嵆榪斿洖錛屽鏋滀笉鏄紝鍒欑瓑寰呭畠鍙樹負(fù)Set
鐘舵侊紝鍦ㄧ瓑寰呮湡闂達紝璋冪敤WaitFor鐨勭嚎紼嬪浜庢寕璧風(fēng)姸鎬併傚彟澶朩aitFor鏈変竴涓弬鏁扮敤浜庤秴鏃惰緗紝濡傛灉姝ゅ弬鏁頒負(fù)0錛屽垯涓?br />絳夊緟錛岀珛鍗寵繑鍥濫vent鐨勭姸鎬侊紝濡傛灉鏄疘NFINITE鍒欐棤闄愮瓑寰咃紝鐩村埌Set鐘舵佸彂鐢燂紝鑻ユ槸涓涓湁闄愮殑鏁板鹼紝鍒欑瓑寰呯浉搴旂殑
姣鏁板悗榪斿洖Event鐨勭姸鎬併?/p>

褰揈vent浠嶳eset鐘舵佸悜Set鐘舵佽漿鎹㈡椂錛屽敜閱掑叾瀹冪敱浜嶹aitFor榪欎釜Event鑰屾寕璧風(fēng)殑綰跨▼錛岃繖灝辨槸瀹冧負(fù)浠涔堝彨Event鐨勫師
鍥犮傛墍璋撯滀簨浠垛濆氨鏄寚鈥滅姸鎬佺殑杞崲鈥濄傞氳繃Event鍙互鍦ㄧ嚎紼嬮棿浼犻掕繖縐嶁滅姸鎬佽漿鎹⑩濅俊鎭?/p>

褰撶劧鐢ㄤ竴涓彈淇濇姢錛堣涓嬮潰鐨勪復(fù)鐣屽尯浠嬬粛錛夌殑甯冨皵鍙橀噺涔熻兘瀹炵幇綾諱技鐨勫姛鑳斤紝鍙鐢ㄤ竴涓驚鐜鏌ユ甯冨皵鍊肩殑浠g爜鏉?br />浠f浛WaitFor鍗沖彲銆備粠鍔熻兘涓婅瀹屽叏娌℃湁闂錛屼絾瀹為檯浣跨敤涓氨浼氬彂鐜幫紝榪欐牱鐨勭瓑寰呬細鍗犵敤澶ч噺鐨凜PU璧勬簮錛岄檷浣庣郴緇?br />鎬ц兘錛屽獎鍝嶅埌鍒殑綰跨▼鐨勬墽琛岄熷害錛屾墍浠ユ槸涓嶇粡嫻庣殑錛屾湁鐨勬椂鍊欑敋鑷沖彲鑳戒細鏈夐棶棰樸傛墍浠ヤ笉寤鴻榪欐牱鐢ㄣ?/p>

涓寸晫鍖猴紙CriticalSection錛夊垯鏄竴欏瑰叡浜暟鎹闂繚鎶ょ殑鎶鏈傚畠鍏跺疄涔熸槸鐩稿綋浜庝竴涓叏灞鐨勫竷?yōu)當(dāng)鍙橀噺銆備絾瀵瑰畠鐨勬搷
浣滄湁鎵涓嶅悓錛屽畠鍙湁涓や釜鎿嶄綔錛欵nter鍜孡eave錛屽悓鏍峰彲浠ユ妸瀹冪殑涓や釜鐘舵佸綋浣淭rue鍜孎alse錛屽垎鍒〃紺虹幇鍦ㄦ槸鍚﹀浜庝復(fù)
鐣屽尯涓傝繖涓や釜鎿嶄綔涔熸槸鍘熻錛屾墍浠ュ畠鍙互鐢ㄤ簬鍦ㄥ綰跨▼搴旂敤涓繚鎶ゅ叡浜暟鎹紝闃叉璁塊棶鍐茬獊銆?/p>

鐢ㄤ復(fù)鐣屽尯淇濇姢鍏變韓鏁版嵁鐨勬柟娉曞緢綆鍗曪細鍦ㄦ瘡嬈¤璁塊棶鍏變韓鏁版嵁涔嬪墠璋冪敤Enter璁劇疆榪涘叆涓寸晫鍖烘爣蹇楋紝鐒跺悗鍐嶆搷浣滄暟鎹紝
鏈鍚庤皟鐢↙eave紱誨紑涓寸晫鍖恒傚畠鐨勪繚鎶ゅ師鐞嗘槸榪欐牱鐨勶細褰撲竴涓嚎紼嬭繘鍏ヤ復(fù)鐣屽尯鍚庯紝濡傛灉姝ゆ椂鍙︿竴涓嚎紼嬩篃瑕佽闂繖涓暟
鎹紝鍒欏畠浼氬湪璋冪敤Enter鏃訛紝鍙戠幇宸茬粡鏈夌嚎紼嬭繘鍏ヤ復(fù)鐣屽尯錛岀劧鍚庢綰跨▼灝變細琚寕璧鳳紝絳夊緟褰撳墠鍦ㄤ復(fù)鐣屽尯鐨勭嚎紼嬭皟鐢?br />Leave紱誨紑涓寸晫鍖猴紝褰撳彟涓涓嚎紼嬪畬鎴愭搷浣滐紝璋冪敤Leave紱誨紑鍚庯紝姝ょ嚎紼嬪氨浼氳鍞ら啋錛屽茍璁劇疆涓寸晫鍖烘爣蹇楋紝寮濮嬫搷浣滄暟
鎹紝榪欐牱灝遍槻姝簡璁塊棶鍐茬獊銆?/p>

浠ュ墠闈㈤偅涓狪nterlockedIncrement涓轟緥錛屾垜浠敤CriticalSection錛圵indows API錛夋潵瀹炵幇瀹冿細
Var
InterlockedCrit : TRTLCriticalSection;
Procedure InterlockedIncrement( var aValue : Integer );
Begin
聽聽聽 EnterCriticalSection( InterlockedCrit );
聽聽聽 Inc( aValue );
聽聽聽 LeaveCriticalSection( InterlockedCrit );
End;

鐜板湪鍐嶆潵鐪嬪墠闈㈤偅涓緥瀛愶細
1. 綰跨▼A榪涘叆涓寸晫鍖猴紙鍋囪鏁版嵁涓?錛?br />2. 綰跨▼B榪涘叆涓寸晫鍖猴紝鍥犱負(fù)A宸茬粡鍦ㄤ復(fù)鐣屽尯涓紝鎵浠琚寕璧?br />3. 綰跨▼A瀵規(guī)暟鎹姞涓錛堢幇鍦ㄦ槸4錛?br />4. 綰跨▼A紱誨紑涓寸晫鍖猴紝鍞ら啋綰跨▼B錛堢幇鍦ㄥ唴瀛樹腑鐨勬暟鎹槸4錛?br />5. 綰跨▼B琚敜閱掞紝瀵規(guī)暟鎹姞涓錛堢幇鍦ㄥ氨鏄?浜嗭級
6. 綰跨▼B紱誨紑涓寸晫鍖猴紝鐜板湪鐨勬暟鎹氨鏄紜殑浜嗐?/p>

涓寸晫鍖哄氨鏄繖鏍蜂繚鎶ゅ叡浜暟鎹殑璁塊棶銆?/p>

鍏充簬涓寸晫鍖虹殑浣跨敤錛屾湁涓鐐硅娉ㄦ剰錛氬嵆鏁版嵁璁塊棶鏃剁殑寮傚父鎯呭喌澶勭悊銆傚洜涓哄鏋滃湪鏁版嵁鎿嶄綔鏃跺彂鐢熷紓甯革紝灝嗗鑷碙eave鎿?br />浣滄病鏈夎鎵ц錛岀粨鏋滃皢浣挎湰搴旇鍞ら啋鐨勭嚎紼嬫湭琚敜閱掞紝鍙兘閫犳垚紼嬪簭鐨勬病鏈夊搷搴斻傛墍浠ヤ竴鑸潵璇達紝濡備笅闈㈣繖鏍蜂嬌鐢ㄤ復(fù)
鐣屽尯鎵嶆槸姝g‘鐨勫仛娉曪細

EnterCriticalSection
Try
// 鎿嶄綔涓寸晫鍖烘暟鎹?br />Finally
聽聽聽 LeaveCriticalSection
End;

鏈鍚庤璇存槑鐨勬槸錛孍vent鍜孋riticalSection閮芥槸鎿嶄綔緋葷粺璧勬簮錛屼嬌鐢ㄥ墠閮介渶瑕佸垱寤猴紝浣跨敤瀹屽悗涔熷悓鏍烽渶瑕侀噴鏀俱傚
TThread綾葷敤鍒扮殑涓涓叏灞Event錛歋yncEvent鍜屽叏灞CriticalSection錛歍headLock錛岄兘鏄湪
InitThreadSynchronization鍜孌oneThreadSynchronization涓繘琛屽垱寤哄拰閲婃斁鐨勶紝鑰屽畠浠垯鏄湪Classes鍗曞厓鐨?br />Initialization鍜孎inalization涓璋冪敤鐨勩?/p>

鐢變簬鍦═Thread涓兘鏄敤API鏉ユ搷浣淓vent鍜孋riticalSection鐨勶紝鎵浠ュ墠闈㈤兘鏄互API涓轟緥錛屽叾瀹濪elphi宸茬粡鎻愪緵浜嗗瀹?br />浠殑灝佽錛屽湪SyncObjs鍗曞厓涓紝鍒嗗埆鏄疶Event綾誨拰TCriticalSection綾匯傜敤娉曚篃涓庡墠闈㈢敤API鐨勬柟娉曠浉宸棤鍑犮傚洜涓?br />TEvent鐨勬瀯閫犲嚱鏁板弬鏁拌繃澶氾紝涓轟簡綆鍗曡搗瑙侊紝Delphi榪樻彁渚涗簡涓涓敤榛樿鍙傛暟鍒濆鍖栫殑Event綾伙細TSimpleEvent銆?/p>

欏轟究鍐嶄粙緇嶄竴涓嬪彟涓涓敤浜庣嚎紼嬪悓姝ョ殑綾伙細TMultiReadExclusiveWriteSynchronizer錛屽畠鏄湪SysUtils鍗曞厓涓畾涔夌殑
銆傛嵁鎴戞墍鐭ワ紝榪欐槸Delphi RTL涓畾涔夌殑鏈闀跨殑涓涓被鍚嶏紝榪樺ソ瀹冩湁涓涓煭鐨勫埆鍚嶏細TMREWSync銆傝嚦浜庡畠鐨勭敤澶勶紝鎴戞兂鍏?br />鐪嬪悕瀛楀氨鍙互鐭ラ亾浜嗭紝鎴戜篃灝變笉澶氳浜嗐?/p>

鏈変簡鍓嶉潰瀵笶vent鍜孋riticalSection鐨勫噯澶囩煡璇嗭紝鍙互姝e紡寮濮嬭璁篠ynchronize鍜學(xué)aitFor浜嗐?br />鎴戜滑鐭ラ亾錛孲ynchronize鏄氳繃灝嗛儴鍒嗕唬鐮佹斁鍒頒富綰跨▼涓墽琛屾潵瀹炵幇綰跨▼鍚屾鐨勶紝鍥犱負(fù)鍦ㄤ竴涓繘紼嬩腑錛屽彧鏈変竴涓富綰跨▼
銆傚厛鏉ョ湅鐪婼ynchronize鐨勫疄鐜幫細

procedure TThread.Synchronize(Method: TThreadMethod);
begin
聽聽聽 FSynchronize.FThread := Self;
聽聽聽 FSynchronize.FSynchronizeException := nil;
聽聽聽 FSynchronize.FMethod := Method;
聽聽聽 Synchronize(@FSynchronize);
end;

鍏朵腑FSynchronize鏄竴涓褰曠被鍨嬶細
PSynchronizeRecord = ^TSynchronizeRecord;
TSynchronizeRecord = record
聽聽聽 FThread: TObject;
聽聽聽 FMethod: TThreadMethod;
聽聽聽 FSynchronizeException: TObject;
end;

鐢ㄤ簬榪涜綰跨▼鍜屼富綰跨▼涔嬮棿榪涜鏁版嵁浜ゆ崲錛屽寘鎷紶鍏ョ嚎紼嬬被瀵硅薄錛屽悓姝ユ柟娉曞強鍙戠敓鐨勫紓甯搞?br />鍦⊿ynchronize涓皟鐢ㄤ簡瀹冪殑涓涓噸杞界増鏈紝鑰屼笖榪欎釜閲嶈澆鐗堟湰姣旇緝鐗瑰埆錛屽畠鏄竴涓滅被鏂規(guī)硶鈥濄傛墍璋撶被鏂規(guī)硶錛屾槸涓縐?br />鐗規(guī)畩鐨勭被鎴愬憳鏂規(guī)硶錛屽畠鐨勮皟鐢ㄥ茍涓嶉渶瑕佸垱寤虹被瀹炰緥錛岃屾槸鍍忔瀯閫犲嚱鏁伴偅鏍鳳紝閫氳繃綾誨悕璋冪敤銆備箣鎵浠ヤ細鐢ㄧ被鏂規(guī)硶鏉ュ疄鐜?br />瀹冿紝鏄洜涓轟負(fù)浜嗗彲浠ュ湪綰跨▼瀵硅薄娌℃湁鍒涘緩鏃朵篃鑳借皟鐢ㄥ畠銆備笉榪囧疄闄呬腑鏄敤瀹冪殑鍙︿竴涓噸杞界増鏈紙涔熸槸綾繪柟娉曪級鍜屽彟涓
涓被鏂規(guī)硶StaticSynchronize銆備笅闈㈡槸榪欎釜Synchronize鐨勪唬鐮侊細

class procedure TThread.Synchronize(ASyncRec: PSynchronizeRecord);
var
聽聽聽 SyncProc: TSyncProc;
begin
聽聽聽 if GetCurrentThreadID = MainThreadID then
聽聽聽聽聽聽聽 ASyncRec.FMethod
聽聽聽 else begin
聽聽聽 SyncProc.Signal := CreateEvent(nil, True, False, nil);
聽聽聽 try
聽聽聽 EnterCriticalSection(ThreadLock);
聽聽聽 try
聽聽聽 if SyncList = nil then
聽聽聽聽聽聽聽 SyncList := TList.Create;
聽聽聽聽聽聽聽 SyncProc.SyncRec := ASyncRec;
聽聽聽聽聽聽聽 SyncList.Add(@SyncProc);
聽聽聽聽聽聽聽 SignalSyncEvent;
聽聽聽聽聽聽聽 if Assigned(WakeMainThread) then
聽聽聽聽聽聽聽聽聽聽聽 WakeMainThread(SyncProc.SyncRec.FThread);
聽聽聽聽聽聽聽 LeaveCriticalSection(ThreadLock);
聽聽聽聽聽聽聽 try
聽聽聽聽聽聽聽聽聽聽聽 WaitForSingleObject(SyncProc.Signal, INFINITE);
聽聽聽聽聽聽聽 finally
聽聽聽聽聽聽聽聽聽聽聽 EnterCriticalSection(ThreadLock);
聽聽聽聽聽聽聽 end;
聽聽聽聽聽聽聽 finally
聽聽聽聽聽聽聽聽聽聽聽 LeaveCriticalSection(ThreadLock);
聽聽聽聽聽聽聽 end;
聽聽聽聽聽聽聽 finally
聽聽聽聽聽聽聽聽聽聽聽 CloseHandle(SyncProc.Signal);
聽聽聽聽聽聽聽 end;
聽聽聽聽聽聽聽 if Assigned(ASyncRec.FSynchronizeException) then
聽聽聽聽聽聽聽聽聽聽聽 raise ASyncRec.FSynchronizeException;
聽聽聽 end;
end;

榪欐浠g爜鐣ュ涓浜涳紝涓嶈繃涔熶笉綆楀お澶嶆潅銆?br />棣栧厛鏄垽鏂綋鍓嶇嚎紼嬫槸鍚︽槸涓葷嚎紼嬶紝濡傛灉鏄紝鍒欑畝鍗曞湴鎵ц鍚屾鏂規(guī)硶鍚庤繑鍥炪?br />濡傛灉涓嶆槸涓葷嚎紼嬶紝鍒欏噯澶囧紑濮嬪悓姝ヨ繃紼嬨?br />閫氳繃灞閮ㄥ彉閲廠yncProc璁板綍綰跨▼浜ゆ崲鏁版嵁錛堝弬鏁幫級鍜屼竴涓狤vent Handle錛屽叾璁板綍緇撴瀯濡備笅錛?br />TSyncProc = record
SyncRec: PSynchronizeRecord;
Signal: THandle;
end;

鐒跺悗鍒涘緩涓涓狤vent錛屾帴鐫榪涘叆涓寸晫鍖猴紙閫氳繃鍏ㄥ眬鍙橀噺ThreadLock榪涜錛屽洜涓哄悓鏃跺彧鑳芥湁涓涓嚎紼嬭繘鍏ynchronize鐘?br />鎬侊紝鎵浠ュ彲浠ョ敤鍏ㄥ眬鍙橀噺璁板綍錛夛紝鐒跺悗灝辨槸鎶婅繖涓褰曟暟鎹瓨鍏yncList榪欎釜鍒楄〃涓紙濡傛灉榪欎釜鍒楄〃涓嶅瓨鍦ㄧ殑璇濓紝鍒?br />鍒涘緩瀹冿級銆傚彲瑙乀hreadLock榪欎釜涓寸晫鍖哄氨鏄負(fù)浜嗕繚鎶ゅSyncList鐨勮闂紝榪欎竴鐐瑰湪鍚庨潰浠嬬粛CheckSynchronize鏃朵細鍐?br />嬈$湅鍒般?/p>

鍐嶆帴涓嬪氨鏄皟鐢⊿ignalSyncEvent錛屽叾浠g爜鍦ㄥ墠闈粙緇峊Thread鐨勬瀯閫犲嚱鏁版椂宸茬粡浠嬬粛榪囦簡錛屽畠鐨勫姛鑳藉氨鏄畝鍗曞湴灝?br />SyncEvent浣滀竴涓猄et鐨勬搷浣溿傚叧浜庤繖涓猄yncEvent鐨勭敤閫旓紝灝嗗湪鍚庨潰浠嬬粛WaitFor鏃跺啀璇﹁堪銆?/p>

鎺ヤ笅鏉ュ氨鏄渶涓昏鐨勯儴鍒嗕簡錛氳皟鐢╓akeMainThread浜嬩歡榪涜鍚屾鎿嶄綔銆俉akeMainThread鏄竴涓猅NotifyEvent綾誨瀷鐨勫叏
灞浜嬩歡銆傝繖閲屼箣鎵浠ヨ鐢ㄤ簨浠惰繘琛屽鐞嗭紝鏄洜涓篠ynchronize鏂規(guī)硶鏈川涓婃槸閫氳繃娑堟伅錛屽皢闇瑕佸悓姝ョ殑榪囩▼鏀懼埌涓葷嚎紼嬩腑
鎵ц錛屽鏋滃湪涓浜涙病鏈夋秷鎭驚鐜殑搴旂敤涓紙濡侰onsole鎴朌LL錛夋槸鏃犳硶浣跨敤鐨勶紝鎵浠ヨ浣跨敤榪欎釜浜嬩歡榪涜澶勭悊銆?br />鑰屽搷搴旇繖涓簨浠剁殑鏄疉pplication瀵硅薄錛屼笅闈袱涓柟娉曞垎鍒敤浜庤緗拰娓呯┖WakeMainThread浜嬩歡鐨勫搷搴旓紙鏉ヨ嚜Forms鍗曞厓錛夛細

procedure TApplication.HookSynchronizeWakeup;
begin
聽聽聽 Classes.WakeMainThread := WakeMainThread;
end;

procedure TApplication.UnhookSynchronizeWakeup;
begin
聽聽聽 Classes.WakeMainThread := nil;
end;

涓婇潰涓や釜鏂規(guī)硶鍒嗗埆鏄湪TApplication綾葷殑鏋勯犲嚱鏁板拰鏋愭瀯鍑芥暟涓璋冪敤銆?br />榪欏氨鏄湪Application瀵硅薄涓璚akeMainThread浜嬩歡鍝嶅簲鐨勪唬鐮侊紝娑堟伅灝辨槸鍦ㄨ繖閲岃鍙戝嚭鐨勶紝瀹冨埄鐢ㄤ簡涓涓┖娑堟伅鏉ュ疄鐜幫細

procedure TApplication.WakeMainThread(Sender: TObject);
begin
聽聽聽 PostMessage(Handle, WM_NULL, 0, 0);
end;

鑰岃繖涓秷鎭殑鍝嶅簲涔熸槸鍦ˋpplication瀵硅薄涓紝瑙佷笅闈㈢殑浠g爜錛堝垹闄ゆ棤鍏崇殑閮ㄥ垎錛夛細
procedure TApplication.WndProc(var Message: TMessage);
鈥?br />begin
聽聽聽 try
聽聽聽聽聽聽聽 鈥?br />聽聽聽聽聽聽聽 with Message do
聽聽聽聽聽聽聽 case Msg of
聽聽聽聽聽聽聽 鈥?br />聽聽聽聽聽聽聽 WM_NULL:
聽聽聽聽聽聽聽 CheckSynchronize;
聽聽聽聽聽聽聽 鈥?br />聽聽聽 except
聽聽聽聽聽聽聽 HandleException(Self);
聽聽聽 end;
end;

鍏朵腑鐨凜heckSynchronize涔熸槸瀹氫箟鍦–lasses鍗曞厓涓殑錛岀敱浜庡畠姣旇緝澶嶆潅錛屾殏鏃朵笉璇︾粏璇存槑錛屽彧瑕佺煡閬撳畠鏄叿浣撳鐞?br />Synchronize鍔熻兘鐨勯儴鍒嗗氨濂斤紝鐜板湪緇х畫鍒嗘瀽Synchronize鐨勪唬鐮併?br />鍦ㄦ墽琛屽畬W(xué)akeMainThread浜嬩歡鍚庯紝灝遍鍑轟復(fù)鐣屽尯錛岀劧鍚庤皟鐢╓aitForSingleObject寮濮嬬瓑寰呭湪榪涘叆涓寸晫鍖哄墠鍒涘緩鐨勯偅涓?br />Event銆傝繖涓狤vent鐨勫姛鑳芥槸絳夊緟榪欎釜鍚屾鏂規(guī)硶鐨勬墽琛岀粨鏉燂紝鍏充簬榪欑偣錛屽湪鍚庨潰鍒嗘瀽CheckSynchronize鏃朵細鍐嶈鏄庛?br />娉ㄦ剰鍦╓aitForSingleObject涔嬪悗鍙堥噸鏂拌繘鍏ヤ復(fù)鐣屽尯錛屼絾娌℃湁鍋氫換浣曚簨灝遍鍑轟簡錛屼技涔庢病鏈夋剰涔夛紝浣嗚繖鏄繀欏葷殑錛?br />鍥犱負(fù)涓寸晫鍖虹殑Enter鍜孡eave蹇呴』涓ユ牸鐨勪竴涓瀵瑰簲銆傞偅涔堟槸鍚﹀彲浠ユ敼鎴愯繖鏍峰憿錛?/p>

if Assigned(WakeMainThread) then
聽聽聽 WakeMainThread(SyncProc.SyncRec.FThread);
聽聽聽 WaitForSingleObject(SyncProc.Signal, INFINITE);
聽聽聽 finally
聽聽聽聽聽聽聽 LeaveCriticalSection(ThreadLock);
end;

涓婇潰鐨勪唬鐮佸拰鍘熸潵鐨勪唬鐮佹渶澶х殑鍖哄埆鍦ㄤ簬鎶奧aitForSingleObject涔熺撼鍏ヤ復(fù)鐣屽尯鐨勯檺鍒朵腑浜嗐傜湅涓婂幓娌′粈涔堝獎鍝嶏紝榪樹嬌
浠g爜澶уぇ綆鍖栦簡錛屼絾鐪熺殑鍙互鍚楋紵
浜嬪疄涓婃槸涓嶈錛?/p>

鍥犱負(fù)鎴戜滑鐭ラ亾錛屽湪Enter涓寸晫鍖哄悗錛屽鏋滃埆鐨勭嚎紼嬭鍐嶈繘鍏ワ紝鍒欎細琚寕璧楓傝學(xué)aitFor鏂規(guī)硶鍒欎細鎸傝搗褰撳墠綰跨▼錛岀洿鍒扮瓑
寰呭埆鐨勭嚎紼婼etEvent鍚庢墠浼氳鍞ら啋銆傚鏋滄敼鎴愪笂闈㈤偅鏍風(fēng)殑浠g爜鐨勮瘽錛屽鏋滈偅涓猄etEvent鐨勭嚎紼嬩篃闇瑕佽繘鍏ヤ復(fù)鐣屽尯鐨勮瘽
錛屾閿侊紙Deadlock錛夊氨鍙戠敓浜嗭紙鍏充簬姝婚攣鐨勭悊璁猴紝璇瘋嚜琛屽弬鑰冩搷浣滅郴緇熷師鐞嗘柟闈㈢殑璧勬枡錛夈?br />姝婚攣鏄嚎紼嬪悓姝ヤ腑鏈闇瑕佹敞鎰忕殑鏂歸潰涔嬩竴錛?br />鏈鍚庨噴鏀懼紑濮嬫椂鍒涘緩鐨凟vent錛屽鏋滆鍚屾鐨勬柟娉曡繑鍥炲紓甯哥殑璇濓紝榪樹細鍦ㄨ繖閲屽啀嬈℃姏鍑哄紓甯搞?/p>

鍥炲埌鍓嶉潰CheckSynchronize錛岃涓嬮潰鐨勪唬鐮侊細

function CheckSynchronize(Timeout: Integer = 0): Boolean;
var
聽聽聽聽 SyncProc: PSyncProc;
聽聽聽聽 LocalSyncList: TList;
begin
聽聽聽聽 if GetCurrentThreadID <> MainThreadID then
聽聽聽聽聽聽聽聽聽 raise EThread.CreateResFmt(@SCheckSynchronizeError, [GetCurrentThreadID]);
聽聽聽聽 if Timeout > 0 then
聽聽聽聽聽聽聽聽聽 WaitForSyncEvent(Timeout)
聽聽聽聽 else
聽聽聽聽聽聽聽聽聽 ResetSyncEvent;
聽聽聽聽 LocalSyncList := nil;
聽聽聽聽 EnterCriticalSection(ThreadLock);
聽聽聽聽 try
聽聽聽聽聽聽聽聽聽 Integer(LocalSyncList) := InterlockedExchange(Integer(SyncList), Integer(LocalSyncList));
聽聽聽聽聽聽聽聽聽 try
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 Result := (LocalSyncList <> nil) and (LocalSyncList.Count > 0);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 if Result then begin
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 while LocalSyncList.Count > 0 do begin
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 SyncProc := LocalSyncList[0];
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 LocalSyncList.Delete(0);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 LeaveCriticalSection(ThreadLock);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 try
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 try
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 SyncProc.SyncRec.FMethod;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 except
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 SyncProc.SyncRec.FSynchronizeException := AcquireExceptionObject;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 end;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 finally
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 EnterCriticalSection(ThreadLock);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 end;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 SetEvent(SyncProc.signal);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 end;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 end;
聽聽聽聽聽聽聽聽聽 finally
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 LocalSyncList.Free;
聽聽聽聽聽聽聽聽聽 end;
聽聽聽聽 finally
聽聽聽聽聽聽聽聽聽 LeaveCriticalSection(ThreadLock);
聽聽聽聽 end;
end;

棣栧厛錛岃繖涓柟娉曞繀欏誨湪涓葷嚎紼嬩腑琚皟鐢紙濡傚墠闈㈤氳繃娑堟伅浼犻掑埌涓葷嚎紼嬶級錛屽惁鍒欏氨鎶涘嚭寮傚父銆?br />鎺ヤ笅鏉ヨ皟鐢≧esetSyncEvent錛堝畠涓庡墠闈etSyncEvent瀵瑰簲鐨勶紝涔嬫墍浠ヤ笉鑰冭檻WaitForSyncEvent鐨勬儏鍐碉紝鏄洜涓哄彧鏈夊湪
Linux鐗堜笅鎵嶄細璋冪敤甯﹀弬鏁扮殑CheckSynchronize錛學(xué)indows鐗堜笅閮芥槸璋冪敤榛樿鍙傛暟0鐨凜heckSynchronize錛夈?br />鐜板湪鍙互鐪嬪嚭SyncList鐨勭敤閫斾簡錛氬畠鏄敤浜庤褰曟墍鏈夋湭琚墽琛岀殑鍚屾鏂規(guī)硶鐨勩傚洜涓轟富綰跨▼鍙湁涓涓紝鑰屽瓙綰跨▼鍙兘鏈?br />寰堝涓紝褰撳涓瓙綰跨▼鍚屾椂璋冪敤鍚屾鏂規(guī)硶鏃訛紝涓葷嚎紼嬪彲鑳戒竴鏃舵棤娉曞鐞嗭紝鎵浠ラ渶瑕佷竴涓垪琛ㄦ潵璁板綍瀹冧滑銆?br />鍦ㄨ繖閲岀敤涓涓眬閮ㄥ彉閲廘ocalSyncList鏉ヤ氦鎹yncList錛岃繖閲岀敤鐨勪篃鏄竴涓師璇細InterlockedExchange銆傚悓鏍鳳紝榪欓噷
涔熸槸鐢ㄤ復(fù)鐣屽尯灝嗗SyncList鐨勮闂繚鎶よ搗鏉ャ?br />鍙LocalSyncList涓嶄負(fù)絀猴紝鍒欓氳繃涓涓驚鐜潵渚濇澶勭悊绱Н鐨勬墍鏈夊悓姝ユ柟娉曡皟鐢ㄣ傛渶鍚庢妸澶勭悊瀹岀殑LocalSyncList閲?br />鏀炬帀錛岄鍑轟復(fù)鐣屽尯銆?/p>

鍐嶆潵鐪嬪鍚屾鏂規(guī)硶鐨勫鐞嗭細棣栧厛鏄粠鍒楄〃涓Щ鍑猴紙鍙栧嚭騫朵粠鍒楄〃涓垹闄わ級絎竴涓悓姝ユ柟娉曡皟鐢ㄦ暟鎹傜劧鍚庨鍑轟復(fù)鐣屽尯
錛堝師鍥犲綋鐒朵篃鏄負(fù)浜嗛槻姝㈡閿侊級銆?br />鎺ョ潃灝辨槸鐪熸鐨勮皟鐢ㄥ悓姝ユ柟娉曚簡銆?br />濡傛灉鍚屾鏂規(guī)硶涓嚭鐜板紓甯革紝灝嗚鎹曡幏鍚庡瓨鍏ュ悓姝ユ柟娉曟暟鎹褰曚腑銆?br />閲嶆柊榪涘叆涓寸晫鍖哄悗錛岃皟鐢⊿etEvent閫氱煡璋冪敤綰跨▼錛屽悓姝ユ柟娉曟墽琛屽畬鎴愪簡錛堣瑙佸墠闈ynchronize涓殑
WaitForSingleObject璋冪敤錛夈?br />鑷蟲錛屾暣涓猄ynchronize鐨勫疄鐜頒粙緇嶅畬鎴愩?/p>

鏈鍚庢潵璇翠竴涓媁aitFor錛屽畠鐨勫姛鑳藉氨鏄瓑寰呯嚎紼嬫墽琛岀粨鏉熴傚叾浠g爜濡備笅錛?br />function TThread.WaitFor: LongWord;
var
聽聽聽 H: array[0..1] of THandle;
聽聽聽 WaitResult: Cardinal;
聽聽聽 Msg: TMsg;
begin
聽聽聽 H[0] := FHandle;
聽聽聽 if GetCurrentThreadID = MainThreadID then聽 begin
聽聽聽聽聽聽聽 WaitResult := 0;
聽聽聽聽聽聽聽 H[1] := SyncEvent;
聽聽聽聽聽聽聽 repeat
聽聽聽聽聽聽聽聽聽聽聽 { This prevents a potential deadlock if the background thread does a SendMessage to the foreground thread }
聽聽聽聽聽聽聽聽聽聽聽 if WaitResult = WAIT_OBJECT_0 + 2 then
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE);
聽聽聽聽聽聽聽聽聽聽聽 WaitResult := MsgWaitForMultipleObjects(2, H, False, 1000, QS_SENDMESSAGE);
聽聽聽聽聽聽聽聽聽聽聽 CheckThreadError(WaitResult <> WAIT_FAILED);
聽聽聽聽聽聽聽聽聽聽聽 if WaitResult = WAIT_OBJECT_0 + 1 then
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 CheckSynchronize;
聽聽聽聽聽聽聽 until WaitResult = WAIT_OBJECT_0;
聽聽聽 end else
聽聽聽聽聽聽聽 WaitForSingleObject(H[0], INFINITE);
聽聽聽 CheckThreadError(GetExitCodeThread(H[0], Result));
end;

濡傛灉涓嶆槸鍦ㄤ富綰跨▼涓墽琛學(xué)aitFor鐨勮瘽錛屽緢綆鍗曪紝鍙璋冪敤WaitForSingleObject絳夊緟姝ょ嚎紼嬬殑Handle涓篠ignaled鐘舵?br />鍗沖彲銆?/p>

濡傛灉鏄湪涓葷嚎紼嬩腑鎵цW(xué)aitFor鍒欐瘮杈冮夯鐑︺傞鍏堣鍦℉andle鏁扮粍涓鍔犱竴涓猄yncEvent錛岀劧鍚庡驚鐜瓑寰咃紝鐩村埌綰跨▼緇?br />鏉燂紙鍗矼sgWaitForMultipleObjects榪斿洖WAIT_OBJECT_0錛岃瑙丮SDN涓叧浜庢API鐨勮鏄庯級銆?br />鍦ㄥ驚鐜瓑寰呬腑浣滃涓嬪鐞嗭細濡傛灉鏈夋秷鎭彂鐢燂紝鍒欓氳繃PeekMessage鍙栧嚭姝ゆ秷鎭紙浣嗗茍涓嶆妸瀹冧粠娑堟伅寰幆涓Щ闄わ級錛岀劧鍚?br />璋冪敤MsgWaitForMultipleObjects鏉ョ瓑寰呯嚎紼婬andle鎴朣yncEvent鍑虹幇Signaled鐘舵侊紝鍚屾椂鐩戝惉娑堟伅錛圦S_SENDMESSAGE
鍙傛暟錛岃瑙丮SDN涓叧浜庢API鐨勮鏄庯級銆傚彲浠ユ妸姝PI褰撲綔涓涓彲浠ュ悓鏃剁瓑寰呭涓狧andle鐨刉aitForSingleObject銆傚鏋?br />鏄疭yncEvent琚玈etEvent錛堣繑鍥濿AIT_OBJECT_0 + 1錛夛紝鍒欒皟鐢–heckSynchronize澶勭悊鍚屾鏂規(guī)硶銆?br />涓轟粈涔堝湪涓葷嚎紼嬩腑璋冪敤WaitFor蹇呴』鐢∕sgWaitForMultipleObjects錛岃屼笉鑳界敤WaitForSingleObject絳夊緟綰跨▼緇撴潫鍛紵
鍥犱負(fù)闃叉姝婚攣銆傜敱浜庡湪綰跨▼鍑芥暟Execute涓彲鑳借皟鐢⊿ynchronize澶勭悊鍚屾鏂規(guī)硶錛岃屽悓姝ユ柟娉曟槸鍦ㄤ富綰跨▼涓墽琛岀殑錛屽
鏋滅敤WaitForSingleObject絳夊緟鐨勮瘽錛屽垯涓葷嚎紼嬪湪榪欓噷琚寕璧鳳紝鍚屾鏂規(guī)硶鏃犳硶鎵ц錛屽鑷寸嚎紼嬩篃琚寕璧鳳紝浜庢槸鍙戠敓姝婚攣銆?br />鑰屾敼鐢╓aitForMultipleObjects鍒欐病鏈夎繖涓棶棰樸傞鍏堬紝瀹冪殑絎笁涓弬鏁頒負(fù)False錛岃〃紺哄彧瑕佺嚎紼婬andle鎴朣yncEvent
涓彧瑕佹湁涓涓猄ignaled鍗沖彲浣夸富綰跨▼琚敜閱掞紝鑷充簬鍔犱笂QS_SENDMESSAGE鏄洜涓篠ynchronize鏄氳繃娑堟伅浼犲埌涓葷嚎紼嬫潵鐨?br />錛屾墍浠ヨ繕瑕侀槻姝㈡秷鎭闃誨銆傝繖鏍鳳紝褰撶嚎紼嬩腑璋冪敤Synchronize鏃訛紝涓葷嚎紼嬪氨浼氳鍞ら啋騫跺鐞嗗悓姝ヨ皟鐢紝鍦ㄨ皟鐢ㄥ畬鎴愬悗
緇х畫榪涘叆鎸傝搗絳夊緟鐘舵侊紝鐩村埌綰跨▼緇撴潫銆?br />鑷蟲錛屽綰跨▼綾籘Thread鐨勫垎鏋愬彲浠ュ憡涓涓钀戒簡錛屽鍓嶉潰鐨勫垎鏋愪綔涓涓葷粨錛?br />1銆?綰跨▼綾葷殑綰跨▼蹇呴』鎸夋甯哥殑鏂瑰紡緇撴潫錛屽嵆Execute鎵ц緇撴潫錛屾墍浠ュ湪鍏朵腑鐨勪唬鐮佷腑蹇呴』鍦ㄩ傚綋鐨勫湴鏂瑰姞鍏ヨ凍澶熷
聽聽聽 鐨勫Terminated鏍囧織鐨勫垽鏂紝騫跺強鏃墮鍑恒傚鏋滃繀欏昏鈥滅珛鍗斥濋鍑猴紝鍒欎笉鑳戒嬌鐢ㄧ嚎紼嬬被錛岃岃鏀圭敤API鎴朢TL鍑芥暟銆?br />2銆?瀵瑰彲瑙哣CL鐨勮闂鏀懼湪Synchronize涓紝閫氳繃娑堟伅浼犻掑埌涓葷嚎紼嬩腑錛岀敱涓葷嚎紼嬪鐞嗐?br />3銆?綰跨▼鍏變韓鏁版嵁鐨勮闂簲璇ョ敤涓寸晫鍖鴻繘琛屼繚鎶わ紙褰撶劧鐢⊿ynchronize涔熻錛夈?br />4銆?綰跨▼閫氫俊鍙互閲囩敤Event榪涜錛堝綋鐒朵篃鍙互鐢⊿uspend/Resume錛夈?br />5銆?褰撳湪澶氱嚎紼嬪簲鐢ㄤ腑浣跨敤澶氱綰跨▼鍚屾鏂瑰紡鏃訛紝涓瀹氳灝忓績闃叉鍑虹幇姝婚攣銆?br />6銆?絳夊緟綰跨▼緇撴潫瑕佺敤WaitFor鏂規(guī)硶銆?/p>



]]>
鍏充簬Utf8緙栫爜鐨勫嚑涓嚱鏁?/title><link>http://www.shnenglu.com/Khan/archive/2006/01/19/2903.html</link><dc:creator>Khan's Notebook</dc:creator><author>Khan's Notebook</author><pubDate>Thu, 19 Jan 2006 07:06:00 GMT</pubDate><guid>http://www.shnenglu.com/Khan/archive/2006/01/19/2903.html</guid><wfw:comment>http://www.shnenglu.com/Khan/comments/2903.html</wfw:comment><comments>http://www.shnenglu.com/Khan/archive/2006/01/19/2903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Khan/comments/commentRss/2903.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Khan/services/trackbacks/2903.html</trackback:ping><description><![CDATA[<p><font face="Courier New">鏈榪戜竴孌墊椂闂磋佸紕Utf8緙栫爜,宸ヤ綔鏃跺啓浜嗗嚑涓嚱鏁?緇欏ぇ瀹舵寚姝d竴涓?br><br></font></p><pre>//////////////////////////////////////////////<br>//---------鍙栧緱utf8瀛楃鐨勯暱搴?--------------//<br>//<font color="#008080">Str</font>:<font color="#2e8b57"><b>String</b></font> 婧愬瓧絎︿覆<br>//<font color="#804040"><b>Result</b></font>:<font color="#2e8b57"><b>Integer</b></font> utf8瀛楃涓查暱搴?br>class <font color="#804040"><b>function</b></font> TPduPush.getUTF8Len(<font color="#008080">Str</font>: <font color="#2e8b57"><b>string</b></font>): <font color="#2e8b57"><b>Integer</b></font>;<br><font color="#804040"><b>var</b></font><br> i: <font color="#2e8b57"><b>integer</b></font>;<br> tmpChar: <font color="#2e8b57"><b>Pchar</b></font>;<br><font color="#804040"><b>begin</b></font><br> tmpChar := <font color="#2e8b57"><b>pchar</b></font>(<font color="#008080">str</font>);<br> i := <font color="#ff00ff">0</font>;<br> <font color="#804040"><b>result</b></font> := <font color="#ff00ff">0</font>;<br> <font color="#804040"><b>while</b></font> i < <font color="#008080">length</font>(tmpChar) <font color="#804040"><b>do</b></font> <font color="#804040"><b>begin</b></font><br> <font color="#804040"><b>if</b></font> <font color="#008080">ord</font>(tmpChar[i]) < $80 <font color="#804040"><b>then</b></font> <font color="#804040"><b>begin</b></font><br> i := i + <font color="#ff00ff">1</font>;<br> <font color="#804040"><b>result</b></font> := <font color="#804040"><b>result</b></font> + <font color="#ff00ff">1</font>;<br> <font color="#804040"><b>end</b></font> <font color="#804040"><b>else</b></font> <font color="#804040"><b>begin</b></font><br> i := i + <font color="#ff00ff">2</font>;<br> <font color="#804040"><b>result</b></font> := <font color="#804040"><b>result</b></font> + <font color="#ff00ff">3</font>;<br> <font color="#804040"><b>end</b></font>;<br> <font color="#804040"><b>end</b></font>;<br><font color="#804040"><b>end</b></font>;<br><br>////////////////////////////////////////////////<br>//----------鍙栧緱瀛楃涓蹭腑鐨勫瓧絎︿釜鏁?-----------//<br>//<font color="#008080">str</font>:<font color="#2e8b57"><b>String</b></font> 婧愬瓧絎︿覆<br>//<font color="#804040"><b>Result</b></font>:<font color="#2e8b57"><b>Integer</b></font> 瀛楃涓暟,鍏煎涓枃鍙屽瓧鑺?br>class <font color="#804040"><b>function</b></font> TPduPush.getAnsiLen(<font color="#008080">Str</font>: <font color="#2e8b57"><b>string</b></font>): <font color="#2e8b57"><b>integer</b></font>;<br><font color="#804040"><b>var</b></font><br> i: <font color="#2e8b57"><b>integer</b></font>;<br> tmpChar: <font color="#2e8b57"><b>Pchar</b></font>;<br><font color="#804040"><b>begin</b></font><br> tmpChar := <font color="#2e8b57"><b>pchar</b></font>(<font color="#008080">str</font>);<br> i := <font color="#ff00ff">0</font>;<br> <font color="#804040"><b>result</b></font> := <font color="#ff00ff">0</font>;<br> <font color="#804040"><b>while</b></font> i < <font color="#008080">length</font>(tmpChar) <font color="#804040"><b>do</b></font> <font color="#804040"><b>begin</b></font><br> <font color="#804040"><b>if</b></font> <font color="#008080">ord</font>(tmpChar[i]) < $80 <font color="#804040"><b>then</b></font><br> i := i + <font color="#ff00ff">1</font><br> <font color="#804040"><b>else</b></font><br> i := i + <font color="#ff00ff">2</font>;<br> <font color="#804040"><b>result</b></font> := <font color="#804040"><b>result</b></font> + <font color="#ff00ff">1</font>;<br> <font color="#804040"><b>end</b></font>;<br><font color="#804040"><b>end</b></font>;<br><br><br>/////////////////////////////////////////////////<br>//---------鎴彇鎸囧畾闀垮害鐨剈tf8瀛楃涓?-----------//<br>//<font color="#008080">str</font>:<font color="#2e8b57"><b>string</b></font> 婧愬瓧絎︿覆<br>//count:<font color="#2e8b57"><b>Integer</b></font> 鎸囧畾闀垮害 涓涓眽瀛楀崰涓変釜瀛楄妭,闀垮害鍙兘灝?涓嶈兘澶?br>//<font color="#804040"><b>Result</b></font>:<font color="#2e8b57"><b>string</b></font> 鎴彇鍚庣殑utf8瀛楃涓?br>class <font color="#804040"><b>function</b></font> TPduPush.getUTF8String(<font color="#008080">Str</font>: <font color="#2e8b57"><b>string</b></font>; count: <font color="#2e8b57"><b>Integer</b></font>): <font color="#2e8b57"><b>string</b></font>;<br><font color="#804040"><b>var</b></font><br> i, j: <font color="#2e8b57"><b>integer</b></font>;<br> tmpChar: <font color="#2e8b57"><b>Pchar</b></font>;<br><font color="#804040"><b>begin</b></font><br> tmpChar := <font color="#2e8b57"><b>pchar</b></font>(<font color="#008080">str</font>);<br> i := <font color="#ff00ff">0</font>;<br> j := <font color="#ff00ff">0</font>;<br> <font color="#804040"><b>result</b></font> := <font color="#ff00ff">''</font>;<br><br> <font color="#804040"><b>while</b></font> i < <font color="#008080">length</font>(tmpChar) <font color="#804040"><b>do</b></font> <font color="#804040"><b>begin</b></font><br> <font color="#804040"><b>if</b></font> j >= count <font color="#804040"><b>then</b></font> <font color="#008080">break</font>; //鑻辨枃杞爜鍚庝笉鑳借秴榪囨寚瀹氱殑浣嶆暟<br> <font color="#804040"><b>if</b></font> <font color="#008080">ord</font>(tmpChar[i]) < $80 <font color="#804040"><b>then</b></font> <font color="#804040"><b>begin</b></font><br> <font color="#804040"><b>result</b></font> := <font color="#804040"><b>result</b></font> + <font color="#2e8b57"><b>string</b></font>(tmpChar[i]);<br> i := i + <font color="#ff00ff">1</font>;<br> j := j + <font color="#ff00ff">1</font>;<br> <font color="#804040"><b>end</b></font> <font color="#804040"><b>else</b></font> <font color="#804040"><b>begin</b></font><br> <font color="#804040"><b>if</b></font> j + <font color="#ff00ff">2</font> >= count <font color="#804040"><b>then</b></font> <font color="#008080">break</font>; //姹夊瓧杞爜鍚庝笉鑳借秴榪囨寚瀹氱殑浣嶆暟<br> <font color="#804040"><b>result</b></font> := <font color="#804040"><b>result</b></font> + <font color="#2e8b57"><b>string</b></font>(tmpChar[i]) + <font color="#2e8b57"><b>string</b></font>(tmpChar[i + <font color="#ff00ff">1</font>]);<br> i := i + <font color="#ff00ff">2</font>;<br> j := j + <font color="#ff00ff">3</font>;<br> <font color="#804040"><b>end</b></font>;<br> <font color="#804040"><b>end</b></font>;<br><font color="#804040"><b>end</b></font>;</pre><font face="Courier New"></font><img src ="http://www.shnenglu.com/Khan/aggbug/2903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Khan/" target="_blank">Khan's Notebook</a> 2006-01-19 15:06 <a href="http://www.shnenglu.com/Khan/archive/2006/01/19/2903.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>[瀵煎叆]浠婂ぉ鍦ㄨ繖涓猙log涓婃壘鍒頒簡ota bookmark鐨勬枃妗?鎵撶畻鍦ㄦ垜鐨勭▼搴忛噷闈㈠姞涓婂彂閫乷ta bookmark鐨勫姛鑳?/title><link>http://www.shnenglu.com/Khan/archive/2006/01/12/2626.html</link><dc:creator>Khan's Notebook</dc:creator><author>Khan's Notebook</author><pubDate>Thu, 12 Jan 2006 01:56:00 GMT</pubDate><guid>http://www.shnenglu.com/Khan/archive/2006/01/12/2626.html</guid><wfw:comment>http://www.shnenglu.com/Khan/comments/2626.html</wfw:comment><comments>http://www.shnenglu.com/Khan/archive/2006/01/12/2626.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Khan/comments/commentRss/2626.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Khan/services/trackbacks/2626.html</trackback:ping><description><![CDATA[<p align="justify">棣栧厛闇瑕佸啓涓涓猙ookmark鐨剎ml鏂囦歡錛岃繖涓牸寮忓彲浠ュ幓nokia緗戠珯涓嬭澆銆備笅闈㈡槸涓涓緥瀛愶細<br><?xml version="1.0"?> <br><!DOCTYPE CHARACTERISTIC-LIST PUBLIC "" "characteristic_list.dtd"> <br><CHARACTERISTIC-LIST><br>     <CHARACTERISTIC TYPE="BOOKMARK"><br>          <PARM NAME="NAME" VALUE="bookmark name"/><br>          <PARM NAME="URL" VALUE="<a /</a>><br>     </CHARACTERISTIC><br></CHARACTERISTIC-LIST></p> <p align="justify"><br>灝介噺璁﹏ame鍜寀rl鐭偣錛岃繖鏍風(fēng)紪鐮佸悗鍙互鏀懼埌涓鏉$煭娑堟伅閲岄潰錛岃屼笉闇瑕佹妸涓涓緗媶鍒嗘垚澶氫釜鐭秷鎭綋銆傚ぇ鑷寸殑涓涓皝瑁呮槸鎶妜ml鏂囦歡杞垚wbxml錛岀劧鍚庡啀鍦ㄥ闈㈠皝瑁匴SP灞傦紝鏈澶栭潰鏄疻DP灞傘?/p> <p align="justify">WDP鐨勪竴鑸牸寮忔槸鈥?B0504C34FC002000304xxyy鈥濓紝鍏朵腑xx灝辨槸鏁翠釜鏁版嵁鍖呯殑鎬葷墖鏂暟鐩紝鑰寉y琛ㄧず褰撳墠鐗囨柇鏄鍑犱釜鐗囨柇銆備婦涓緥瀛愶紝涓涓畝鍗曠殑bookmark鍏ㄩ儴鏀懼湪涓涓猻ms涓繖鏍穢x錛?1錛寉y錛?1銆?br>涓嬮潰鏄瘡涓猙yte鐨勬剰鎬?</p> <p align="justify"># 0B | User-Data-Header (UDHL) Length = 11 bytes<br># 05 | UDH IE identifier: Port numbers                        <br># 04 | UDH port number IE length                             <br># C3 | Destination port (high)                                      <br># 4F | Destination port (low)                                     <br># C0 | Originating port (high)                 <br># 02 | Originating port (low)                   <br># 00 | UDH IE identifier: SAR                 <br># 03 | UDH SAR IE length                      <br># 04 | Datagram ref no.                        <br>#<br># Two variable bytes, intentionally missing from WDP header, user must<br># calculate and add at send time.<br>#<br># xx | Total number of segments in datagram    <br># yy | Segment count                            </p> <p align="justify">bookmark鐨刉SP灞傜殑鏍煎紡涓鑸槸"01062D1F2A6170706C69636174696F6E2F782D7761702D70726F762E62726F777365722D626F6F6B6D61726B730081EA"<br>姣忎釜byte鐨勫叿浣撴剰鎬濇槸錛?/p> <p align="justify"># 01 | Transaction ID /                         <br># 06 | PDU type (push)                          <br># xx | Header length (content type headers)      <br># 1F | Value length quote length greater than 30<br># 2A | Value length (value name not used)        <br># xx | Mimetype encoded, variable bytes          | application/x-wap-prov.browser-{bookmarks | settings}<br># 00 | Null termination of content type string   |<br># 81 | Charset                                   | Well known PARM. (short integer)<br># EA | UTF-8 (using short integer)              <br>鏈閲屽眰灝辨槸WBXML浜嗭紝棣栧厛蹇呴』鏈変釜xml鐨勫ご"01016A00"</p> <p align="justify"># 01 | Version                                   | WBXML 1.1<br># 01 | Unknown public identifier         |<br># 6A | Charset                                   | UTF-8<br># 00 | String table length                      |</p> 鑷充簬鍏朵粬鐨勫叿浣撶紪鐮佸彲浠ュ幓<a >http://www.forum.nokia.com</a>鏌ョ湅OTA_settings_general_7_0.pdf榪欎釜鏂囨。錛岄噷闈㈠緢璇︾粏鐨勬弿榪頒簡姣忎竴涓猉ML鍏冪礌瀵瑰簲鐨勫崄鍏繘鍒躲傛渶鍚庢敞鎰忎竴鐐癸紝鍙戦佺殑鏃跺欒鎸?bit鏍煎紡鐨勫彂閫侊紝鑰屼笉鏄?bit鏍煎紡銆?br><br><p> <a target="_new" >http://www.cnblogs.com/zhengyun_ustc/archive/2005/09/05/otawapbookmark.html</a> <br> <br>[SMS&WAP]瀹炰緥璁茶В鍒朵綔OTA鐭俊鏉ヨ嚜鍔ㄩ厤緗墜鏈篧AP涔︾[闄勬簮鐮乚 <br>鎽樿:OTA錛屽嵆Over The Air錛屽浗鍐呯炕璇戜負(fù)絀轟腑涓嬭澆銆? <br>OTA鏍囧噯鐢辯埍绔嬩俊鍜岃鍩轟簹鍏卞悓鍒惰銆侽TA娑電洊浜嗚澶氳寖鍥達紝姣斿Kjava涓殑搴旂敤紼嬪簭涓嬭澆涔熸槸閫氳繃OTA銆傛垜浠繖綃囨枃绔犱富瑕佽鐨勬槸錛岄氳繃鐭俊鏂瑰紡絀轟腑涓嬭澆閰嶇疆淇℃伅錛屽弬鑰冪殑鏂囨。鏄疧TA_settings_general_7_0.pdf銆? <br>瑙勮寖涓畾涔変簡涓夌Setting錛? <br>? 嫻忚鍣ㄨ緗? <br>? 嫻忚鍣ㄧ殑涔︾璁劇疆 <br>? SyncML璁劇疆 <br>涔熷氨鏄錛屼綘閫氳繃鍙戦佺煭淇″彲浠ュ府鍔╃敤鎴鋒墜鏈洪厤緗繖涓夌璁劇疆銆? <br> <br>鍘熷垯涓婏紝浣犲彧瑕佺湅浜哋TA_settings_general_7_0.pdf錛屽茍鍙傜収OTA_service_settings_example_v11.pdf錛屽氨鍙互杞繪澗鍦板埗浣滃嚭絎﹀悎瑙勮寖鐨凮TA鐭俊銆? <br>浣嗘槸錛屾湰鏂囨。鐨勭洰鐨勫氨鏄浣犵畝鍗曠矖鏆村湴鐩村涓婚錛岀湅瀹岃繖綃囨枃妗e悗錛屽氨浜嗚В浜哋TA鐭俊鐨勬蹇碉紝閫氳繃浠ヤ笅浠g爜錛? <br>OTAMessage <br>OTAMessage message = new OTAMessage(); <br>txtOTAResult.Text = message.Get </p><br><a ></a><img src ="http://www.shnenglu.com/Khan/aggbug/2626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Khan/" target="_blank">Khan's Notebook</a> 2006-01-12 09:56 <a href="http://www.shnenglu.com/Khan/archive/2006/01/12/2626.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>[瀵煎叆]鍦ㄥ伓鏈哄櫒涓婃壘鍒頒竴涓cpu涓插彿鐨勪唬鐮?delphi鐨?璁板綍涓涓?鐢蟲槑鏄漢瀹剁殑浠g爜)http://www.shnenglu.com/Khan/archive/2006/01/12/2627.htmlKhan's NotebookKhan's NotebookThu, 12 Jan 2006 01:56:00 GMThttp://www.shnenglu.com/Khan/archive/2006/01/12/2627.htmlhttp://www.shnenglu.com/Khan/comments/2627.htmlhttp://www.shnenglu.com/Khan/archive/2006/01/12/2627.html#Feedback0http://www.shnenglu.com/Khan/comments/commentRss/2627.htmlhttp://www.shnenglu.com/Khan/services/trackbacks/2627.html
interface

uses
  SysUtils;

type
  TCPUID = array[1..4] of Longint;
  TVendor = array[0..11] of char;

function GetCPUID: TCPUID; assembler; register;
function GetCPUVendor: TVendor; assembler; register;
function GetCPUInfo: string;

implementation


function GetCPUID: TCPUID; assembler; register;
asm
 PUSH    EBX         {Save affected register}
 PUSH    EDI
 MOV     EDI,EAX      {@Resukt}
 MOV     EAX,1
 DW      $A20F        {CPUID Command}
 STOSD                {CPUID[1]}
 MOV     EAX,EBX
 STOSD                {CPUID[2]}
 MOV     EAX,ECX
 STOSD                {CPUID[3]}
 MOV     EAX,EDX
 STOSD                {CPUID[4]}
 POP     EDI          {Restore registers}
 POP     EBX
end;

function GetCPUVendor: TVendor; assembler; register;
asm
 PUSH    EBX          {Save affected register}
 PUSH    EDI
 MOV     EDI,EAX      {@Result (TVendor)}
 MOV     EAX,0
 DW      $A20F        {CPUID Command}
 MOV     EAX,EBX
 XCHG    EBX,ECX      {save ECX result}
 MOV     ECX,4
@1:
 STOSB
 SHR     EAX,8
 LOOP    @1
 MOV     EAX,EDX
 MOV     ECX,4
@2:
 STOSB
 SHR     EAX,8
 LOOP    @2
 MOV     EAX,EBX
 MOV     ECX,4
@3:
 STOSB
 SHR     EAX,8
 LOOP    @3
 POP     EDI          {Restore registers}
 POP     EBX
end;

function GetCPUInfo: string;
var
  CPUID: TCPUID;
  I: Integer;
  S: TVendor;
begin
  for I := Low(CPUID) to High(CPUID) do
    CPUID[I] := -1;

  CPUID := GetCPUID;

  S := GetCPUVendor;

  Result := S + IntToHex(CPUID[1], 8) + IntToHex(CPUID[2], 8)
    + IntToHex(CPUID[3], 8)
    + IntToHex(CPUID[4], 8);
end;


end.


浠ュ墠涓笓d鏃跺欑湅ibm 8086/8088姹囩紪鏈夎嚜宸卞啓榪囪繖浜涗唬鐮乨,浣嗘槸鐜板湪榪囦簡榪欎箞澶氬勾,閫鍖栧埌鐪嬩笉鎳傝繖浜涗簡

]]>
[瀵煎叆]緇堜簬鎼炲畾浜嗗紓姝ラ氫俊浜?璋冭瘯浜嗕袱澶?鍙戠幇鍋惰繕绱犵姱浜嗕竴涓急鏅洪敊璇?/title><link>http://www.shnenglu.com/Khan/archive/2006/01/12/2632.html</link><dc:creator>Khan's Notebook</dc:creator><author>Khan's Notebook</author><pubDate>Thu, 12 Jan 2006 01:56:00 GMT</pubDate><guid>http://www.shnenglu.com/Khan/archive/2006/01/12/2632.html</guid><wfw:comment>http://www.shnenglu.com/Khan/comments/2632.html</wfw:comment><comments>http://www.shnenglu.com/Khan/archive/2006/01/12/2632.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Khan/comments/commentRss/2632.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Khan/services/trackbacks/2632.html</trackback:ping><description><![CDATA[<p>鎴戞妸client鐨剆ocket鍒濆鍖栧唴瀹瑰啓鍦ㄤ簡message鍝嶅簲鍑芥暟閲岄潰浜?姣忔瑙﹀彂娑堟伅鐨勬椂鍊欏氨鎶婂鎴風(fēng)鐨剆ocket緗?浜?/p> <p> </p> <p>鏈嶅姟鍣ㄧ浠g爜濡備笅:</p> <p>鐢變簬姣旇緝綆鍗?鎵浠ヤ笉璐存敞閲婁簡,濡傛灉鏈変粈涔堜笉鎳俤鍦版柟,澶у瀵圭潃<windows緗戠粶緙栫▼>緲誨惂</windows緗戠粶緙栫▼></p> <p> </p> <p>unit Listener;</p> <p>interface</p> <p>uses<br>  SysUtils,  Controls, Forms, winsock, Classes, ComCtrls, StdCtrls;</p> <p><br>const ASYNC_EVENT = $0400 + 1;<br>  SO_CONDITIONAL_ACCEPT = $3002;<br>type</p> <p>  TCMSocketMessage = record //select 娑堟伅緇撴瀯<br>    Msg: Cardinal; //緋葷粺娑堟伅<br>    Socket: TSocket; //浜х敓娑堟伅鐨勬簮socket 鍙ユ焺<br>    SelectEvent: Word; //select娑堟伅<br>    SelectError: Word; //閿欒<br>    Result: Longint;<br>  end;</p> <p> </p> <p>type<br>  TMain = class(TForm)<br>    SBar: TStatusBar;<br>    Memo1: TMemo;<br>    procedure FormDestroy(Sender: TObject);<br>    procedure FormCreate(Sender: TObject);<br>  private<br>    s: TSocket;<br>    SClinent: TSocket;<br>    procedure bindAddr;<br>    procedure CMIncCount(var Msg: TCMSocketMessage); message ASYNC_EVENT;<br>    procedure listenAddr;<br>    { Private declarations }<br>  public<br>    { Public declarations }<br>  end;</p> <p>var<br>  Main: TMain;</p> <p>implementation</p> <p>{$R *.dfm}</p> <p>procedure TMain.FormDestroy(Sender: TObject);<br>begin<br>  closeSocket(s);<br>  WSACleanup();<br>end;</p> <p>procedure TMain.FormCreate(Sender: TObject);<br>var<br>  wsa: TWSaData;<br>  flag: integer;<br>begin<br>  SClinent := 0;<br>  //SysUtils.BoolToStr()<br>  flag := WSAStartup($0202, wsa); //鍔犺澆winsock<br>  if flag <> 0 then begin<br>    SBar.Panels[2].Text := format('閿欒鍙?%d', [WSAGetLastError()]);<br>    SBar.Panels[1].Text := 'Winsock搴撳姞杞藉け璐?;<br>  end;</p> <p>  bindAddr;<br>  listenAddr;<br>end;</p> <p><br>procedure TMain.bindAddr;<br>var<br>  addr: TSockAddrIn;<br>  flag: integer;<br>begin<br>  s := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //鏈嶅姟鍣ㄧ鐨剆ocket<br>  addr.sin_port := htons(45531);<br>  addr.sin_family := AF_INET;<br>  addr.sin_addr.S_addr := INADDR_ANY; //inet_addr(pchar(host));</p> <p>  flag := bind(s, addr, sizeof(addr));<br>  if flag = SOCKET_ERROR then begin<br>    SBar.Panels[2].Text := format('閿欒鍙?%d', [WSAGetLastError()]);<br>    SBar.Panels[1].Text := 'IP緇戝畾閿欒';<br>  end else begin<br>    flag := WSAAsyncSelect(s, Handle, ASYNC_EVENT, FD_ACCEPT or FD_CONNECT or FD_CLOSE or FD_READ or FD_WRITE);<br>    if flag = SOCKET_ERROR then begin<br>      SBar.Panels[2].Text := format('閿欒鍙?%d', [WSAGetLastError()]);<br>      SBar.Panels[1].Text := 'WSAAsyncSelect閿欒';<br>    end;<br>  end;<br>end;</p> <p>procedure TMain.listenAddr;<br>var flag: integer;<br>begin<br>  flag := listen(s, 10);<br>  if flag = SOCKET_ERROR then begin<br>    SBar.Panels[2].Text := format('閿欒鍙?%d', [WSAGetLastError()]);<br>    SBar.Panels[1].Text := '鐩戝惉澶辮觸';<br>  end;<br>end;</p> <p> </p> <p>procedure TMain.CMIncCount(var Msg: TCMSocketMessage);<br>var<br>  addr: TSockAddrIn;<br>  len: integer;<br>  SendBuf: array[1..1024] of AnsiChar;<br>  recvBuf: array[1..1024] of AnsiChar;<br>  str: string;<br>  OldOpenType {, NewOpenType}: integer;<br>begin<br>  len := 0;</p> <p>  str := '';</p> <p>  case Msg.SelectEvent of<br>    FD_READ: begin<br>        len := sizeof(recvBuf);<br>        ioctlsocket(SClinent, FIONREAD, Longint(len));<br>        fillchar(recvBuf, sizeof(recvBuf), 0);<br>        recv(SClinent, recvBuf, sizeof(recvBuf), 0);</p> <p>        Memo1.Lines.Add(string(recvBuf));<br>        Memo1.Lines.Add('read');<br>        if Memo1.Lines.Count > 10 then<br>          memo1.Clear;</p> <p>        sleep(10);<br>        fillchar(SendBuf, sizeof(SendBuf), 0);<br>        Strcopy(@SendBuf, pansichar('OK'));<br>        Send(SClinent, sendbuf, sizeof(sendbuf), 0);<br>      end;</p> <p>    FD_WRITE: begin</p> <p><br>        Memo1.Lines.Add('write');<br>      end;<br>    FD_ACCEPT: begin<br>        len := sizeof(OldOpenType);</p> <p>        if getsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, PChar(@OldOpenType), len) = 0 then begin<br>          try<br>            len := sizeof(addr);<br>            SClinent := accept(s, @addr, @len);</p> <p>            if SClinent = INVALID_SOCKET then begin<br>              Memo1.Lines.Add('鏃犳晥鐨剆ocket:' + inttostr(SClinent));<br>            end;<br>            Memo1.Lines.Add('accept');<br>          finally<br>            len := sizeof(OldOpenType);<br>            setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, PChar(@OldOpenType), len);<br>          end;<br>        end;<br>        WSAAsyncSelect(SClinent, handle, ASYNC_EVENT, $33);</p> <p>      end;<br>    FD_CONNECT: begin<br>        Memo1.Lines.Add('connect');<br>      end;<br>    FD_CLOSE: begin<br>        Memo1.Lines.Add('close');<br>      end;<br>  end;<br>end;</p> <p>end.<br>//鐢變簬鏈嶅姟鍣ㄧ娌℃湁緙撳瓨鏈哄埗,鎵浠ュ涓猚lient榪炴帴鐨勬椂鍊?絎簩涓猚lient鐨剆ocket浼氳鐩栧墠涓涓殑,澶у鐪嬫儏鍐墊敼鏀瑰氨琛屼簡,緗戠粶涓婂ぇ鎶婁唬鐮侀兘鏄敤鎺т歡鎴栬呭叾浠栧皝瑁呭ソd綾繪潵鍐檇,鎵浠ヨ祫鏂欓儊闂鋒浜?</p> <p> </p> <p> </p> <p>瀹㈡埛绔唬鐮?</p> <p>program Client;</p> <p>{$APPTYPE CONSOLE}</p> <p>uses<br>  SysUtils,<br>  windows,<br>  winsock;</p> <p>var<br>  addr: TSockAddrIn;<br>  wsa: TWSaData;<br>  flag: integer;<br>  s: TSocket;<br>  Host: string;<br>  Port: Word;<br>  BufSend: array[1..1024] of Ansichar; //涓棿淇℃伅<br>  BufRev: array[1..1024] of Ansichar;<br>  i: Integer;<br>begin<br>  { TODO -oUser -cConsole Main : Insert code here }</p> <p>  Host := '127.0.0.1';<br>  port := 45531;</p> <p>  flag := WSAStartup($0202, wsa); //鍔犺澆winsock<br>  if flag <> 0 then begin<br>    Writeln(format('閿欒鍙?%d', [WSAGetLastError()]));<br>    Writeln('Winsock搴撳姞杞藉け璐?);<br>  end else begin<br>    Writeln('Winsock搴撳姞杞芥垚鍔?)<br>  end;</p> <p>  //s := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //鏈嶅姟鍣ㄧ鐨剆ocket<br>  s := socket(PF_INET, SOCK_STREAM, 0);<br>  FillChar(addr, sizeof(addr), 0); //鍒濆鍖栧湴鍧絀洪棿</p> <p>  addr.sin_port := htons(port);<br>  addr.sin_family := AF_INET;<br>  addr.sin_addr.S_addr := {INADDR_ANY; } inet_addr(pchar(host));</p> <p>  if connect(s, addr, sizeof(addr)) = 0 then begin<br>    Writeln('涓繪満:' + Host + ' 榪炴帴鎴愬姛')<br>  end else begin<br>    Writeln('涓繪満:' + Host + ' 榪炴帴澶辮觸');<br>  end;</p> <p>  FillChar(BufSend, 1024, 0);</p> <p>  StrPCopy(@BufSend, '嫻嬭瘯淇℃伅鍖?);<br>  for i := 0 to 100 do begin<br>    Writeln(inttostr(s));<br>    if Send(s, Bufsend, Length(BufSend), 0) <> SOCKET_ERROR then begin<br>      Writeln('娑堟伅宸插彂閫?);<br>      sleep(500);</p> <p>      FillChar(BufRev, 1024, 0);<br>      //strcopy(bufsend,pansichar('a'))<br>      if recv(s, BufRev, Length(BufSend), 0) <> SOCKET_ERROR then begin<br>        writeln('鎺ユ敹鍒扮殑淇℃伅:' + trim(string(BufRev)));<br>      end else begin<br>        Writeln('鎺ユ敹娑堟伅澶辮觸!')<br>      end;</p> <p>    end else begin<br>      Writeln('娑堟伅鍙戦佸け璐?)<br>    end;<br>  end;</p> <p> </p> <p>  if closeSocket(s) = 0 then begin<br>    Writeln('宸茬粡鍏抽棴socket')<br>  end else begin<br>    Writeln('鍏抽棴socket 鍑洪敊')<br>  end;</p> <p>  WSACleanup();<br>  Readln;<br>end.</p><a ></a><img src ="http://www.shnenglu.com/Khan/aggbug/2632.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Khan/" target="_blank">Khan's Notebook</a> 2006-01-12 09:56 <a href="http://www.shnenglu.com/Khan/archive/2006/01/12/2632.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鍏充簬delphi 鐨勫嚱鏁拌皟鐢ㄥ拰鍙傛暟浼犻掓柟寮忔繁鍏ョ爺絀朵箣鐤戞儜http://www.shnenglu.com/Khan/archive/2004/11/22/2642.htmlKhan's NotebookKhan's NotebookMon, 22 Nov 2004 14:14:00 GMThttp://www.shnenglu.com/Khan/archive/2004/11/22/2642.htmlhttp://www.shnenglu.com/Khan/comments/2642.htmlhttp://www.shnenglu.com/Khan/archive/2004/11/22/2642.html#Feedback0http://www.shnenglu.com/Khan/comments/commentRss/2642.htmlhttp://www.shnenglu.com/Khan/services/trackbacks/2642.html

鍏充簬delphi 鐨勫嚱鏁拌皟鐢ㄥ拰鍙傛暟浼犻掓柟寮忔繁鍏ョ爺絀?/p>

 

delphi 浠g爜濡備笅:

program Project1;

uses windows, SysUtils;


function a(d, dd: word; s, j, f: string): word;
begin
  d := d - 1;
  result := d + dd;
  messagebox(0, pchar(inttostr(d) + s), pchar(inttostr(dd)), $0);
end;

var s: string;

begin
  s := 'sssssssssss';
 { asm
    mov dx,$11
    mov ax,$33
    call a;
  end; }
  a($33, $11, 'sssss', s, s);
end.

 

姹囩紪浠g爜:
00407CA8   . 447C4000       DD Project1.00407C44
00407CAC > $ 55             PUSH EBP     //淇濆瓨鏍堥《
00407CAD   . 8BEC           MOV EBP,ESP  //鍒濆鍖栧爢鏍?br>00407CAF   . 83C4 F0        ADD ESP,-10  //寮杈?0涓瓧鑺傜殑鏍?br>00407CB2   . B8 6C7C4000    MOV EAX,Project1.00407C6C
00407CB7   . E8 34C7FFFF    CALL Project1.004043F0
00407CBC   . 33C0           XOR EAX,EAX  //EAX娓?
00407CBE   . 55             PUSH EBP     //淇濆瓨鏍堥《
00407CBF   . 68 037D4000    PUSH Project1.00407D03  //淇濆瓨榪斿洖鍦板潃
00407CC4   . 64:FF30        PUSH DWORD PTR FS:[EAX]  //
00407CC7   . 64:8920        MOV DWORD PTR FS:[EAX],ESP  //
00407CCA   . B8 48984000    MOV EAX,Project1.00409848 
00407CCF   . BA 187D4000    MOV EDX,Project1.00407D18                ;  ASCII "sssssssssss"  //鍒濆鍖栧眬閮ㄥ彉閲?br>00407CD4   . E8 2FB9FFFF    CALL Project1.00403608  
00407CD9   . 68 2C7D4000    PUSH Project1.00407D2C                   ;  ASCII "jjjjjjjjjj" 
00407CDE   . 68 407D4000    PUSH Project1.00407D40                   ;  ASCII "ffffffffffff"
00407CE3   . B9 587D4000    MOV ECX,Project1.00407D58                ;  ASCII "sssss"
00407CE8   . 66:BA 1100     MOV DX,11
00407CEC   . 66:B8 3300     MOV AX,33
00407CF0   . E8 9BFEFFFF    CALL Project1.00407B90                   //璋冪敤鍑芥暟
00407CF5   . 33C0           XOR EAX,EAX
00407CF7   . 5A             POP EDX
00407CF8   . 59             POP ECX
00407CF9   . 59             POP ECX
00407CFA   . 64:8910        MOV DWORD PTR FS:[EAX],EDX
00407CFD   . 68 0A7D4000    PUSH Project1.00407D0A
00407D02   > C3             RETN                                     ;  RET used as a jump to 00407D0A

00407D03   .^E9 D4B2FFFF    JMP Project1.00402FDC
00407D08   .^EB F8          JMP SHORT Project1.00407D02
00407D0A     E8             DB E8
00407D0B     B5             DB B5
00407D0C     B7             DB B7
00407D0D     FF             DB FF
00407D0E     FF             DB FF
00407D0F     00             DB 00
00407D10   . FFFFFFFF       DD FFFFFFFF
00407D14   . 0B000000       DD 0000000B
00407D18   . 73 73 73 73 73>ASCII "sssssssssss",0
00407D24   . FFFFFFFF       DD FFFFFFFF
00407D28   . 0A000000       DD 0000000A
00407D2C   . 6A 6A 6A 6A 6A>ASCII "jjjjjjjjjj",0
00407D37     00             DB 00
00407D38   . FFFFFFFF       DD FFFFFFFF
00407D3C   . 0C000000       DD 0000000C
00407D40   . 66 66 66 66 66>ASCII "ffffffffffff",0
00407D4D     00             DB 00
00407D4E     00             DB 00
00407D4F     00             DB 00
00407D50   . FFFFFFFF       DD FFFFFFFF
00407D54   . 05000000       DD 00000005
00407D58   . 73 73 73 73 73>ASCII "sssss",0


function a(d, dd: word; s, j, f: string): word;
鍑芥暟鐨勪唬鐮?

00407B90  /$ 55             PUSH EBP
00407B91  |. 8BEC           MOV EBP,ESP
00407B93  |. 6A 00          PUSH 0
00407B95  |. 6A 00          PUSH 0
00407B97  |. 6A 00          PUSH 0
00407B99  |. 53             PUSH EBX
00407B9A  |. 56             PUSH ESI
00407B9B  |. 57             PUSH EDI
00407B9C  |. 894D FC        MOV DWORD PTR SS:[EBP-4],ECX
00407B9F  |. 8BF2           MOV ESI,EDX
00407BA1  |. 8BD8           MOV EBX,EAX
00407BA3  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
00407BA6  |. E8 49BDFFFF    CALL Project1.004038F4
00407BAB  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
00407BAE  |. E8 41BDFFFF    CALL Project1.004038F4
00407BB3  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]
00407BB6  |. E8 39BDFFFF    CALL Project1.004038F4
00407BBB  |. 33C0           XOR EAX,EAX
00407BBD  |. 55             PUSH EBP
00407BBE  |. 68 317C4000    PUSH Project1.00407C31
00407BC3  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
00407BC6  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
00407BC9  |. 4B             DEC EBX
00407BCA  |. 8D3C1E         LEA EDI,DWORD PTR DS:[ESI+EBX]
00407BCD  |. 6A 00          PUSH 0
00407BCF  |. 8D55 F8        LEA EDX,DWORD PTR SS:[EBP-8]
00407BD2  |. 0FB7C6         MOVZX EAX,SI
00407BD5  |. E8 5AD6FFFF    CALL Project1.00405234
00407BDA  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
00407BDD  |. E8 22BDFFFF    CALL Project1.00403904
00407BE2  |. 50             PUSH EAX
00407BE3  |. 8D55 F4        LEA EDX,DWORD PTR SS:[EBP-C]
00407BE6  |. 0FB7C3         MOVZX EAX,BX
00407BE9  |. E8 46D6FFFF    CALL Project1.00405234
00407BEE  |. 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
00407BF1  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
00407BF4  |. E8 33BCFFFF    CALL Project1.0040382C
00407BF9  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]
00407BFC  |. E8 03BDFFFF    CALL Project1.00403904
00407C01  |. 50             PUSH EAX                                 ; |Text
00407C02  |. 6A 00          PUSH 0                                   ; |hOwner = NULL
00407C04  |. E8 23C9FFFF    CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA  //榪欓噷stdcall鏂瑰紡璋冪敤messagebox
00407C09  |. 33C0           XOR EAX,EAX
00407C0B  |. 5A             POP EDX
00407C0C  |. 59             POP ECX
00407C0D  |. 59             POP ECX
00407C0E  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
00407C11  |. 68 387C4000    PUSH Project1.00407C38
00407C16  |> 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
00407C19  |. BA 03000000    MOV EDX,3
00407C1E  |. E8 B5B9FFFF    CALL Project1.004035D8
00407C23  |. 8D45 08        LEA EAX,DWORD PTR SS:[EBP+8]
00407C26  |. BA 02000000    MOV EDX,2
00407C2B  |. E8 A8B9FFFF    CALL Project1.004035D8
00407C30  \. C3             RETN

 

 

debug registers :
eax 00000000
ecx 00010101
edx ffffffff
ebx 7ffdf000
esp 0012ffc0  
ebp 0012fff0
esi 00000000
edi 0012d870
eip 00407cad project1.<ModuleEntryPoint>

00407CCA . B8 48984000 MOV EAX,Project1.00409848
00407CCF . BA 187D4000 MOV EDX,Project1.00407D18 ; ASCII "sssssssssss" //鍒濆鍖栧眬閮ㄥ彉閲?
00407CD4 . E8 2FB9FFFF CALL Project1.00403608
00407CD9 . 68 2C7D4000 PUSH Project1.00407D2C ; ASCII "jjjjjjjjjj"
00407CDE . 68 407D4000 PUSH Project1.00407D40 ; ASCII "ffffffffffff"
00407CE3 . B9 587D4000 MOV ECX,Project1.00407D58 ; ASCII "sssss"
00407CE8 . 66:BA 1100 MOV DX,11
00407CEC . 66:B8 3300 MOV AX,33
00407CF0 . E8 9BFEFFFF CALL Project1.00407B90 //璋冪敤鍑芥暟

鍑芥暟鍘熷瀷涓篺unction a(d, dd: word; s, j, f: string): word;
浠栫殑鎵ц欏哄簭鏄?鍏堟妸J ,f 鍘嬫爤 , 鎶?s 瀛樺叆 ecx ,鐒跺悗,灝? dd,d 鍒嗗埆瀛樺叆 dx 鍜?ax ,delphi鍒板簳鎸夌収浠涔堥『搴忔潵澶勭悊鍙傛暟d鍟?br>
Directive Parameter order Clean-upPasses parameters in registers?
register Left-to-right Routine Yes
pascal Left-to-right Routine No
cdecl Right-to-left Caller No
stdcall Right-to-left Routine No
safecall Right-to-left Routine No

鍙傛暟浼犻掓柟寮?
Delphi涓湁鑷繁鐨勫弬鏁頒紶閫掓柟寮?鑰學(xué)indows API涔熸湁鑷繁鐨勫弬鏁頒紶閫掓柟寮?閭d箞浠栦滑涔嬮棿鏈変粈涔堜笉鍚屽憿,瑕佸浣曞仛鍒板吋瀹瑰憿,灝ゅ叾鏄湪緙栧啓鍔ㄦ佸簱鏃?
(1)cdecl:
閫氬父鏄疌/C++鎵浣跨敤鐨勫弬鏁頒紶閫掓柟寮?瀹冪殑浼犻掓柟寮忔槸鐢卞彸鍒板乏,鑰屼笖褰撹璋冪敤鐨勫嚱鏁扮粨鏉熶箣鍚?灝嗕細鐢辮皟鐢ㄥ嚱鏁版湰韜潵娓呴櫎鍫嗘爤涓婄殑鍙傛暟鏁版嵁.
(2)stdcall:
鍙傛暟浼犻掓柟寮?涔熸槸鐢卞彸鍒板乏,浣嗘槸褰撹璋冪敤鐨勫嚱鏁扮粨鏉熶箣鍚?鍒欐槸鐢辮璋冪敤鍑芥暟鏉ユ竻闄ゅ爢鏍堜笂鐨勫弬鏁版暟鎹?Win32API鎵鏈夌殑杈撳嚭鍑芥暟閮芥槸閲囩敤姝や腑鍙傛暟浼犻掓柟寮?
(3)pascal:
鏄疍elphi1.0涓巜in16API鎵浣跨敤鐨勫弬鏁頒紶閫掓柟寮?瀹冪殑浼犻掓柟寮忔槸鐢卞乏鍒板彸,鑰屼笖鐢辮璋冪敤鍑芥暟鏉ユ竻闄ゅ爢鏍堜笂鐨勫弬鏁版暟鎹?
(4)fastcall:
鏄疍elphi榛樿鎵浣跨敤鐨勫弬鏁頒紶閫掓柟寮?姝ょ鏂瑰紡鍦ㄤ紶閫掑弬鏁版椂鎶婂墠涓変釜鍙傛暟鏀懼湪CPU鐨凟AX,EDX,ECX涓変釜緙撳瓨鍣ㄧ,鍓╀笅鐨勫弬鏁板垯浼氱敱宸﹀埌鍙沖湴琚彇鍑烘斁鍒板爢鏍堜腑,鑰屽綋琚皟鐢ㄧ殑鍑芥暟緇撴潫涔? 鍚?鍒欐槸鐢辮璋冪敤鍑芥暟鏉ユ竻闄ゅ爢鏍堜笂鐨勫弬鏁版暟鎹?
娉?鎵浠ュ湪寮曠敤C++鍔ㄦ佸簱涓殑鍑芥暟鏃?瑕佹敞鎰忓弬鏁扮殑浼犻掓柟寮?涓鑸嬌鐢╯tdcall.榪樿娉ㄦ剰瀛楃涓茬被鍨?C++鍦ㄤ紶閫掑瓧絎︿覆鏃?閮芥槸閲囩敤瀛楃鎸囬拡鐨? 綾誨瀷(Char *),鎵浠ヤ綘鍦―elphi鐨勭▼搴忎腑灝卞繀 欏諱嬌鐢≒CHAR綾誨瀷,鑰屼笉鏄痵tring綾誨瀷.

Delphi緙栬瘧浠g爜鍜屼竴鑸殑C緙栬瘧浠g爜涓嶅お涓鏍鳳紝姣斿璋冪敤綰﹀畾涓紝C鐨則hiscall鐢‥CX浼犻抰his鎸囬拡錛岃孌elphi鐨則hiscall鐢? EAX浼犻抰his鎸囬拡錛汣鐨刦astcall涓鑸敤ECX/EDX涓や釜瀵勫瓨鍣ㄧ敤浜庡弬鏁頒紶閫掞紝鑰孌elphi鍒欑敤涓変釜EAX/EDX/ECX錛涘湪浣跨敤嫻偣 鏁版椂錛孋閫氳繃鍘嬫爤涓や釜DWORD浼犻抎ouble鍙傛暟錛岃孌elphi鍒欑敤FLD鍜孎STP鐩存帴閫氳繃FPU浼犻掑弬鏁般備慨楗板悕涔熶笉涓鏍鳳紝榪欓噷涓嶅姞鍙欒堪銆?



鍏充簬璋冪敤綰﹀畾鍙傝?http://baby.homeip.net/patrick/archives/000142.php



鐩墠鐨処DA灝氫笉鏀寔鍔犺澆.MAP/.SYM絎﹀彿淇℃伅錛屾牴鎹瓺ataRescue緗戠珯鐨勮鏄庯紝鍙互閫氳繃.IDC鑴氭湰鍔犺澆錛?a target="_new" >http://www.ccso.com/faq.html錛夈侱eDe鐨処DA/Softice絎﹀彿杈撳嚭涓嵁璇村彲浠ヨ嚜鍔ㄦ嫻嬭繍琛岀殑Soft-ICE騫跺悜鍏跺鍏ョ鍙鳳紝浣嗗疄闄呬嬌鐢ㄦ椂涓嶆槸寰堢伒鍏夛紝鏍規(guī)嵁.MAP鏂囦歡鏍煎紡鍙互鍐欎竴涓▼搴忓皢鍏惰漿鎹㈡垚.IDC鑴氭湰錛?



#!/usr/bin/perl

use strict;

sub dump_idc;



my $hex_pat = "[0-9A-Fa-f]+";



my $start;

my @entries;



while (<>) {

chop;

if ($start eq ''--fetch-next'') {

# start, length, name, class

($start) = m/$hex_pat:($hex_pat)\s+($hex_pat)H\s+(\w+)\s+(\w+)/;

if (!$start) {

print STDERR "Invalid .map file format!";

exit -1;

}

$start = hex($start);

next;

}



if (m/Start\s+Length\s+Name\s+Class/) {

$start = ''--fetch-next'';

next;

}



if (m/$hex_pat:($hex_pat)\s*(.*)$/) {

my ($offset, $entry) = (hex($1), $2);

my $rva = $offset + $start;

push @entries, [$rva, $entry];

}

}



@entries = sort { $a->[0] cmp $b->[0] } @entries;



&dump_idc;



sub dump_idc {

print "static main() {\n";



foreach (@entries) {

my ($rva, $entry) = @$_;

#$rva = hex($rva);



$entry =~ s/^\*/\$/;

$entry =~ s/^[<>\-]*//;

$entry =~ s/\(.*$//;

$entry =~ s/:.*$//;

$entry =~ s/\./?/;

$entry =~ s/\[([0-9]+)\]/_$1/g;

$entry =~ s/\[.*$/_$rva/;

$entry =~ s/;.*$//;



$entry =~ s/^\s *//;

next if !$entry;



printf "MakeName(0x%x, \"$entry\");\n", $rva, $entry;

}



print "}\n";

}



1;



鏈変簺紼嬪簭鍦ㄦ楠屾敞鍐岀爜鏃墮氳繃鎶涘嚭寮傚父絳夎涓虹‘瀹氭槸鍚︽敞鍐屾垚鍔燂紝鍏充簬寮傚父Matt Pietrek鏈変竴綃囪憲鍚嶆枃绔?a target="_new" >http://www.microsoft.com/msj/0197/Exception/Exception.aspx鍊煎緱涓璇?/a>銆備粠姹囩紪浠g爜涓婄湅錛屾墍鏈塼ry/catch鍧楅兘鏈夌被浼肩殑緇撴瀯錛?



CODE:004BDE4C xor eax, eax

CODE:004BDE4E push ebp

CODE:004BDE4F push offset loc_4BDE92

CODE:004BDE54 push dword ptr fs:[eax] ; 淇濆瓨涓婁竴涓猦andler

CODE:004BDE57 mov fs:[eax], esp



CODE:004BDE92 loc_4BDE92:

CODE:004BDE92 jmp _Any2_Handler_DevErr?

CODE:004BDE97 jmp short loc_4BDE89



CODE:004BDEEA pop edx ; 涓婁竴涓猦andler

CODE:004BDEEB pop ecx

CODE:004BDEEC pop ecx

CODE:004BDEED mov fs:[eax], edx ; 鎭㈠



娉ㄦ剰鍒?BDE97H澶勪唬鐮佹湭琚墽琛岋紝榪欐槸鎬庝箞鍥炰簨鍛紵鍘熸潵瀹冩槸finally瀵瑰簲鐨勫潡錛孲EH鍐呮牳浼氭牴鎹畃ush offset loc_4BDE92鑷姩寰楀埌4BDE97H鐨刦inally鍏ュ彛鍦板潃銆傚洜姝ゅ湪璋冭瘯鏈夊紓甯稿鐞嗙殑紼嬪簭鏃訛紝鏈夋椂闇瑕佸湪handler鍜宖inally鐨勫鐞? 紼嬪簭澶勪篃璁劇疆鏂偣銆?



浠婂ぉ鍏堝埌榪欓噷錛屽彲鑳界殑璇濅笅嬈″啀璐淬?

鍦ㄥ懆鐖辨皯鐨勮憲浣溿奃ELPHI婧愪唬鐮佸垎鏋愩嬩腑錛屽姝ゆ湁鎻忚堪銆?br>


]]>
鏄ㄥぉ寮濮嬫墦綆楀啓cmpp3.0鐨勭綉鍏?浜庢槸鎷夸簡鍗庝負(fù)鐨刣emo鍙嶇紪璇戜簡涓涓?鍙戠幇n澶氭眽瀛楅兘緙栫▼浜唘nicode緙栫爜,浜庢槸鑷繁鍐欎簡涓涓猽nicode杞眽瀛楃殑紼嬪簭,share緇欏ぇ瀹?/title><link>http://www.shnenglu.com/Khan/archive/2004/11/19/2643.html</link><dc:creator>Khan's Notebook</dc:creator><author>Khan's Notebook</author><pubDate>Thu, 18 Nov 2004 21:44:00 GMT</pubDate><guid>http://www.shnenglu.com/Khan/archive/2004/11/19/2643.html</guid><wfw:comment>http://www.shnenglu.com/Khan/comments/2643.html</wfw:comment><comments>http://www.shnenglu.com/Khan/archive/2004/11/19/2643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Khan/comments/commentRss/2643.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Khan/services/trackbacks/2643.html</trackback:ping><description><![CDATA[鍑犱釜杞爜鐨勫嚱鏁?unicode string utf8 anscii 涔嬮棿鐨勮漿鎹?delphi<img src="http://blog.codelphi.com/liukun966123/aggbug/29139.aspx" height="1" width="1"><br><br><p><font face="Courier New">/** 涓葷▼搴?鍖呭惈鍑犱釜杞爜鐨勫嚱鏁?/font></p> <p><font face="Courier New">*   浣滆?鍒樻槅 </font></p> <p><font face="Courier New">*   鏈鍚庝慨鏀規(guī)棩鏈?  2004-11-18 </font></p> <p><font face="Courier New">*   浠ヤ笂浠g爜鍏嶈垂,鑻ョ洿鎺ュ紩鐢ㄤ竴涓嬩唬鐮佽鍛婄煡,騫朵繚鐣欐娉ㄩ噴</font></p> <p><font face="Courier New">*   浣滀負(fù)涓鍚嶇▼搴忓憳搴旇鏈夋渶鍩烘湰鐨勮亴涓氶亾寰?/</font></p> <p>unit MainForm;</p> <p>interface</p> <p>uses<br>  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br>  Dialogs, StdCtrls, ExtCtrls;</p> <p>type<br>  TFormMain = class(TForm)<br>    Panel1: TPanel;<br>    Memo1: TMemo;<br>    ComboBox1: TComboBox;<br>    Button1: TButton;<br>    Memo2: TMemo;<br>    procedure Button1Click(Sender: TObject);<br>  private<br>    function StrToUTF8(str: WideString): string;<br>    function StrToASC(Str: string): string;<br>    function GB2Unicode(Str: WideString): string; overload;<br>    //function GB2Unicode(Str: string): string; overload;<br>    function U2GB(Str: string): string;<br>    function UTF8ToStr(const str: UTF8String): string;<br>    function HexToInt(const Str: string): integer;<br>    function HexIndex(const c: Char): Integer;<br>    { Private declarations }<br>  public<br>    { Public declarations }<br>  end;</p> <p>var<br>  FormMain: TFormMain;</p> <p>implementation</p> <p>{$R *.dfm}</p> <p>{ TFormMain }</p> <p>function TFormMain.StrToASC(Str: string): string;<br>var<br>  TmpStr: string;<br>  TmpPchar: Pchar;<br>  i: integer;<br>begin<br>  result := '';<br>  TmpStr := '';<br>  TmpPchar := pchar(Str);<br>  for i := 0 to length(TmpPchar) - 1 do<br>    TmpStr := TmpStr + format('%2.2x', [ord(TmpPchar[i])]);</p> <p>  result := TmpStr;<br>end;</p> <p>function TFormMain.StrToUTF8(str: WideString): string;<br>var<br>  s: pchar;<br>  i: integer;<br>  tmp: string;<br>begin<br>  tmp := '';<br>  result := '';<br>  s := pchar(Utf8encode(str));<br>  for i := 0 to strlen(s) do begin<br>    tmp := tmp + format('%2.2x', [ord(s[i])]);<br>  end;<br>  result := tmp;<br>end;</p> <p><br>function TFormMain.UTF8ToStr(const str: UTF8String): string;<br>var<br>  s: pchar;<br>  i: integer;<br>  tmp: string;<br>begin<br>  tmp := '';<br>  result := '';<br>  s := PChar(str);<br>  i := 0;<br>  while i < length(s) do begin<br>    tmp := tmp + chr(HexToInt(s[i] + s[i + 1]));<br>    inc(i, 2);<br>  end;<br>  result := Utf8Decode(tmp);<br>end;</p> <p>function TFormMain.GB2Unicode(Str: WideString): string;<br>var<br>  i: Integer;<br>begin<br>  Result := '';<br>  for i := 1 to Length(Str) do<br>    Result := Result + Format('%4.4x', [ord(Str[i])]);<br>end;</p> <p><br>procedure TFormMain.Button1Click(Sender: TObject);<br>begin<br>  case ComboBox1.ItemIndex of<br>    0: memo2.Lines.Add(GB2Unicode(memo1.Lines.Text));<br>    1: memo2.Lines.Add(StrToUTF8(memo1.Lines.Text));<br>    2: memo2.Lines.Add(UTF8ToStr(memo1.Lines.Text));<br>    3: memo2.Lines.Add(U2GB(StringReplace(memo1.Lines.Text, '\u', '', [rfReplaceAll])));<br>    4: memo2.Lines.Add(StrToASC(memo1.Lines.Text));<br>  end;<br>end;</p> <p>function TFormMain.HexToInt(const Str: string): integer;<br>var p: pchar;</p> <p>begin<br>  result := -1;<br>  if length(str) > 2 then exit;<br>  p := pchar(str);</p> <p>  if (HexIndex(p[0]) <> -1) and (HexIndex(p[1]) <> -1) then<br>    result := HexIndex(p[0]) * $10 + HexIndex(p[1]);<br>end;</p> <p>function TFormMain.HexIndex(const c: Char): Integer;<br>const Digits: array[0..15] of Char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');<br>var i: integer;<br>begin<br>  result := -1;<br>  if (not (UpCase(c) in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'])) then<br>    exit;</p> <p>  for i := 0 to high(digits) do<br>    if Digits[i] = UpCase(c) then begin<br>      result := i;<br>      break;<br>    end;<br>end;</p> <p><br>function TFormMain.U2GB(Str: string): string;<br>var s: pchar;<br>  i: integer;<br>  tmp: string;<br>begin<br>  tmp := '';<br>  result := '';<br>  s := PChar(str);<br>  i := 0;<br>  while i < length(s) do begin<br>    tmp := tmp + chr(HexToInt(s[i + 2] + s[i + 3])) + chr(HexToInt(s[i] + s[i + 1]));//unicode杞崲鏃?楂樹綆浣嶄簰鎹?br>    inc(i, 4);<br>  end;<br>  result := widechartostring(pWideChar(tmp + #0#0#0#0));<br>end;</p> <p>end.</p><br><img src ="http://www.shnenglu.com/Khan/aggbug/2643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Khan/" target="_blank">Khan's Notebook</a> 2004-11-19 05:44 <a href="http://www.shnenglu.com/Khan/archive/2004/11/19/2643.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>璧峰洜婧愪簬涔嬪墠蹇樿涓涓猘dsl鐨勭鍙?鎯沖啓涓涓鍙f帰嫻嬪伐鍏?姝簬sp鐨勮璐叧緋誨寘媯嫻?/title><link>http://www.shnenglu.com/Khan/archive/2004/11/12/2644.html</link><dc:creator>Khan's Notebook</dc:creator><author>Khan's Notebook</author><pubDate>Thu, 11 Nov 2004 19:25:00 GMT</pubDate><guid>http://www.shnenglu.com/Khan/archive/2004/11/12/2644.html</guid><wfw:comment>http://www.shnenglu.com/Khan/comments/2644.html</wfw:comment><comments>http://www.shnenglu.com/Khan/archive/2004/11/12/2644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Khan/comments/commentRss/2644.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Khan/services/trackbacks/2644.html</trackback:ping><description><![CDATA[铏界劧鍙湁榪欎箞鐐逛笢瑗?浣嗘垜榪樻槸鍋氫簡3澶?鑰佷簡<br><br> 涓涓猻p鐢ㄧ殑wap璁㈣喘鍏崇郴鍖呰皟璇曟嫻嬪伐鍏?img src="http://blog.codelphi.com/liukun966123/aggbug/28600.aspx" height="1" width="1"><br><br> <p> </p> <p><font face="Courier New">/** 紼嬪簭鐨勬牳蹇?涓涓猵ost綰跨▼,鐢ㄤ簬鎻愪氦xml鏁版嵁鍖?/font></p> <p><font face="Courier New">*   浣滆?鍒樻槅 </font></p> <p><font face="Courier New">*   鏈鍚庝慨鏀規(guī)棩鏈?  2004-9-23 </font></p> <p><font face="Courier New">*   浠ヤ笂浠g爜鍏嶈垂,鑻ョ洿鎺ュ紩鐢ㄤ竴涓嬩唬鐮佽鍛婄煡,騫朵繚鐣欐娉ㄩ噴</font></p> <p><font face="Courier New">*   浣滀負(fù)涓鍚嶇▼搴忓憳搴旇鏈夋渶鍩烘湰鐨勮亴涓氶亾寰?/</font></p> <p><font face="Courier New">unit HTTPGetThread;</font></p> <p><font face="Courier New">interface<br>uses classes, SysUtils, wininet, windows;</font></p> <p><br><font face="Courier New">type<br>  TOnProgressEvent = procedure(TotalSize, Readed: Integer) of object;</font></p> <p><br><font face="Courier New">  THTTPGetThread = class(TThread)</font></p> <p><font face="Courier New">  private<br>    FTAcceptTypes: string; //鎺ユ敹鏂囦歡綾誨瀷 *.*<br>    FTAgent: string; //嫻忚鍣ㄥ悕  Nokia6610/1.0 (5.52) Profile/MIDP-1.0 Configuration/CLDC-1.02<br>    FTURL: string; // url<br>    FTFileName: string; //鏂囦歡鍚?br>    FTStringResult: AnsiString;<br>    FTUserName: string; //鐢ㄦ埛鍚?br>    FTPassword: string; //瀵嗙爜<br>    FTPostQuery: string; //鏂規(guī)硶鍚?post鎴栬単et<br>    FTReferer: string;<br>    FTBinaryData: Boolean;<br>    FTUseCache: Boolean; //鏄惁浠庣紦瀛樿鏁版嵁<br>    FTMimeType: string; //Mime綾誨瀷</font></p> <p><font face="Courier New">    FTResult: Boolean;<br>    FTFileSize: Integer;<br>    FTToFile: Boolean; //鏄惁鏂囦歡</font></p> <p><font face="Courier New">    BytesToRead, BytesReaded: LongWord;</font></p> <p><font face="Courier New">    FTProgress: TOnProgressEvent;<br>    procedure ParseURL(URL: string; var HostName, FileName: string; var portNO: integer); //鍙栧緱url鐨勪富鏈哄悕鍜屾枃浠跺悕<br>    procedure UpdateProgress;<br>  protected<br>    procedure Execute; override;<br>  public<br>    procedure setResult(FResult: boolean);<br>    function getResult(): boolean;<br>    function getFileName(): string;<br>    function getToFile(): boolean;<br>    function getFileSize(): integer;<br>    function getStringResult(): AnsiString;<br>    constructor Create(aAcceptTypes, aMimeType, aAgent, aURL, aFileName, aUserName, aPassword, aPostQuery, aReferer: string; aBinaryData, aUseCache: Boolean; aProgress: TOnProgressEvent; aToFile: Boolean);</font></p> <p><font face="Courier New">  end;</font></p> <p><font face="Courier New">implementation</font></p> <p><font face="Courier New">{ THTTPGetThread }</font></p> <p><font face="Courier New">constructor THTTPGetThread.Create(aAcceptTypes, aMimeType, aAgent, aURL, aFileName, aUserName, aPassword, aPostQuery, aReferer: string; aBinaryData, aUseCache: Boolean; aProgress: TOnProgressEvent; aToFile: Boolean);<br>begin<br>  FreeOnTerminate := True;<br>  inherited Create(True);</font></p> <p><font face="Courier New">  FTAcceptTypes := aAcceptTypes;<br>  FTAgent := aAgent;<br>  FTURL := aURL;<br>  FTFileName := aFileName;<br>  FTUserName := aUserName;<br>  FTPassword := aPassword;</font></p> <p><font face="Courier New">  //FTPostQuery := aPostQuery;</font></p> <p><font face="Courier New">  FTPostQuery := StringReplace(aPostQuery, #13#10, '', [rfReplaceAll]);</font></p> <p><font face="Courier New">  FTReferer := aReferer;<br>  FTProgress := aProgress;<br>  FTBinaryData := aBinaryData;<br>  FTUseCache := aUseCache;<br>  FTMimeType := aMimeType;</font></p> <p><font face="Courier New">  FTToFile := aToFile;<br>  Resume;<br>end;</font></p> <p><font face="Courier New">procedure THTTPGetThread.Execute;<br>var<br>  hSession: hInternet; //鍥炶瘽鍙ユ焺<br>  hConnect: hInternet; //榪炴帴鍙ユ焺<br>  hRequest: hInternet; //璇鋒眰鍙ユ焺<br>  Host_Name: string; //涓繪満鍚?br>  File_Name: string; //鏂囦歡鍚?br>  port_no: integer;</font></p> <p><font face="Courier New">  RequestMethod: PChar;<br>  InternetFlag: longWord;<br>  AcceptType: PAnsiChar;<br>  dwBufLen, dwIndex: longword;<br>  Buf: Pointer; //緙撳啿鍖?br>  f: file;<br>  Data: array[0..$400] of Char;<br>  TempStr: AnsiString;<br>  mime_Head: string;</font></p> <p><font face="Courier New">  procedure CloseHandles;<br>  begin<br>    InternetCloseHandle(hRequest);<br>    InternetCloseHandle(hConnect);<br>    InternetCloseHandle(hSession);<br>  end;</font></p> <p><font face="Courier New">begin<br>  inherited;<br>  buf := nil;<br>  try<br>    try<br>      ParseURL(FTURL, Host_Name, File_Name, port_no);</font></p> <p><font face="Courier New">      if Terminated then begin<br>        FTResult := False;<br>        Exit;<br>      end;<br>     //寤虹珛浼氳瘽<br>      hSession := InternetOpen(pchar(FTAgent), //lpszCallerName鎸囧畾姝e湪浣跨敤緗戠粶鍑芥暟鐨勫簲鐢ㄧ▼搴?br>        INTERNET_OPEN_TYPE_PRECONFIG, //鍙傛暟dwAccessType鎸囧畾璁塊棶綾誨瀷<br>        nil, //鏈嶅姟鍣ㄥ悕錛坙pszProxyName錛夈?accesstype涓篏ATEWAY_PROXY_INTERNET_ACCESS鍜孋ERN_PROXY_ACCESS鏃?br>        nil, //NProxyPort鍙傛暟鐢ㄥ湪CERN_PROXY_INTERNET_ACCESS涓敤鏉ユ寚瀹氫嬌鐢ㄧ殑绔彛鏁般備嬌鐢↖NTERNET_INVALID_PORT_NUMBER鐩稿綋浜庢彁渚涘嵈鐪佺殑绔彛鏁般?br>        0); //璁劇疆棰濆鐨勯夋嫨銆備綘鍙互浣跨敤INTERNET_FLAG_ASYNC鏍囧織鍘繪寚紺轟嬌鐢ㄨ繑鍥炲彞鍙ユ焺鐨勫皢鏉ョ殑Internet鍑芥暟灝嗕負(fù)鍥炶皟鍑芥暟鍙戦佺姸鎬佷俊鎭紝浣跨敤InternetSetStatusCallback榪涜姝ら」璁劇疆</font></p> <p><font face="Courier New">     //寤虹珛榪炴帴<br>      hConnect := InternetConnect(hSession, //浼氳瘽鍙ユ焺<br>        PChar(Host_Name), //鎸囧悜鍖呭惈Internet鏈嶅姟鍣ㄧ殑涓繪満鍚嶇О錛堝</font><a ><font face="Courier New">http://www.mit.edu</font></a><font face="Courier New">錛夋垨IP鍦板潃錛堝202.102.13.141錛夌殑瀛楃涓?br>        port_no, //INTERNET_DEFAULT_HTTP_PORT, //鏄皢瑕佽繛緇撳埌鐨凾CP/IP鐨勭鍙e彿<br>        PChar(FTUserName), //鐢ㄦ埛鍚?br>        PChar(FTPassword), //瀵嗙爜<br>        INTERNET_SERVICE_HTTP, //鍗忚<br>        0, // 鍙夋爣璁幫紝璁劇疆涓篒NTERNET_FLAG_SECURE錛岃〃紺轟嬌鐢⊿SL/PCT鍗忚瀹屾垚浜嬪姟<br>        0); //搴旂敤紼嬪簭瀹氫箟鐨勫鹼紝鐢ㄦ潵涓鴻繑鍥炵殑鍙ユ焺鏍囪瘑搴旂敤紼嬪簭璁懼鍦哄</font></p> <p><font face="Courier New">      if FTPostQuery = '' then RequestMethod := 'GET'<br>      else RequestMethod := 'POST';</font></p> <p><font face="Courier New">      if FTUseCache then InternetFlag := 0<br>      else InternetFlag := INTERNET_FLAG_RELOAD;</font></p> <p><font face="Courier New">      AcceptType := PChar('Accept: ' + FTAcceptTypes);</font></p> <p><font face="Courier New">    //寤虹珛涓涓猦ttp璇鋒眰鍙ユ焺<br>      hRequest := HttpOpenRequest(hConnect, //InternetConnect榪斿洖鐨凥TTP浼氳瘽鍙ユ焺<br>        RequestMethod, //鎸囧悜鍦ㄧ敵璇蜂腑浣跨敤鐨?鍔ㄨ瘝"鐨勫瓧絎︿覆錛屽鏋滆緗負(fù)NULL錛屽垯浣跨敤"GET"<br>        PChar(File_Name), //鎸囧悜鍖呭惈鍔ㄨ瘝鐨勭洰鏍囧璞″悕縐扮殑瀛楃涓詫紝閫氬父鏄枃浠跺悕縐般佸彲鎵ц妯″潡鎴栨悳绱㈣鏄庣<br>        'HTTP/1.0', //鎸囧悜鍖呭惈HTTP鐗堟湰鐨勫瓧絎︿覆錛屽鏋滀負(fù)NULL錛屽垯榛樿涓?HTTP/1.0"錛?br>        PChar(FTReferer), //鎸囧悜鍖呭惈鏂囨。鍦板潃錛圲RL錛夌殑瀛楃涓詫紝鐢寵鐨刄RL蹇呴』鏄粠璇ユ枃妗h幏鍙栫殑<br>        @AcceptType, //鎸囧悜瀹㈡埛鎺ユ敹鐨勫唴瀹圭殑綾誨瀷<br>        InternetFlag,<br>        0);<br>      mime_Head := 'Content-Type: ' + FTMimeType;<br>      if FTPostQuery = '' then<br>        FTResult := HttpSendRequest(hRequest, nil, 0, nil, 0)<br>      else<br>    //鍙戦佷竴涓寚瀹氳姹傚埌httpserver<br>        FTResult := HttpSendRequest(hRequest,<br>          pchar(mime_Head), //mime 澶?br>          length(mime_Head), //澶撮暱搴?br>          PChar(FTPostQuery), //闄勫姞鏁版嵁緙撳啿鍖猴紝鍙負(fù)絀?br>          strlen(PChar(FTPostQuery))); //闄勫姞鏁版嵁緙撳啿鍖洪暱搴?/font></p> <p><font face="Courier New">      if Terminated then<br>      begin<br>      //CloseHandles;<br>        FTResult := False;<br>        Exit;<br>      end;</font></p> <p><font face="Courier New">      dwIndex := 0;<br>      dwBufLen := 1024;<br>      GetMem(Buf, dwBufLen);</font></p> <p><font face="Courier New">    //鎺ユ敹header淇℃伅鍜屼竴涓猦ttp璇鋒眰<br>      FTResult := HttpQueryInfo(hRequest,<br>        HTTP_QUERY_CONTENT_LENGTH,<br>        Buf, //鎸囧悜涓涓帴鏀惰姹備俊鎭殑緙撳啿鍖虹殑鎸囬拡<br>        dwBufLen, //HttpQueryInfo鍐呭鐨勫ぇ灝?br>        dwIndex); //璇誨彇鐨勫瓧鑺傛暟</font></p> <p><font face="Courier New">      if Terminated then begin<br>        FTResult := False;<br>        Exit;<br>      end;</font></p> <p><font face="Courier New">      if FTResult or not FTBinaryData then begin //濡傛灉璇鋒眰<br>        if FTResult then<br>          FTFileSize := StrToInt(StrPas(Buf));</font></p> <p><font face="Courier New">        BytesReaded := 0;</font></p> <p><font face="Courier New">        if FTToFile then begin<br>          AssignFile(f, FTFileName);<br>          Rewrite(f, 1);<br>        end else FTStringResult := '';</font></p> <p><font face="Courier New">        while True do begin<br>          if Terminated then begin<br>            FTResult := False;<br>            Exit;<br>          end;</font></p> <p><font face="Courier New">          if not InternetReadFile(hRequest,<br>            @Data, //鏁版嵁鍐呭<br>            SizeOf(Data), //澶у皬<br>            BytesToRead) //璇誨彇鐨勫瓧鑺傛暟<br>            then Break<br>          else<br>            if BytesToRead = 0 then Break<br>            else begin<br>              if FTToFile then<br>                BlockWrite(f, Data, BytesToRead) //灝嗚鍑虹殑鏁版嵁鍐欏叆鏂囦歡<br>              else begin<br>                TempStr := Data;<br>                SetLength(TempStr, BytesToRead);<br>                FTStringResult := FTStringResult + TempStr;<br>              end;</font></p> <p><font face="Courier New">              inc(BytesReaded, BytesToRead);</font></p> <p><font face="Courier New">              if Assigned(FTProgress) then //鎵ц鍥炶皟鍑芥暟<br>                Synchronize(UpdateProgress);</font></p> <p><font face="Courier New">            end;<br>        end;</font></p> <p><font face="Courier New">        if FTToFile then<br>          FTResult := FTFileSize = Integer(BytesReaded)<br>        else begin<br>         // SetLength(FTStringResult, BytesReaded);<br>          FTResult := BytesReaded <> 0;<br>        end;</font></p> <p><font face="Courier New">      end;<br>    except<br>    end;<br>  finally<br>    if FTToFile then CloseFile(f);</font></p> <p><font face="Courier New">    if assigned(Buf) then FreeMem(Buf);<br>    CloseHandles;<br>  end;<br>end;</font></p> <p> </p> <p><font face="Courier New">function THTTPGetThread.getFileName: string;<br>begin<br>  result := FTFileName;<br>end;</font></p> <p><font face="Courier New">function THTTPGetThread.getFileSize: integer;<br>begin<br>  result := FTFileSize;<br>end;</font></p> <p><font face="Courier New">function THTTPGetThread.getResult: boolean;<br>begin<br>  result := FTResult;<br>end;</font></p> <p><font face="Courier New">function THTTPGetThread.getStringResult: AnsiString;<br>begin<br>  result := FTStringResult;<br>end;</font></p> <p><font face="Courier New">function THTTPGetThread.getToFile: boolean;<br>begin<br>  result := FTToFile;<br>end;</font></p> <p><font face="Courier New">procedure THTTPGetThread.ParseURL(URL: string; var HostName, FileName: string; var portNO: integer);<br>var<br>  i: Integer;<br>begin<br>  if Pos('http://', LowerCase(URL)) <> 0 then<br>    Delete(URL, 1, 7);</font></p> <p><font face="Courier New">  i := Pos('/', URL);<br>  HostName := Copy(URL, 1, i);<br>  FileName := Copy(URL, i, Length(URL) - i + 1);</font></p> <p><font face="Courier New">  i := pos(':', hostName);<br>  if i <> 0 then begin<br>    portNO := strtoint(copy(hostName, i + 1, length(hostName) - i - 1));<br>    hostName := copy(hostName, 1, i - 1);<br>  end else portNO := 80;</font></p> <p><font face="Courier New">  if (Length(HostName) > 0) and (HostName[Length(HostName)] = '/') then SetLength(HostName, Length(HostName) - 1);<br>end;</font></p> <p><br><font face="Courier New">procedure THTTPGetThread.setResult(FResult: boolean);<br>begin<br>  FTResult := FResult;<br>end;</font></p> <p><font face="Courier New">procedure THTTPGetThread.UpdateProgress;<br>begin<br>  FTProgress(FTFileSize, BytesReaded);<br>end;</font></p> <p><font face="Courier New">end.</font></p> <p> </p> <p><font face="Courier New">/** 涓昏鐢ㄦ潵鍋氱嚎紼嬪拰鐣岄潰鐨勪氦浜?/font></p> <p><font face="Courier New">*   浣滆?鍒樻槅 </font></p> <p><font face="Courier New">*   鏈鍚庝慨鏀規(guī)棩鏈?  2004-9-23 </font></p> <p><font face="Courier New">*   浠ヤ笂浠g爜鍏嶈垂,鑻ョ洿鎺ュ紩鐢ㄤ竴涓嬩唬鐮佽鍛婄煡,騫朵繚鐣欐娉ㄩ噴</font></p> <p><font face="Courier New">*   浣滀負(fù)涓鍚嶇▼搴忓憳搴旇鏈夋渶鍩烘湰鐨勮亴涓氶亾寰?/</font></p> <p><font face="Courier New">unit MyHttpGet;</font></p> <p><font face="Courier New">interface</font></p> <p><font face="Courier New">uses HTTPGetThread, windows;</font></p> <p><font face="Courier New">type<br>  TOnDoneFileEvent = procedure(FileName: string; FileSize: Integer) of object;<br>  TOnDoneStringEvent = procedure(Result: AnsiString) of object;</font></p> <p><br><font face="Courier New">  THttpGet = class<br>  private<br>    F_URL: string; //鐩爣url<br>    F_GetURLThread: THTTPGetThread; //鍙栨暟鎹殑綰跨▼</font></p> <p><font face="Courier New">    F_Accept_Types: string;<br>    F_Agent: string;<br>    F_Binary_Data: Boolean;<br>    F_Use_Cache: Boolean; //鏄惁璇葷紦瀛?br>    F_File_Name: string;<br>    F_User_Name: string; //鐢ㄦ埛鍚?br>    F_Password: string; //瀵嗙爜<br>    F_PostQuery: string; //鏂規(guī)硶鍚?br>    F_Referer: string;<br>    F_Mime_Type: string;</font></p> <p><font face="Courier New">    F_Wait_Thread: Boolean;</font></p> <p><font face="Courier New">    FResult: Boolean;</font></p> <p><font face="Courier New">    FProgress: TOnProgressEvent;<br>    FDoneFile: TOnDoneFileEvent;<br>    FDoneString: TOnDoneStringEvent;</font></p> <p><font face="Courier New">    procedure ThreadDone(Sender: TObject);</font></p> <p><font face="Courier New">  public<br>    constructor Create();<br>    destructor Destroy(); override;<br>    procedure getFile();<br>    procedure GetString();<br>    procedure Abort();<br>  published<br>    property WaitThread: Boolean read F_Wait_Thread write F_Wait_Thread;<br>    property AcceptTypes: string read F_Accept_Types write F_Accept_Types;<br>    property Agent: string read F_Agent write F_Agent;<br>    property BinaryData: Boolean read F_Binary_Data write F_Binary_Data;<br>    property URL: string read F_URL write F_URL;<br>    property UseCache: Boolean read F_Use_Cache write F_Use_Cache;<br>    property FileName: string read F_File_Name write F_File_Name;<br>    property UserName: string read F_User_Name write F_User_Name;<br>    property Password: string read F_Password write F_Password;<br>    property PostQuery: string read F_PostQuery write F_PostQuery;<br>    property Referer: string read F_Referer write F_Referer;<br>    property MimeType: string read F_Mime_Type write F_Mime_Type;</font></p> <p><font face="Courier New">    property OnDoneFile: TOnDoneFileEvent read FDoneFile write FDoneFile;<br>    property OnDoneString: TOnDoneStringEvent read FDoneString write FDoneString;<br>  end;</font></p> <p><font face="Courier New">implementation</font></p> <p> </p> <p><font face="Courier New">{ THttpGet }</font></p> <p><font face="Courier New">procedure THttpGet.Abort;<br>begin<br>  if Assigned(F_GetURLThread) then<br>  begin<br>    F_GetURLThread.Terminate;<br>    F_GetURLThread.setResult(false);<br>  end;<br>end;</font></p> <p><font face="Courier New">constructor THttpGet.Create;<br>begin<br>  F_Accept_Types := '*/*';<br>  F_Agent := 'Nokia6610/1.0 (5.52) Profile/MIDP-1.0 Configuration/CLDC-1.02';<br>end;</font></p> <p><font face="Courier New">destructor THttpGet.Destroy;<br>begin</font></p> <p><font face="Courier New">end;</font></p> <p><font face="Courier New">procedure THttpGet.getFile;<br>var<br>  Msg: TMsg;<br>begin<br>  if not Assigned(F_GetURLThread) then<br>  begin<br>    F_GetURLThread := THTTPGetThread.Create(F_Accept_Types,F_Mime_Type, F_Agent, F_URL, F_File_Name, F_User_Name, F_Password, F_PostQuery, F_Referer, F_Binary_Data, F_Use_Cache, FProgress, true);<br>    F_GetURLThread.OnTerminate := ThreadDone;<br>    if F_Wait_Thread then<br>      while Assigned(F_GetURLThread) do<br>        while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do<br>        begin<br>          TranslateMessage(Msg);<br>          DispatchMessage(Msg);<br>        end;<br>  end<br>end;</font></p> <p><font face="Courier New">procedure THttpGet.GetString;<br>var<br>  Msg: TMsg;<br>begin<br>  if not Assigned(F_GetURLThread) then<br>  begin<br>    F_GetURLThread := THTTPGetThread.Create(F_Accept_Types,F_Mime_Type,F_Agent, F_URL, F_File_Name, F_User_Name, F_Password, F_PostQuery, F_Referer, F_Binary_Data, F_Use_Cache, FProgress, False);<br>    F_GetURLThread.OnTerminate := ThreadDone;<br>    if F_Wait_Thread then<br>      while Assigned(F_GetURLThread) do<br>        while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin<br>          TranslateMessage(Msg);<br>          DispatchMessage(Msg);<br>        end;<br>  end<br>end;</font></p> <p><font face="Courier New">procedure THttpGet.ThreadDone(Sender: TObject);<br>begin<br>  FResult := F_GetURLThread.getResult;<br>  if FResult then<br>    if F_GetURLThread.getToFile then begin<br>      if Assigned(FDoneFile) then FDoneFile(F_GetURLThread.getFileName, F_GetURLThread.getFileSize)<br>    end else<br>      if Assigned(FDoneString) then FDoneString(F_GetURLThread.getStringResult);</font></p> <p><font face="Courier New">    //end else if Assigned(FError) then FError(Self);<br>  F_GetURLThread := nil;<br>end;</font></p> <p><font face="Courier New">end.</font></p> <p> </p> <p><font face="Courier New">/** 紼嬪簭涓葷晫闈?/font></p> <p><font face="Courier New">*   浣滆?鍒樻槅 </font></p> <p><font face="Courier New">*   鏈鍚庝慨鏀規(guī)棩鏈?  2004-9-23 </font></p> <p><font face="Courier New">*   浠ヤ笂浠g爜鍏嶈垂,鑻ョ洿鎺ュ紩鐢ㄤ竴涓嬩唬鐮佽鍛婄煡,騫朵繚鐣欐娉ㄩ噴</font></p> <p><font face="Courier New">*   浣滀負(fù)涓鍚嶇▼搴忓憳搴旇鏈夋渶鍩烘湰鐨勮亴涓氶亾寰?/</font></p> <p><font face="Courier New">unit MainForm;</font></p> <p><font face="Courier New">interface</font></p> <p><font face="Courier New">uses<br>  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br>  Dialogs, StdCtrls, ExtCtrls, MyHttpGet;</font></p> <p><font face="Courier New">type<br>  TMain = class(TForm)<br>    Panel1: TPanel;<br>    Edit1: TEdit;<br>    Label1: TLabel;<br>    Panel2: TPanel;<br>    Panel3: TPanel;<br>    GroupBox1: TGroupBox;<br>    MeSend: TMemo;<br>    GroupBox2: TGroupBox;<br>    MeReceive: TMemo;<br>    Button1: TButton;<br>    CbSave: TCheckBox;<br>    Edit2: TEdit;<br>    Label2: TLabel;<br>    procedure Button1Click(Sender: TObject);<br>  private<br>    { Private declarations }<br>    procedure onGetString(Result: AnsiString);<br>    procedure onGetFile(FileName: string; FileSize: Integer);</font></p> <p><font face="Courier New">  public<br>    { Public declarations }<br>  end;</font></p> <p><font face="Courier New">var<br>  Main: TMain;</font></p> <p><font face="Courier New">implementation</font></p> <p><font face="Courier New">{$R *.dfm}</font></p> <p><br><font face="Courier New">procedure TMain.Button1Click(Sender: TObject);<br>var hg: THttpGet;<br>  strs: TStrings;<br>  i: Integer;<br>begin<br>  hg := nil;<br>  strs := nil;<br>  try<br>    strs := TStringList.Create;<br>    hg := THttpGet.Create;<br>    hg.WaitThread := false;<br>    hg.AcceptTypes := '*.*';</font></p> <p><font face="Courier New">    hg.Agent := 'Nokia6610/1.0 (5.52) Profile/MIDP-1.0 Configuration/CLDC-1.02';<br>    hg.BinaryData := false;<br>    hg.URL := 'Http://' + Edit1.Text;<br>    hg.UseCache := false;<br>    hg.FileName := 'provison.xml';<br>    hg.UserName := '';<br>    hg.Password := '';</font></p> <p><font face="Courier New">    for i := 0 to MeSend.Lines.Count - 1 do<br>      strs.Add(trim(MeSend.Lines[i]));</font></p> <p><font face="Courier New">    hg.PostQuery := strs.Text;<br>    hg.Referer := 'Http://' + Edit1.Text; //text/plain<br>    hg.MimeType := Edit2.Text;<br>    hg.OnDoneString := onGetString;<br>    hg.OnDoneFile := onGetFile;</font></p> <p><font face="Courier New">    hg.GetString;<br>  finally<br>    strs.Free;<br>    hg.Free;<br>  end;<br>end;</font></p> <p><br><font face="Courier New">procedure TMain.onGetFile(FileName: string; FileSize: Integer);<br>begin</font></p> <p><font face="Courier New">end;</font></p> <p><font face="Courier New">procedure TMain.onGetString(Result: AnsiString);<br>begin<br>  MeReceive.Lines.Text := Result;<br>end;</font></p> <p><font face="Courier New">end.</font></p><br><br><img src ="http://www.shnenglu.com/Khan/aggbug/2644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Khan/" target="_blank">Khan's Notebook</a> 2004-11-12 03:25 <a href="http://www.shnenglu.com/Khan/archive/2004/11/12/2644.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>姣忎釜鏈堥兘鏈夐偅涔堝嚑澶╄鍋跺績鐑?紿佺劧鎯沖仛涓涓帶鍒秏odem鎴栬卆dsl modem鍙戜紶鐪熺殑涓滆タhttp://www.shnenglu.com/Khan/archive/2004/11/09/2645.htmlKhan's NotebookKhan's NotebookTue, 09 Nov 2004 13:45:00 GMThttp://www.shnenglu.com/Khan/archive/2004/11/09/2645.htmlhttp://www.shnenglu.com/Khan/comments/2645.htmlhttp://www.shnenglu.com/Khan/archive/2004/11/09/2645.html#Feedback1http://www.shnenglu.com/Khan/comments/commentRss/2645.htmlhttp://www.shnenglu.com/Khan/services/trackbacks/2645.html
       鍘熷洜灝辯礌鍥犱負(fù)鎴戝閲屾湁涓閮ㄤ紶鐪熸満,鎴戞兂鎶婁粬褰撴墦鍗版満鐢?浠旂粏鍦ㄧ綉涓婃壘浜嗕竴涓?鍙戠幇娌℃湁浠涔堣祫鏂?鍙湁涓浜涜蔣浠舵垨鎺т歡.

        鎴戝彂瑾?瑕佽榪欎簺鎶婃妧鏈嫿鍦ㄦ墜閲岄タ姝?

        闈?鑳藉啓涓妸杞歡浜嗕笉璧峰晩,

        榪欎釜鍐欏畬浜嗕互鍚?鐓ф棫寮婧?鐓ф棫涓嶇敤絎笁鏂規(guī)帶浠舵垨class



]]>
鍏充簬delphi鐨刲og鐨刢lass宸茬粡瀹屾垚,涓濡傛棦寰鐨刼pen 浠?/title><link>http://www.shnenglu.com/Khan/archive/2004/11/09/2646.html</link><dc:creator>Khan's Notebook</dc:creator><author>Khan's Notebook</author><pubDate>Tue, 09 Nov 2004 11:10:00 GMT</pubDate><guid>http://www.shnenglu.com/Khan/archive/2004/11/09/2646.html</guid><wfw:comment>http://www.shnenglu.com/Khan/comments/2646.html</wfw:comment><comments>http://www.shnenglu.com/Khan/archive/2004/11/09/2646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Khan/comments/commentRss/2646.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Khan/services/trackbacks/2646.html</trackback:ping><description><![CDATA[delphi ,鏃ュ織class,涓寸晫鍖?鏂囦歡鎿嶄綔<img src="http://blog.codelphi.com/liukun966123/aggbug/28356.aspx" height="1" width="1"><br><br><br><p>濡傛灉浣犲紩鐢ㄦ垨鑰呬慨鏀逛互涓嬩唬鐮?璇蜂笉瑕佸幓鎺夋敞閲?榪欎釜娑夊強鍒頒竴涓▼搴忓憳鐨勮亴涓氶亾寰烽棶棰?/p><p>杞澆璇鋒敞鏄?/p><p>/** 鏈唬鐮佷負(fù)鏃ュ織class</p><p>*   浣滆?鍒樻槅 </p><p>*   鏈鍚庝慨鏀規(guī)棩鏈?  2004-9-23 </p><p>*   浠ヤ笂浠g爜鍏嶈垂,鑻ョ洿鎺ュ紩鐢ㄤ竴涓嬩唬鐮佽鍛婄煡,騫朵繚鐣欐娉ㄩ噴</p><p>*   浣滀負(fù)涓鍚嶇▼搴忓憳搴旇鏈夋渶鍩烘湰鐨勮亴涓氶亾寰?/</p><p>unit pushLog;</p><p>interface</p><p>uses classes, sysutils, windows;</p><p>var<br>  ThreadLock: TRTLCriticalSection; //涓寸晫鍖?/p><p><br>const PathDelim = '\';<br>  DriveDelim = ':';</p><p>type<br>  Tlog = class<br>  private<br>    //logfile: file;<br>    fileName: string;</p><p>    function dirExist(const DirName: string): boolean;<br>    function getDirName(const fileName: string): string;<br>    function LastDelimiter(const Delimiters, S: string): Integer;</p><p>    procedure createLogDir();</p><p><br>  public<br>    constructor Create(const filename: string);<br>    destructor Destroy(); override;</p><p>    procedure addLog(p: Pchar);<br>  end;</p><p>implementation</p><p><br>{ Tlog }</p><p>procedure Tlog.addLog(p: Pchar);<br>var log_Line: pchar;<br>  log_len: integer;<br>  handle: Thandle;<br>  des_Len: longword;<br>begin<br>  EnterCriticalSection(ThreadLock);<br>  log_Line := nil;<br>  handle := $0;<br>  des_Len := $0;<br>  try<br>    createLogDir;<br>    log_len := strlen(p);<br>    getmem(log_Line, log_len);<br>    strcopy(log_Line, p);</p><p>    handle := createfile(<br>      pchar(fileName), //鏂囦歡鍚?br>      GENERIC_READ or GENERIC_WRITE, //鏈熸湜瀛樺彇妯″紡 閫氱敤璇誨啓<br>      FILE_SHARE_READ or FILE_SHARE_WRITE, //鍏變韓妯″紡<br>      nil, //瀹氫箟鏂囦歡瀹夊叏鐗規(guī)х殑鎸囬拡錛堝墠鎻愶細鎿嶄綔緋葷粺鏀寔錛夈?br>      OPEN_ALWAYS, //鎵撳紑鍜屽垱寤烘枃浠舵柟寮忋?br>      FILE_ATTRIBUTE_NORMAL or FILE_FLAG_RANDOM_ACCESS, //瑕佹墦寮鏂囦歡鐨勬爣蹇楀拰灞炴э紙濡傦細闅愯棌錛岀郴緇熺瓑錛夈?br>      0); //妯℃澘鏂囦歡鍙ユ焺</p><p>    if handle <> INVALID_HANDLE_VALUE then begin<br>      SetFilePointer(handle, 0, nil, FILE_END);<br>      WriteFile(handle, log_Line^, log_len, des_Len, nil);</p><p>    end;<br>  finally<br>    CloseHandle(handle);<br>    freeMem(log_Line);<br>    LeaveCriticalSection(ThreadLock);<br>  end;<br>end;</p><p> </p><p>constructor Tlog.Create(const filename: string);<br>begin<br>  self.fileName := filename;<br>end;</p><p> </p><p><br>procedure Tlog.createLogDir;<br>var dir_Name: string;<br>begin<br>  dir_Name := getDirName(fileName) + '\log';<br>  if not DirExist(dir_Name) then begin //媯嫻嬫棩蹇楃洰褰曟槸鍚﹀瓨鍦?br>    mkdir(dir_Name);<br>  end;<br>end;</p><p> </p><p>destructor Tlog.Destroy;<br>begin<br>  inherited;<br>end;</p><p> </p><p>function Tlog.DirExist(const DirName: string): boolean;<br>var<br>  Handle: THandle;<br>  FindData: TWin32FindData;<br>begin<br>  result := false;<br>  Handle := FindFirstFile(PChar(DirName), FindData);<br>  if Handle <> INVALID_HANDLE_VALUE then begin<br>    FindClose(Handle);<br>    if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = $10 then begin<br>      result := true;<br>    end;<br>  end;<br>end;</p><p> </p><p>function Tlog.getDirName(const fileName: string): string;<br>var<br>  I: Integer;<br>begin<br>  I := LastDelimiter(':\', Filename);<br>  if (I > 1) and (FileName[I] = PathDelim) and (((FileName[I - 1] <> PathDelim) and (FileName[I - 1] <> DriveDelim)) or (ByteType(FileName, I - 1) = mbTrailByte)) then<br>    Dec(I);<br>  while (ByteType(FileName, I - 1) = mbTrailByte) and (I > 0) do<br>    Dec(I);<br>  Result := Copy(FileName, 1, I);<br>end;</p><p> </p><p> </p><p><br>function Tlog.LastDelimiter(const Delimiters, S: string): Integer;<br>var<br>  P: PChar;<br>begin<br>  Result := Length(S);<br>  P := PChar(Delimiters);<br>  while Result > 0 do<br>  begin<br>    if (S[Result] <> #0) and (StrScan(P, S[Result]) <> nil) then // 媯嫻嬫渶鍚庝竴涓瓧絎︽槸鍚︿負(fù) '\'鎴栬?:'<br>      if (ByteType(S, Result) = mbTrailByte) then<br>        Dec(Result)<br>      else<br>        Exit;<br>    Dec(Result);<br>  end;<br>end;</p><p> </p><p><br>initialization<br>  InitializeCriticalSection(ThreadLock);<br>finalization<br>  DeleteCriticalSection(ThreadLock);<br>end.<br></p><p> </p><p> </p><p>璋冪敤鏂規(guī)硶</p><p>procedure TMain.Button1Click(Sender: TObject);<br>var<br>  log: Tlog;<br>begin</p><p>  log := Tlog.Create(ExtractFileDir(Application.Exename) + '\' + 'aa.log');<br>  log.addLog(pchar('濂界殑' + #13#10));<br>  log.addLog(pchar('aaaaaaaaaaaaaaaaaaaa' + #13#10));<br>  log.Free;<br>end;</p><br><img src ="http://www.shnenglu.com/Khan/aggbug/2646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Khan/" target="_blank">Khan's Notebook</a> 2004-11-09 19:10 <a href="http://www.shnenglu.com/Khan/archive/2004/11/09/2646.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>浠婂ぉ紿佺劧鎯沖啓涓涓叧浜庢棩蹇楁枃浠剁殑class,鐢╬ascal,浠ュ墠鐢╦ava鍑犵畝鍗?pascal鐨勮繖鍧楀弽鑰屾病鏈夋帴瑙﹁繃http://www.shnenglu.com/Khan/archive/2004/11/08/2647.htmlKhan's NotebookKhan's NotebookMon, 08 Nov 2004 13:27:00 GMThttp://www.shnenglu.com/Khan/archive/2004/11/08/2647.htmlhttp://www.shnenglu.com/Khan/comments/2647.htmlhttp://www.shnenglu.com/Khan/archive/2004/11/08/2647.html#Feedback1http://www.shnenglu.com/Khan/comments/commentRss/2647.htmlhttp://www.shnenglu.com/Khan/services/trackbacks/2647.html

鏂囨湰鏂囦歡鏄敱鑻ュ共琛岀粍鎴愮殑錛岃嫢騫蹭釜瀛楃涓茬粍鎴愪竴琛岋紝涓琛岀殑緇撳熬鐢卞洖杞︽崲琛岀琛ㄧず銆傚鏋滃鏂囨湰鏂囦歡榪涜鎿嶄綔錛屽垯棣栧厛搴旈氳繃璋冪敤AssignFile榪? 紼嬪緩绔嬫枃浠跺彉閲忎笌澶栭儴鏂囦歡鐨勮仈緋伙紝騫朵笖浣跨敤Reset鎴朢eWrite鎴朅ppend鏂規(guī)硶鎵撳紑銆傜敱浜庢枃鏈枃浠舵槸浠ヨ涓哄崟浣嶈繘琛岃鍐欐搷浣滅殑錛屽茍涓旀瘡涓琛岀殑闀? 搴︿笉涓瀹氱浉鍚岋紝鎵浠ヤ笉鑳借綆楀嚭鎸囧畾琛屽湪鏂囦歡涓殑鍑嗙‘浣嶇疆錛屽洜姝ゅ浜庢枃浠跺彧鑳介『搴忕殑璇誨啓銆傝瀵規(guī)枃浠惰繘琛岃鍐欐搷浣滐紝蹇呴』鐩稿簲鐨勫鏂囦歡榪涜浠ヨ鎴栧啓鐨勬柟寮忔墦寮錛? 涔熷氨鏄涓涓枃鏈枃浠跺彧鑳藉崟鐙繘琛岃鎴栧啓鐨勬搷浣滐紝鑰屼笉鑳藉悓鏃惰繘琛屻?/p>

1銆?浠ユ坊鍔犳柟寮忔墦寮鏂囦歡(Append)

閫氳繃璋冪敤鍑芥暟Append鍙墦寮涓涓凡緇忓瓨鍦ㄧ殑鏂囦歡浠ヤ究鍦ㄦ枃浠舵湯灝炬坊鍔犳枃鏈傚鏋滃湪鏂囦歡鏈鍚庣殑128涓瓧鑺傚潡涓紝瀛樺湪瀛楃銆坈trl銆?銆坺銆夛紙ASCII26錛夛紝閭d箞鏂囦歡灝嗗湪瀛楄妭澶勬彃鍏ワ紝騫朵笖瑕嗙洊璇ュ瓧絎︺?/p>

Append榪囩▼鐨勫0鏄庡涓嬶細
procedure Append(var F:text);

鍏? 涓璅鏄竴涓換鎰忔枃浠剁被鍨嬬殑鍙橀噺錛屽茍涓斿繀欏誨悓鐢ˋssignFile鍑芥暟鎵撳紑鐨勫閮ㄦ枃浠剁浉鑱旂郴錛屽鏋滄寚瀹氱殑鏂囦歡涓嶅瓨鍦紝鍒欎細浜х敓閿欒錛屽鏋滄寚瀹氱殑鏂囦歡宸茬粡鎵? 寮錛屽垯鍏堝叧闂啀閲嶆柊鎵撳紑銆傚綋鍓嶆枃浠剁殑浣嶇疆璁劇疆鍦ㄦ枃浠舵湯灝俱傚鏋滃垎閰嶇粰F鐨勬槸涓涓┖鍚嶅瓧錛屽垯鍦ㄨ皟鐢ˋppend鍑芥暟鍚庯紝鏂囦歡鍙橀噺錛團錛夊皢鍚屽皢鍚屾爣鍑嗚緭鍑烘枃浠? 寤虹珛鑱旂郴銆?/p>


2 銆佹枃鏈枃浠剁殑璇誨彇鍜屽啓鍏?/p>

鏂囨湰鏂囦歡閫氳繃璋冪敤榪囩▼Reset鍚庝互鍙鏂瑰紡鎵撳紑鍚庯紝灝卞彲浠ヤ嬌鐢≧ead鎴朢eadln榪囩▼鏉ヨ鍙栨枃浠舵暟鎹簡銆傛枃鏈枃浠墮氳繃璋冪敤Write鎴朩riteln榪囩▼鏉ユ墦寮涓鏂囦歡鍚庡氨鍙互浣跨敤鎴栬繃紼嬫潵鍐欏叆鏁版嵁銆?/p>

(1) 鐢≧ead榪囩▼璇誨彇鏁版嵁

閫氳繃璋冪敤Read榪囩▼鍙互浠庢枃鏈枃浠朵腑璇誨彇鎴栨暟瀛椼傚叾澹版槑濡備笅錛?br>Procedure Read([var F:text;]v1 [,v2,鈥?vn,]);

鍏? 涓璅鏄竴涓枃浠跺彉閲忥紝v1 ,v2,鈥?vn鐢ㄤ簬瀛樺偍璇誨彇鐨勬暟鎹紝鍏跺繀欏諱負(fù)鐩稿悓鐨勭被鍨嬨傚綋v1 ,v2,鈥?vn瀹氫箟涓哄瓧絎︿覆鍨嬫垨瀛楃鍨嬪彉閲忔椂錛屽垯Read榪囩▼灝嗘寜鐓у畾涔夌殑闀垮害璇誨彇瀛楃銆傚綋v1 ,v2,鈥?vn瀹氫箟涓烘暣鏁版垨瀹炴暟鍙橀噺鏃訛紝鍒橰ead榪囩▼灝嗕互絀烘牸浣滀負(fù)鍒嗛殧絎︼紝濡傛灉鍦ㄦ暟瀛椾腑鍑虹幇閫楀彿銆佸垎鍙鋒垨鍏朵粬瀛楃灝嗕駭鐢熷紓甯搞?/p>

(2) 鐢≧eadln榪囩▼璇誨彇鏁版嵁

閫氳繃璋冪敤Readln 榪囩▼鍙互浠庢枃鏈枃浠朵腑璇誨彇瀛楃涓層佸瓧絎︽垨鏁板瓧錛岀洿鍒頒竴琛岀粨鏉熴傚叾澹版槑濡備笅錛?br>Procedure readln([var F:text;]v1 [,v2 ,鈥);

鍏朵腑F鏄竴涓枃浠跺彉閲忥紝v1 ,v2,鈥?vn鐢ㄤ簬瀛樺偍璇誨彇鐨勬暟鎹?/p>

(3) 鐢╓rite榪囩▼鍐欏叆鏁版嵁

閫氳繃璋冪敤Write榪囩▼鍙互鍚戞枃浠朵腑鍐欏叆鏁版嵁銆傚叾澹版槑濡備笅錛?br>Procedure Write([var F:text;]p1[,p2,鈥);

鍏朵腑F鏄竴涓枃浠跺彉閲忥紝p1 ,p2,鈥?pn鐢ㄤ簬瀛樺偍鍐欏叆鐨勬暟鎹?/p>


(4) Writeln鐢ㄨ繃紼嬪啓鍏ユ暟鎹?/p>

閫氳繃璋冪敤Writeln榪囩▼鍙互鍚戞枃浠朵腑鍐欏叆涓琛屾暟鎹紝騫跺湪緇撳熬澶勮緭鍏ュ洖杞︾銆傚0鏄庡涓嬶細
Procedure Writeln([var F:text;]P1[,P2,鈥):


3銆?鏂囦歡鐨勫熀鏈搷浣?/p>

瀵規(guī)枃鏈枃浠惰繘琛屾搷浣滅殑鍩烘湰鍑芥暟涓庤繃紼嬭琛細

鏂規(guī)硶                                                                                  璇存槑
Procedure AssignPrn(var F:text);                                       寤虹珛鏂囨湰鏂囦歡鍚屾墦鍗版満鐨勮仈緋?nbsp;
Function Eoln(var F:text):Boolean;                                    媯嫻嬫枃浠舵寚閽堟槸鍚︽寚鍚戣灝?nbsp;
Procedure Flush(var F:text);                                             娓呯┖浠ヨ緭鍑烘柟寮忥紙ReWite鎴朅ppend錛夋墦寮鐨勬枃浠剁紦鍐插尯錛屼互紜繚鍐欏叆鐨勬枃浠跺瓧絎﹂兘琚啓鍏ュ閮ㄦ枃浠?nbsp;
Function SeekEof(var F:text): boolean;                             榪斿洖鏂囦歡灝劇姸鎬?nbsp;
Function SeekEoln(var F:text):boolean;                             榪斿洖鏂囦歡琛屽熬鐘舵?nbsp;
Procedure SetTextBuf(var F :text;var buf [;size:integer]);   璁劇疆鏂囦歡緙撳啿鍖?/p>


]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美黄色aa电影| 91久久精品国产| 欧美怡红院视频| 国产日韩欧美夫妻视频在线观看| 性欧美xxxx大乳国产app| 亚洲欧美综合另类中字| 国内精品一区二区三区| 欧美成人午夜77777| 欧美黄色精品| 亚洲欧美日本日韩| 欧美一区亚洲二区| 亚洲乱码久久| 亚洲专区在线| 亚洲激情网站免费观看| 夜夜嗨av一区二区三区免费区| 国产精品女主播| 欧美成人按摩| 国产精品美女久久久| 麻豆91精品91久久久的内涵| 欧美日韩国产91| 久久久久se| 欧美日韩视频不卡| 另类专区欧美制服同性| 欧美日韩一区二区免费视频| 久久久久欧美| 国产精品xxx在线观看www| 久久综合亚州| 国产精品视频免费观看www| 欧美激情久久久久| 国产精品女主播一区二区三区| 开元免费观看欧美电视剧网站| 欧美日韩三级视频| 免费在线看一区| 国产一区二区三区久久久久久久久 | 亚洲综合电影| aa级大片欧美| 久热精品视频| 欧美一区网站| 欧美日韩一区二区精品| 欧美成人性生活| 国内精品久久久久影院色 | 香蕉尹人综合在线观看| 欧美国产另类| 欧美高清视频一区二区| 国产一区二区三区黄视频| 一本色道久久综合亚洲精品高清| 久久深夜福利免费观看| 午夜视频一区| 国产精品久久午夜| 99pao成人国产永久免费视频| 亚洲国产精品999| 久久精选视频| 久久天堂精品| 国产一区二区三区精品久久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲精品九九| 欧美精品亚洲| 亚洲日本成人在线观看| 日韩视频在线你懂得| 欧美国产精品v| 亚洲风情亚aⅴ在线发布| 在线观看日韩精品| 久久久久久久久综合| 久久九九久久九九| 国产在线精品一区二区中文| 性欧美大战久久久久久久免费观看 | 一个人看的www久久| 欧美激情a∨在线视频播放| 欧美福利电影在线观看| 91久久久久久| 欧美乱大交xxxxx| 一区二区福利| 欧美一级欧美一级在线播放| 国产农村妇女毛片精品久久麻豆 | 国产精品99久久久久久久久| 亚洲欧美日韩精品久久| 国产三级精品在线不卡| 久久精品在线播放| 亚洲第一精品夜夜躁人人爽| 亚洲美女在线观看| 国产精品video| 蜜臀久久99精品久久久画质超高清 | 欧美日本三区| 亚洲女同在线| 欧美va天堂va视频va在线| 亚洲美女黄色片| 国产精品入口日韩视频大尺度| 欧美一区二区三区啪啪| 欧美国产在线观看| 亚洲午夜日本在线观看| 国产毛片一区| 免费欧美在线| 亚洲午夜一二三区视频| 免费成人av在线| 亚洲伊人色欲综合网| 国产一区二区在线观看免费播放| 久久综合导航| 亚洲影视在线| 亚洲激情另类| 久久香蕉国产线看观看av| 亚洲精品中文字幕有码专区| 国产精品一区免费视频| 老司机午夜精品视频在线观看| 日韩视频免费观看| 另类专区欧美制服同性| 亚洲一区二区三区在线| 亚洲第一搞黄网站| 国产精品久久97| 久久综合狠狠综合久久激情| 亚洲视频在线观看三级| 日韩午夜在线电影| 亚洲欧美国产制服动漫| 黄色影院成人| 国产精品日韩在线播放| 欧美精品免费播放| 久久久不卡网国产精品一区| 亚洲视频一区二区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久综合久久综合久久| 亚洲欧美激情一区| 亚洲经典自拍| 欧美a级一区二区| 久久久99精品免费观看不卡| 亚洲香蕉网站| 日韩视频免费大全中文字幕| 在线成人av.com| 国内精品视频666| 国产日韩欧美一二三区| 国产精品久久久久av| 欧美日韩精品免费观看视一区二区 | 亚洲美女黄色| 亚洲激情网站免费观看| 欧美激情精品久久久久久变态| 久久亚洲国产成人| 久久九九久久九九| 久久九九精品| 久久久在线视频| 久久理论片午夜琪琪电影网| 欧美一区成人| 欧美专区一区二区三区| 午夜亚洲性色视频| 欧美一区视频在线| 久久精品免费| 久久一区中文字幕| 你懂的视频欧美| 欧美国产一区在线| 亚洲国内高清视频| 日韩视频免费观看| 亚洲素人在线| 久久成人综合网| 欧美专区亚洲专区| 久久中文久久字幕| 欧美福利电影在线观看| 欧美日韩国语| 国产精品一二三四| 国产一区二区福利| 亚洲国产精品久久久久秋霞蜜臀| 亚洲国产精品ⅴa在线观看 | 国产精品h在线观看| 国产精品青草久久久久福利99| 国产精品人人做人人爽| 狠狠久久婷婷| 一本色道久久综合狠狠躁篇怎么玩 | 欧美日韩亚洲综合在线| 国产精品亚洲产品| 在线观看日韩国产| 宅男噜噜噜66一区二区| 亚洲欧美日韩在线| 另类成人小视频在线| 亚洲精品永久免费| 久久成人资源| 欧美日韩国产欧| 国产欧美一区二区三区久久| 亚洲大片av| 亚洲综合精品一区二区| 亚洲精品国产精品国产自| 这里只有精品视频在线| 久久国产精品久久久久久| 鲁大师成人一区二区三区| 野花国产精品入口| 久久久噜噜噜久久人人看| 欧美视频观看一区| 精品99视频| 午夜精品久久| 亚洲国产另类久久久精品极度| 亚洲一区影院| 欧美成人有码| 国产午夜精品久久久| 日韩一区二区久久| 久久综合伊人| 午夜精品久久久久99热蜜桃导演| 欧美激情一区二区三区高清视频| 国产精品视频大全| 夜夜狂射影院欧美极品| 久久躁狠狠躁夜夜爽| 99re6这里只有精品| 免费在线观看日韩欧美| 国产日韩精品久久久| 亚洲美女尤物影院| 美日韩在线观看|