2015-10-17 4 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; 

Этот подход блокировки при назначении различным объектам нити ok?

+2

Какую проблему вы предвидите? –

+0

Я хотел бы знать, если это нормально, или есть лучший способ сделать это? – Nix

+0

Без лишнего контекста трудно сказать, что именно вы делаете. Не зная этого, трудно предложить лучший способ. Это кажется лучше подходит для [CodeReview] (http://codereview.stackexchange.com/) ... –

ответ

1

Чтобы ответить на ваш вопрос, да, ваш подход к использованию TCriticalSection в порядке.

Для получения дополнительной информации о многопоточности, если у вас ее еще нет, Google для «Многопоточности - путь Delphi» Мартина Харви. Отличная статья (или я должен сказать книгу).

Смежные вопросы