2015-10-17 81 views
-3

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

我定义了自定义类型类,并在主线程中创建了该类型的实例。我想为线程分配不同的对象,这些对象将用在线程的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; 

当将不同的对象分配给线程时,这种锁定方法是否正常?

+2

你预见了什么问题? –

+0

我想知道这是好的解决方案还是有没有更好的方法来做到这一点? – Nix

+0

没有更多的背景知识,很难说你在做什么。不知道这一点,很难提出任何更好的方法。这似乎更适合[CodeReview](http://codereview.stackexchange.com/)... –

回答

1

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

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

相关问题