多線程通信問題 |
答題得分者是:Kingron
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
|
lusm
一般會員 發表:0 回覆:3 積分:0 註冊:2007-02-17 發送簡訊給我 |
------
呵呵 主页 http://www.blogjava.net/lusm/ |
Kingron
中階會員 發表:1 回覆:51 積分:60 註冊:2005-09-14 發送簡訊給我 |
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
|
Kingron
中階會員 發表:1 回覆:51 積分:60 註冊:2005-09-14 發送簡訊給我 |
It's me. 谢谢你的支持。
下面是一个简单的Demo,服务端的演示,你可以用Telnet连接100端口来测试,你也可以把PostMessage换成SendMessage,但这样会阻塞: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdTCPServer, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls; const CM_TCP_CONNECTED = WM_USER $100; CM_TCP_COMMAND_A = WM_USER $101; CM_TCP_DISCONNECT = WM_USER $102; type TForm1 = class(TForm) idtcpclnt1: TIdTCPClient; idtcpsrvr1: TIdTCPServer; mmo1: TMemo; btn1: TButton; procedure idtcpsrvr1Connect(AThread: TIdPeerThread); procedure idtcpsrvr1Execute(AThread: TIdPeerThread); private { Private declarations } procedure CMTcpConnected(var Msg: TMessage); message CM_TCP_CONNECTED; procedure CMTcpCommandA(var Msg: TMessage); message CM_TCP_COMMAND_A; procedure CMTcpDisconnect(var Msg: TMessage); message CM_TCP_DISCONNECT; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.CMTcpCommandA(var Msg: TMessage); begin mmo1.Lines.Add(PChar(Msg.WParam)); FreeMemory(PChar(Msg.WParam)); end; procedure TForm1.CMTcpConnected(var Msg: TMessage); begin mmo1.Lines.Add(PChar(Msg.WParam)); FreeMem(PChar(Msg.WParam)); end; procedure TForm1.CMTcpDisconnect(var Msg: TMessage); begin end; procedure TForm1.idtcpsrvr1Connect(AThread: TIdPeerThread); var P : PChar; begin GetMem(P, 1024); StrPCopy(P, 'Client connect: ' AThread.Connection.Socket.Binding.PeerIP IntToStr(AThread.Connection.Socket.Binding.Port)); PostMessage(Handle, CM_TCP_CONNECTED, Integer(P), 0); end; procedure TForm1.idtcpsrvr1Execute(AThread: TIdPeerThread); var Buffer: string; Line: string; P : PChar; begin while AThread.Connection.Connected and not AThread.Terminated do begin Line := AThread.Connection.ReadLn(#13#10); if Line = 'commanda' then begin p := GetMemory(Length(Buffer) 1); StrPCopy(p, Buffer); PostMessage(Handle, CM_TCP_COMMAND_A, Integer(p), 0); AThread.Connection.WriteLn('Command A recived'); end else Buffer := Buffer Line; end; end; end. ===================引 用 文 章=================== 能不能给个Demo啊? 另,你是超级猛料CHM的作者? 我买过这个CHM呢。 ===================引 用 文 章=================== 在你的通信线程当中,发送自定义的消息给界面就OK。
------
超级猛料:http://kingron.delphibbs.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |