![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потокобезопасность [D7]
Чародей © (2008-02-22 13:31:00)Написал следующий код(упрощено!). Не могу понять является ли он потоко безопасным? (таймеров может быть создано достаточно много)
procedure TForm1.tmrOnTime(Sender: TObject);
begin
args[(Sender as TTimer).Tag][0]:='';
args[(Sender as TTimer).Tag][1]:='';
(Sender as TTimer).Free;
end;
procedure TForm1.ProcessBackup;
var i,j,k:integer;
afn:string;
tmr : TTimer;
begin
for i:=0 to ListBox1.Items.Count-1 do
begin
afn:=CompileFile;
for j:=1 to ListBox2.Items.Count-1 do
if not WindowsCopyFile(afn,ListBox2.Items[j]) then
begin
tmr:=TTimer.Create(Form1);
tmr.Interval:=1000000;
tmr.Tag:=-1;
for k:=0 to Length(args)-1 do
if args[k][0]='' then
begin
tmr.Tag:=k;
args[k][0]:=afn;
args[k][1]:=ListBox2.Items[j];
break;
end;
if tmr.Tag=-1 then
begin
SetLength(args,length(args)+1);
tmr.Tag:=High(args);
args[High(args)][0]:=afn;
args[High(args)][1]:=ListBox2.Items[j];
end;
tmr.OnTimer:=tmrOnTime;
tmr.Enabled:=true;
end;
end;
end;
Чародей (2008-02-22 14:24:00) [21]
> WM_TIMER
АХААА, Спасобо за ответ! это все что требовалось))))
Сергей М. (2008-02-22 14:23:00) [22]
> Чародей (22.02.08 14:18) [11]
> п оясничество?
Русский учи, канферонсье)
Сергей М. (2008-02-22 14:22:00) [23]Угу. Еще и потоки с потокобезопасностью сюда приплел. И еще весь на обидах-амбициях при этом
И после этого я паяц)
Palladin (2008-02-22 14:20:00) [24]к тому что ты не понимаешь, что происходит. и почему то решил что сообщение WM_TIMER может в одномпотоке выполнятся паралельно... как оно паралельно то выполнятся будет? поток комманд одини он непрерывен
Сергей М. (2008-02-22 14:19:00) [25]А к чему твои "почему", если тебе уже дваждысказано про последовательныйвызов твоего таймерного обработчика ?
Чародей (2008-02-22 14:18:00) [26]к чему это поясничество?
Сергей М. (2008-02-22 14:14:00) [27]Да это-то мы видим, что сам)
Ты другое скажи - ты САМ дотумкал до гениальной мысли насчет "ProcessBackup может быть зыпущен еще несколько раз" или тебя к ней подтолкнули некие "добродеятели" ?)
Чародей (2008-02-22 14:12:00) [28]это я сам написал)
Сергей М. (2008-02-22 14:11:00) [29]
> в течении выполнения таймеров, ProcessBackup может быть
> зыпущен еще несколько раз
Это ты сам придумал ? Или кто-то подсказал ?)
Чародей (2008-02-22 14:07:00) [30]
> В данном коде обработчики таймеров запустяться последовательно
> и только после завершения выполнения кода ProcessBackup,
> даже если она будет выполняться "тыщи мильёнов" лет...
Почему? ведь в течении выполнения таймеров, ProcessBackup может быть зыпущен еще несколько раз и тогда выполнение таймеров запущенных в предидущий раз может пересечься с текущим выполнением процедуры
Сергей М. (2008-02-22 14:03:00) [31]
> Обработчики используют один массив. Может ли быть ситуация
Нет, не может. Твои обработчики вызываются последовательно, а не параллельно.
> Так надо
Что ж ... Хозяин - барин)
Плохиш (2008-02-22 13:57:00) [32]
> Чародей (22.02.08 13:48) [4]
> Обработчики используют один массив. Может ли быть ситуация,
> что обработчик таймера что-то читает или очищает значения,
> во время SetLength, и что собстна при этом произойдет?
В данном коде обработчики таймеров запустяться последовательно и только после завершения выполнения кода ProcessBackup, даже если она будет выполняться "тыщи мильёнов" лет...
Чародей (2008-02-22 13:48:00) [33]
> В подавляющем большинстве случаев достаточно всего одного
> на поток)
Так надо! (я же говорю код сильно урезан, для наглядности)
> Упомянутые таймеры к многопоточности не имеют никакого отношения
Обработчики используют один массив. Может ли быть ситуация, что обработчик таймера что-то читает или очищает значения, во время SetLength, и что собстна при этом произойдет?
Сергей М. (2008-02-22 13:43:00) [34]И, кстати, за каким лешим понадобилась эта потенциальная куча таймеров ?
В подавляющем большинстве случаев достаточно всего одного на поток)
Сергей М. (2008-02-22 13:39:00) [35]
> является ли он потоко безопасным?
А почему бы и нет ?
Не вижу пока ничего напоминающего многопоточность.
> таймеров может быть создано достаточно много
Таймеры-то тут причем ?
Упомянутые таймеры к многопоточности не имеют никакого отношения
Чародей (2008-02-22 13:35:00) [36]оп, пропустил
procedure TForm1.tmrOnTime(Sender: TObject);
begin
if WindowsCopyFile(args[(Sender as TTimer).Tag][0],args[(Sender as TTimer).Tag][1]) then
begin
args[(Sender as TTimer).Tag][0]:='';
args[(Sender as TTimer).Tag][1]:='';
(Sender as TTimer).Free;
end;
end;