我在进行Socket通信时
设置ClientSocket通信方式为ctBlocking
使用一个线程来不断地读取数据信息
procedure TRecThread.Execute;
var command:String;
begin
  while (true) do
  begin
    command := '';
    if (CSocket.Socket.ReceiveLength <> 0) then
      command := CSocket.Socket.ReceiveText();
    if (Length(trim(command)) <> 0) then
      parseMessage(command);
    sleep(100);
  end;
end;
然而,在其他时候,我对CSocket操作的时候,会导致程序不动了,直到CSocket收到一条消息,才会继续运行?在Java中有对对象加锁的方法
synchronized(CSocket){}
这样执行,不知道在Delphi中是如何处理的???

解决方案 »

  1.   

    delphi也一样
    他使用synchronize方法处理
      

  2.   

    delphi中只是对方法同步,
    不知道如何对某个对象同步??
    比如
    a线程在使用CSocket前,将其加锁,b线程只有等待a线程使用完CSocket,并释放这个锁,他才能使用CSocket.
      

  3.   

    procedure TRecThread.Execute;
    var command:String;
    begin
      while (true) do
      begin
        command := '';
        if (CSocket.Socket.ReceiveLength <> 0) then
          command := CSocket.Socket.ReceiveText();
        if (Length(trim(command)) <> 0) then
          parseMessage(command);
        sleep(100);
      end;
    end;改为:
    procedure TRecThread.Execute;
    begin
      synchronize(ReceiveMsg);
    end;procedure TRecThread.ReceiveMsg()
    var
      command:String;
    begin
      while (true) do
      begin
        command := '';
        if (CSocket.Socket.ReceiveLength <> 0) then
          command := CSocket.Socket.ReceiveText();
        if (Length(trim(command)) <> 0) then
          parseMessage(command);
        sleep(100);
      end;
    end;
      

  4.   

    < delphi中只是对方法同步,
    < 不知道如何对某个对象同步??
    < 比如
    < a线程在使用CSocket前,将其加锁,b线程只有等待a线程使用完CSocket,并释放这个锁,他才< 能使用CSocket.如果一定要同步的话。
    你可以使用API的临界对象(或者信号对象)啊?