Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Взаимодействие двух потоков.


Автор: Гость_Игорь 2.7.2005, 22:49
Ситуация:
Есть TObjectList (список указателей на что-нибудь)
и есть два потока. Первый из них добавляет указатель
в список, а второй удаляет.

Написал код, который синхронизирует эти два потока,
Вроде работает, но не знаю как проверить,
есть большие сомнения - все ли правильно здесь.

Прошу заценить код и указать грабли.
Правилен ли подход к задаче вообще?


Код

TAdd = class(TThread)...
TRemove = class(TThread)...
FList : TObjectList;

//TEvent.Create(EventAttributes, ManualReset, InitialState, Name)
FEvent:= TEvent.Create(nil, true, true, 'SomeEvent');


procedure TRemove.Execute;
begin
  while not self.Terminated do begin
    WaitForSingleObject(FEvent.Handle, INFINITE);
    FEvent.ResetEvent;
    if FList.Count > 0 then begin
      FList.Delete(0);
    end;
    FEvent.SetEvent;
  end;
end;

procedure TAdd.Execute;
var O : TObject;
begin
  while not self.Terminated do begin
    WaitForSingleObject(FEvent.Handle, INFINITE);
    FEvent.ResetEvent;
    O:= TObject.Create;
    FList.Add(O);
    FEvent.SetEvent;
  end;
end;

Автор: Medved 4.7.2005, 05:40
see TThreadList.

Автор: Петрович 4.7.2005, 11:01
Цитата
Прошу заценить код и указать грабли.
Правилен ли подход к задаче вообще?

Вообще то для таких целей (взаимоисключающий доступ к данным из разных потоков) надо использовать критические секции.
Или, как уже сказал Pegas, воспользоваться готовым, TThreadList.
А для профилактитки, почитай http://mbo88.narod.ru/ToC.html

Автор: Medved 4.7.2005, 14:22
Хорошая статья Петрович. Спасибо за линк.

Автор: Гость_Игорь 4.7.2005, 19:42
Спасибо за статью.
Я уже ее читал.

Т.е., как я понял, нормальным считается использование критических
секций.

А почему ? Так надежней?

И использовать TEvent в таких случаях нецелесообразно ?

Автор: Петрович 5.7.2005, 22:36
Цитата
А почему ? Так надежней?

И использовать TEvent в таких случаях нецелесообразно ?

Просто каждый инструмент для своих целей. Ведь молотком суп есть можно, но неудобно.

TEvent обычно используется для сообщения заинтересованным лицам (ожидающим потокам) о возникновении некоторого события, что впротчем следует из его названия.

Автор: Гость_Игорь 6.7.2005, 11:55
Собственно это я и хотел услышать.
Просто по неопытности своей сомневался - чем лучше воспользоваться

Спасибо всем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)