rt:
由于前台是用d5开发的,现在买了个短信猫必须要用d7开发而且是前台是非阻塞的,后台的服务器用线程阻塞的,两者能通讯吗?
还有线程阻塞怎么写啊?
我对这个东西不太了解啊

解决方案 »

  1.   

    现在非阻塞的差不多了,就是如果用线程阻塞,线程怎么写啊;?
    我看了一下d7的internet下面的chat聊天程序就把它的线程代码搬过来不知道行不行啊?//------------- TClientDataThread impl -----------------------------------------
    constructor TClientDataThread.Create(CreateSuspended: Boolean);
    begin
      inherited Create(CreateSuspended);
      FreeOnTerminate := true;
      ListBuffer := TStringList.Create;
    end;procedure TClientDataThread.Terminate;
    begin
      ListBuffer.Free;
      inherited;
    end;procedure TClientDataThread.Execute;
    begin
      Synchronize(synchAddDataToControl);
    end;procedure TClientDataThread.synchAddDataToControl;
    begin
     TargetList.AddStrings(ListBuffer);
    end;
    //------------- end TClientDataThread impl -------------------------------------
      

  2.   

    接受客户端的消息代码:
    procedure TForm1.TcpServer1Accept(Sender: TObject;
      ClientSocket: TCustomIpClient);
    var
      s: string;
      DataThread: TClientDataThread;
    begin
      // create thread
      DataThread:= TClientDataThread.Create(true);
      // set the TagetList to the gui list that you
      // with to synch with.
      DataThread.TargetList := memRecv.lines;  // Load the Threads ListBuffer
      {DataThread.ListBuffer.Add('*** Connection Accepted ***');
      DataThread.ListBuffer.Add('Remote Host: ' + ClientSocket.LookupHostName(ClientSocket.RemoteHost) +
       ' (' + ClientSocket.RemoteHost + ')');
      DataThread.ListBuffer.Add('===== Begin message =====');}
      s := ClientSocket.Receiveln;
      while s <> '' do
      begin
        DataThread.ListBuffer.Add(s);
        s := ClientSocket.Receiveln;
      end;
     // DataThread.ListBuffer.Add('===== End of message =====');  // Call Resume which will execute and synch the
      // ListBuffer with the TargetList
      DataThread.Resume;end;
    这样是不是多线程的,当有多个客户端发送消息时,是不是每个都有一个线程会话?
    搞不太清楚,请高手指点一下?
      

  3.   

    server用tidtcpserver不就行了,用阻塞模式,在execute 事件内编写代码。比如:procedure TServerMain.TCPServerExecute(AThread: TIdPeerThread);
    var
      Cmd               : string;
      msg               : TSERVER_CTRL_MSG;
    begin
      try
        Cmd := AThread.Connection.ReadLn(#$A); //读取命令
        zeromemory(@msg, sizeOf(TSERVER_CTRL_MSG));    if Uppercase(cmd) = Uppercase('BEGIN') then
        begin
          WriteLn('send the compressor''s output format to the client as the decompressor''s input format');
          StrCat(@msg.strCommand, 'Set Bitmap Info');
          copyMemory(@msg.strContent, Self.m_pOutInfo, sizeOf(TBitmapInfo));
          msg.nContentUsedByte := sizeOf(TBitmapInfo);
          //Socket.SendBuf(msg, sizeOf(TServer_CTRL_MSG));
          AThread.Connection.WriteBuffer(msg, sizeOf(TServer_CTRL_MSG));//发送到client
          Exit;
        end;
      

  4.   

    使用idtcpserver组件就没有问题的,研究一下就可以了