关于一个HOOK并使用多线程的问题。

summerlove 2009-10-22 11:42:27
我的线程类
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
public
HttpStr:string;
HttpLen:DWORD;
socket:integer;
time:Integer;
end;

procedure TMyThread.Execute;
var
i : integer;
begin
inherited;
OnTerminate := Form1.ThreadDone;//保证VCL安全
FreeOnTerminate := true;
HttpData.str:=HttpStr;
HttpData.len:=HttpLen;
HttpData.threadID:=ThreadID;
HttpData.socket:=socket;
HttpData.time:=time;
end;

主线程如下:
HOOK_RECV
function myWSARecv(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD;
var lpNumberOfBytesRecvd: DWORD; var lpFlags: DWORD; lpOverlapped: LPWSAOVERLAPPED;
lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
var
ThreadID:DWord;
MyThread:TMyThread;
RecvBuf:array of char;
begin
myWSARecv := oldWSARecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionROUTINE);
MyThread:=TMyThread.Create(True); //创建线程 且挂起
MyThread.HttpStr:=StrPas(lpBuffers.buf); //获取的数据包给线程
MyThread.HttpLen:=lpNumberOfBytesRecvd; //数据长度
MyThread.socket:=s; //套接字
MyThread.time:=GetTickCount; //线程创建点
MyThread.Resume; //激活线程
end;

子线程结束时调用的VCL输出事件
procedure TForm1.ThreadDone(sender: TObject);
begin
mmo1.Lines.Add('[=================Start=====================]');
mmo1.Lines.Add(Format('线程创建点:[%12d] 输出时间:[%12d] 线程ID:[%8d] SOCKET:[%5d] 数据长度:[%5d]',
[HttpData.time,GetTickCount,HttpData.threadID,HttpData.socket,HttpData.len]));
mmo1.Lines.Add(HttpData.str);
mmo1.Lines.Add('[==================End=====================]');
mmo1.Lines.Add('');
end;

输出结果:

[=================Start=====================]
线程创建点:[ 4283859] 输出时间:[ 4283953] 线程ID:[ 2488] SOCKET:[ 1144] 数据长度:[ 1]
@麶EXjv0梡v<梡vx?
[==================End=====================]

[=================Start=====================]
线程创建点:[ 4283859] 输出时间:[ 4283968] 线程ID:[ 2488] SOCKET:[ 1144] 数据长度:[ 1]
@麶EXjv0梡v<梡vx?
[==================End=====================]

[=================Start=====================]
线程创建点:[ 4283859] 输出时间:[ 4283984] 线程ID:[ 2488] SOCKET:[ 1144] 数据长度:[ 1]
@麶EXjv0梡v<梡vx?
[==================End=====================]

[=================Start=====================]
线程创建点:[ 4283859] 输出时间:[ 4284015] 线程ID:[ 2488] SOCKET:[ 1144] 数据长度:[ 1]
@麶EXjv0梡v<梡vx?
[==================End=====================]

问:1、为什么输出的这4条,结果显示的线程ID、SOCKET、线程创建点都是一样的。
2、如何避免这类问题的出现。
...全文
122 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧