俺一直搞的是java,初写dephi程序。但不知,dephi的线程同步怎么做。 在java里用关键字synchronized就搞定的。dephi是否也有同类方法,还望高手赐教。以下是我定义的一个对象。 我希望TMsgList同步,一个线程在putMsg的时候,其它线程不能执行removeMsg,   TMsgList = class(TStringList)
     //------------------消息队列函数-------------------------------------
     procedure putMsg(sequence:LongInt;var bs:array of char;buffsize:integer);
     procedure removeMsg(sequence:LongInt);     
  end;

解决方案 »

  1.   

    很多方法,给你一个事件方法unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        Button5: TButton;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure Button5Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      EventHandle: THandle; {事件句柄}
      ThreadHandle: THandle; {线程句柄}
    implementation{$R *.DFM}function ThreadFunction(Info: Pointer): Integer; stdcall;
    var
      FormDC: HDC;
      Counter: Integer;
      CounterStr: string;
      ObjRtn: Integer;
    begin
      ObjRtn := WaitForSingleObject(EventHandle, INFINITE);
      FormDC := GetDC(Form1.Handle);
      for Counter := 1 to 100000 do
      begin
        CounterStr := IntToStr(Counter);
        TextOut(FormDC, 10, 10, PChar(CounterStr), Length(CounterStr));
        Application.ProcessMessages;
        ObjRtn := WaitForSingleObject(EventHandle, INFINITE);
      end;
      ReleaseDC(Form1.Handle, FormDC);
      ExitThread(4);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      ThreadID: Dword;
    begin
      ThreadHandle := CreateThread(nil, 0, @ThreadFunction, nil, 0, ThreadId);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      SetEvent(EventHandle);
      Label1.Caption := 'Event is signaled';
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
      ResetEvent(EventHandle);
      Label1.Caption := 'Event is non signaled';
    end;procedure TForm1.Button4Click(Sender: TObject);
    begin
      PulseEvent(EventHandle);
      Label1.Caption := 'signaled/nonsignaled';
    end;procedure TForm1.Button5Click(Sender: TObject);
    begin
      EventHandle := CreateEvent(nil, True, False, 'MyEvent');
    end;end.
      

  2.   

    最简单的是从TThreadList继承你的TMsgList
      

  3.   

    用事件或临界区~
    事件楼上大哥已说
    TMsgList   =   class(TStringList) 
              //------------------消息队列函数------------------------------------- 
              procedure   putMsg(sequence:LongInt;var   bs:array   of   char;buffsize:integer); 
              procedure   removeMsg(sequence:LongInt); 
              public
              Constructor Create;          
              .......
        end;
    use
    SyncObjs;  
    TEnhancedCriticalSection = class(TCriticalSection)
      public
        function TryEnter: boolean;
      end;var
      Msg: TEnhancedCriticalSection;begin
      MsgList.Create
      try
        if ( Msg.TryEnter) then
      finally
        Msg.Release;
      end;
    end;
    大概就是这个意思~