Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.75 MB
Время: 0.017 c
2-1123684855
shu
2005-08-10 18:40
2005.09.18
TThread.Execute не вызывается


3-1122840486
Глюкоман
2005-08-01 00:08
2005.09.18
Глюк в параметризированном запросе


4-1122302673
Smile666
2005-07-25 18:44
2005.09.18
Обработка исключения (API)!


4-1122374103
lord Zeratul
2005-07-26 14:35
2005.09.18
Активно ли окно?


14-1124958106
Cosinus
2005-08-25 12:21
2005.09.18
Помогите с решением тригонометрического уравнения...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский