Delphi创建子线程的两种参数格式

//第一种:传指针

  TParam=record
    TrdId:integer;
    Sckt:TSocket;
  end;

  

var

  Param:^TParam;

 

    new(Param);
      Param^.TrdId:=ThreadCount;
      Param^.Sckt:=s;
      hThread:=CreateThread(nil,0,@ChildThrd,Param,0,ThreadID); //创建childthrd子线程
      if hThread=0 then
      begin
        Writeln('CreateThread() Fail');
      end
      else
      begin
        Inc(ThreadCount);

 

//子线程:

function ChildThrd(p:Pointer):LongInt;stdcall;
var
  PkLen:integer;
  ThreadId:integer;
  ASocket:TSocket;
  Temp:TStringList;
  buf:array[0..1024] of char;
  sendstr,cmd:string;
  Handle,ICHandle,ClinicHandle:integer;
  m:Double;
  bSend:Boolean;
begin
  try
  while true do
  begin
    bSend:=True;
    Result:=0;
    ThreadId:=TParam(p^).TrdId;
    ASocket:=TParam(p^).Sckt;
    PkLen:=0;

    FillChar(buf,SizeOf(buf),0);
    PkLen:=Recv(ASocket,buf,SizeOf(buf),0);  //接收数据
    cmd :=StrPas(buf);

    if PkLen>0 then
    begin
      Form3.Memo1.Lines.Append(cmd);
    end;
  end;
  finally
    //CloseSocket(ASocket); //关闭socket
    //Dispose(p);
  end;
end;

 

//第二种格式:传地址

  s,ns:TSocket;//type:u_int|integer;

  pktlen:integer;
  server:TSockAddr;//tpye:sockaddr_in
  client:PSockAddr;//type:^sockaddr_in
  namelen:PInteger;//type:^Integer;
  ThreadID:DWORD;

 

CreateThread(nil,0,@SocketWorkThread,Pointer(ns),0,ThreadID);

 

procedure SocketWorkThread(ns:TSocket); stdcall;  //stdcall 是必须的,否则接收不到参数
var
  recvbuf,sendbuf:array[0..1025] of char;
begin
  try
    While True do
    begin
      pktlen:= recv(ns,recvbuf,1024,0);  //接收数据
      if pktlen<1 then  //如果返回值小于1说明连接被断开或者错误
      begin
        Writeln(ID:+IntToHex(ns,2)+ Exit.);
        exit;
      end;
      StrCopy(sendbuf,#13#10Welcome.#13#10);
      send(ns,sendbuf,StrLen(sendbuf),0);  //发送回应
    end;
  except
    Writeln(SocketWorkThread error.);
    exit;
  end;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值