将对象分配给另一个线程

Assigning object to another thread

我有一个多线程应用程序,我有一个关于在线程之间分配对象以及如何正确锁定它们的问题。

我定义了自定义类型 class 并在主线程中创建了该类型的实例。我想将不同的对象分配给一个线程,这些对象将在线程的 Execute 方法中使用。

type TMyClass = class
private
  FData: Integer;
public
  property Data: Integer read FData write FData;
end;

TMyThread = class(TThread)
private 
  FMyObject: TMyObject;
  FLock: TCriticalSection;

protected 
  procedure Execute; override;
public
  procedure Lock;
  procedure Unlock;
  property MyObject: TMyObject read FMyObject write FMyObject;
end;

procedure TMyThread.Lock;
begin
  FLock.Acquire;
end;

procedure TMyThread.Unlock;
begin
  FLock.Release;
end;

procedure TMyThread.Execute; 
begin

  while not Terminated do
  begin
    Lock;
    try
      if Assigned(FMyObject) then 
        FMyObject.Data := FMyObject.Data + 1;
    finally
      Unlock;
    end;
  end;
end;


from main thread:

var MyObject1, MyObject2: TMyObject;
    thOperation: TMyThread;
    CurrData1, CurrData2: Integer;

begin
  // create two objects
  MyObject1 := TMyObject.Create;
  MyObject2 := TMyObject.Create;

  // create thread(started)
  thOperation := TMyThread.Create(false);

  thOperation.Lock;
  try
    thOperation.MyObject := MyObject1;
  finally
    thOperation.Unlock;
  end;

  /// .... do some stuff in main thread
  thOperation.Lock;
  try
    CurrData1 := thOperation.MyObject.Data;
  finally
    Unlock;
  end;

  // let's assign new object on a running thread
  thOperation.Lock;
  try
    thOperation.MyObject := MyObject2;
  finally
    thOperation.Unlock;
  end;

  /// .... do some stuff in main thread again
  thOperation.Lock;
  try
    CurrData2 := thOperation.MyObject.Data;
  finally
    Unlock;
  end;


  if CurrData1 <> CurrData2 then ShowMessage('Different result!');


  // do cleanup
  thOperation.Terminate;
  thOperation.WaitFor;
  thOperation.Free;

  MyObject1.Free;
  MyObject2.Free;


end;

这种在线程分配不同对象时加锁的方法可以吗?

回答你的问题,是的,你使用TCriticalSection的方法是可以的。

有关多线程的更多信息,如果您还没有,请阅读 Martin Harvey 的 Google for 'Multithreading - The Delphi way'。一篇优秀的文章(或者我应该说是书)。