Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.18;
Скачать: CL | DM;

Вниз

Как приостановить поток?   Найти похожие ветки 

 
Alexander Panov ©   (2005-08-25 18:44) [120]

Fay ©   (25.08.05 18:40) [119]
Думаю, не увижу.


Думаю, что да. Не вижу смысла в том.
Все дело только лишь в желании сделать, а не в методах.


 
Alexander Panov ©   (2005-08-25 18:51) [121]

Кстати, не приходила в голову простая мысль, что защищаются не данные, а код, и что в этот код всегда можно передать все, что угодно, в том числе и экземпляр потока?


 
Alexander Panov ©   (2005-08-25 18:53) [122]

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


 
Fay ©   (2005-08-25 19:04) [123]

2 Alexander Panov ©   (25.08.05 18:51) [121]

>> не приходила в голову простая мысль, что защищаются не данные, а код,
Нет. ТАКАЯ мысль мне в голову не приходила.
Что Вы курите?


 
Defunct ©   (2005-08-25 20:54) [124]

> Fay ©   (25.08.05 19:04) [123]

Прочитайте сабж ;>
ведь речь не шла о том как правильно сделать синхронизацию, речь шла о приостановке потока ;>


> Игорь Шевченко ©   (25.08.05 18:39) [118]

Хаха, мазохизмъ


 
volser   (2005-08-25 21:27) [125]

Я нашел попроще решение, просто поставил try в тело цикла вспомагательного потока :-)
Главное что работает.


 
Defunct ©   (2005-08-25 21:35) [126]

volser   (25.08.05 21:27) [125]

Галиматья какая-то, причем тут Try?


 
Fay ©   (2005-08-25 21:55) [127]

2 volser   (25.08.05 21:27) [125]
Приведённый [0] код корявый, можете его больше не приводить.
Вам будет лучше объяснить решаемую по-русски.


 
volser   (2005-08-25 22:20) [128]


> Галиматья какая-то, причем тут Try?

При том, что если лист очищается то вылетает exception после чего продолжается следующий виток цикла с обновленными данными.


 
Defunct ©   (2005-08-25 22:51) [129]

volser   (25.08.05 22:20) [128]

При проектировании канализации можно, конечно, закладывать гнилую деревянную трубу, а места где течет - затыкать паклей, только все равно дерьмо просочится через время в другом месте.


 
Alexander Panov ©   (2005-08-25 23:19) [130]

volser   (25.08.05 22:20) [128]

Вобчем, держи пример.
Возможны опечатки, так как код писал прямо здесь.

TListProcess=class(TThread)
private
 FList: TStringList;
 FCS: TCriticalSection;
 procedure Lock;
 procedure Unlock;
protected
 procedure Execute; override;
public
 constructor Create(List: TStringList);
 destructor Destroy; override;

 procedure Clear;
 procedure Start;
 procedure Stop;  
end;

implementation

constructor TListProcess.Create(List: TStringList);
begin
 inherited Create(True);
 FreeOnTerminate := True;
 FCS := TCriticalSection.Create;
 FList := List;
end;

destructor TListProcess.Destroy;
begin
 FCS.Free;
 inherited;
end;

procedure TListProcess.Clear;
begin
 Lock;
 try
   FList.Clear;
 finally
   Unlock;
 end;
end;

procedure TListProcess.Lock;
begin
 FCS.Enter;
end;

procedure TListProcess.Unlock;
begin
 FCS.Leave;
end;

procedure TListProcess.Start;
begin
 Resume;
end;

procedure TListProcess.Stop;
begin
 Lock;
 try
   Suspend;
 finally
   Unlock;
 end;
end;

procedure Execute;
var
 i: Integer;
begin
 while not Terminated do
 begin
   for i := 0 to FList.Count-1 do
   begin
     Lock;
     try
       //Работаем со строкой из списка.
     finally
       Unlock;
     end;
     if FList.Count=0 then Break;
   end;
   Suspend;
 end;
end;


 
Fay ©   (2005-08-26 04:19) [131]

2 Alexander Panov ©   (25.08.05 23:19) [130]
Пример довольно приличный.
"Опечатка" только одна : procedure TListProcess.Execute;

Но есть и злобные баги, которые, видимо, происходят от позднего времени и конца трудовой недели 8).
for i := 0 to FList.Count-1 do
 begin
   Lock;
   try


Lock после for - не кошерно. Совершенно не очевидно, что количество не изменится. Тут и модный Clear не спасёт.

if FList.Count=0 then Break;

Обращение вне кр. секции - ахтунг.


 
Игорь Шевченко ©   (2005-08-26 10:02) [132]

И эти люди запрещают мне ковырять в носу (с) известный анекдот


 
Alexander Panov ©   (2005-08-26 10:16) [133]

Справедливо. Придется весь список блокировать.

procedure Execute;
var
i: Integer;
begin
 while not Terminated do
 begin
   Lock;
   try
     for i := 0 to FList.Count-1 do
     begin
       if Terminated then Exit;
       //Работаем со строкой из списка.
     end;
   finally
     Unlock;
   end;
   Suspend;
 end;
end;


 
Slym ©   (2005-08-26 10:56) [134]

Не проще Event создать?
в потоке Event.WaitFor
в основном потоке Event.Pulse


 
Slym ©   (2005-08-26 11:00) [135]

Удалено модератором


 
Alexander Panov ©   (2005-08-26 11:30) [136]

Slym ©   (26.08.05 10:56) [134]
Не проще Event создать?


На кой?


 
Alexander Panov ©   (2005-08-26 11:31) [137]

Особенно умиляет Event.Pulse


 
Fay ©   (2005-08-26 13:26) [138]

2 Alexander Panov ©   (26.08.05 11:30) [136]
>> На кой?
Для тех случаев, когда про доп. потоки мы знаем только то, что они, возможно, есть. Правда весь код тогда будет сильно отличаться, но ведь можно "пофантазировать" (© Defunct), что Slym имел ввиду и это...

2 Alexander Panov ©   (26.08.05 11:31) [137]
Но ведь TCriticalSection не умиляет?
8)


 
Alexander Panov ©   (2005-08-26 13:51) [139]

Fay ©   (26.08.05 13:26) [138]
Но ведь TCriticalSection не умиляет?


А вот Pulse - умиляет.


 
Fay ©   (2005-08-26 14:42) [140]

2 Alexander Panov ©   (26.08.05 13:51) [139]
Видимо, имеется некий гипотетический (или даже написанный Slym) класс, являющийся обёрткой для Event, метод Pulse которого вызывает PulseEvent.
Не сказал бы, что испытываю по этому поводу какие-либо эмоции, но рад за Вас 8).



Страницы: 1 2 3 4 вся ветка

Текущий архив: 2005.09.18;
Скачать: CL | DM;

Наверх




Память: 0.77 MB
Время: 0.039 c
11-1107177249
hunn
2005-01-31 16:14
2005.09.18
Модальная форма на чистом KOL


14-1124362233
Andy BitOff
2005-08-18 14:50
2005.09.18
Помогите найти мр3 шку


1-1124785381
volser
2005-08-23 12:23
2005.09.18
Как приостановить поток?


14-1124890654
TStas
2005-08-24 17:37
2005.09.18
За сколько времени на самом деле включают Стрим?


1-1125065257
Fostr
2005-08-26 18:07
2005.09.18
Просмотр изображений в TImage