以下片段是我一个P2P程序里的例子,供参考!其中HWin是响应消息的窗口handle,WM开头的是自己定义的消息。
procedure TClientMsgThread.Execute;
var AMsg: MSG;
AGet: TGetDataThread;
begin
DoConnect; // 连接
if not Connected then // 连接失败,则清除管理对象的记录
begin
RmtMan.Buffer[RmtId].ThreadMsg := nil;
Exit;
end;
AGet := TGetDataThread.Create(RmtId, HWin, Sock, Self); // 创建数据接收线程
AGet.Resume;
PostMessage(HWin, WM_CONNECTED, RmtId, ctClient); // 通知主窗口连接成功
while not Terminated do
begin
GetMessage(AMsg, 0, 0, 0); // 取消息,没消息时不会返回,线程停止执行
case AMsg.message of // 有消息则处理
WM_DISCONNECT:
begin
AGet.Terminate; // 先通知数据接收线程结束,它会回送消息WM_TERMINATE
AGet.Resume;
end;
WM_SENDSTRS: DoSendStrs;
WM_SENDBUFFER: DoSendBuffer;
WM_RESUMEGET: AGet.Resume;
WM_TERMINATE: Terminate;
WM_ERRORONGET:
begin
PostMessage(HWin, WM_NETERROR, RmtId, eSendData); // 接收数据出现错误
Terminate;
end;
end;
end;
PostMessage(HWin, WM_DISCONNECTED, RmtId, ctClient); // 通知窗口连接已经断开
RmtMan.Buffer[RmtId].ThreadMsg := nil;
Sock.CloseSocket;
end;