Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Взаимодействие двух потоков. Прошу заценить код. 
:(
    Опции темы
Гость_Игорь
Дата 2.7.2005, 22:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ситуация:
Есть 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



see TThreadList.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Петрович
Дата 4.7.2005, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



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

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



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Medved
Дата 4.7.2005, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Хорошая статья Петрович. Спасибо за линк.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Гость_Игорь
Дата 4.7.2005, 19:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо за статью.
Я уже ее читал.

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

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

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

  Вверх
Петрович
Дата 5.7.2005, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



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

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

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

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



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Гость_Игорь
Дата 6.7.2005, 11:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Собственно это я и хотел услышать.
Просто по неопытности своей сомневался - чем лучше воспользоваться

Спасибо всем.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0425 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.