我如果纯粹用SOCKET时,没有任何问题,但放进线程就出现问题了,源码如下
Function ThreadProc(lpParameter:Pointer):DWORD;stdcall;
var
  Socket: TCustomWinSocket;
  MyBuffer:array[0..10000] of byte;{设置接受缓冲区}
  MyRecevicelength:integer;
  S:string;
  MyBmp:TBitmap;
  i:integer;
  stringtemp:string;
  MySize:Longint;
  MyStream:   TMemorystream;   {内存流对象}
begin       MyStream   :=   TMemorystream.Create;
       MyReceviceLength   :=   socket.ReceiveLength ;   {读出包长度}
         if  MyReceviceLength > 0 then
          begin
          Socket.ReceiveBuf(MyBuffer,   MyReceviceLength);   {接收数据包并读入缓冲区内}
         MyStream.Write(MyBuffer,   MyReceviceLength);   {将数据写入流中}
          MyStream.Position   :=   0;
         while i<10 do
         begin
           stringtemp:=stringtemp+inttostr(MyBuffer[i]);
           i:=i+1;
         end;
         showmessage(stringtemp);
         end;
end;
procedure TForm1.ServerSocket2ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  ThreadHandle: THandle;
  TheThread: DWORD;
begin
  ThreadHandle:=0;
  try
  ThreadHandle:=createthread(nil,0,@ThreadProc,nil,0,TheThread);
  finally
  if ThreadHandle<>0 then closehandle(ThreadHandle);
  end;
end;

解决方案 »

  1.   


    //在Form1窗体里
    //在uses后type前设置一个const
    const
       WM_THREADMSG = WM_USER+211;
    //在public下写个
      procedure WMGetThreadMSG(var Message:TMsg); message WM_THREADMSG;     //线程消息procedure TForm1.WMGetThreadMSG(var Message: TMsg);
    var
      Socket: TCustomWinSocket;
      MyBuffer:array[0..10000] of byte;{设置接受缓冲区}
      MyRecevicelength:integer;
      S:string;
      MyBmp:TBitmap;
      i:integer;
      stringtemp:string;
      MySize:Longint;
      MyStream:   TMemorystream;   {内存流对象}
    begin
      MyStream   :=   TMemorystream.Create;
      MyReceviceLength   :=   socket.ReceiveLength ;   {读出包长度}
      if  MyReceviceLength > 0 then
      begin
        Socket.ReceiveBuf(MyBuffer,   MyReceviceLength);   {接收数据包并读入缓冲区内}
        MyStream.Write(MyBuffer,   MyReceviceLength);   {将数据写入流中}
        MyStream.Position   :=   0;
        while i<10 do
        begin
          stringtemp:=stringtemp+inttostr(MyBuffer[i]);
          i:=i+1;
        end;
        showmessage(stringtemp);
      end;
    end;procedure TForm1.ServerSocket2ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      ThreadHandle: THandle;
      TheThread: DWORD;
    begin
      ThreadHandle:=0;
      try
        ThreadHandle:=createthread(nil,0,@ThreadProc,nil,0,TheThread);
      finally
        if ThreadHandle<>0 then closehandle(ThreadHandle);
      end;
    end;----------------------------------
    Function ThreadProc(lpParameter:Pointer):DWORD;stdcall;
    begin
      WM_THREADMSG;
    end;
    ================================================
    大概就是这样
      

  2.   

    Function ThreadProc(lpParameter:Pointer):DWORD;stdcall;
    begin
      WM_THREADMSG;
    end;这报错,
      

  3.   

    PostMessage(form1.Handle,Cardinal(WM_THREADMSG),4,3);我用这个发送消息这地方是没事了,可又报一开始 的那个错误,MyReceviceLength   :=   socket.ReceiveLength ;   {读出包长度}
    在这报错
      

  4.   

    socket 你是自己定义的  是不是应该像MyStream 一样构造一下?