Форум: "Начинающим";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];
ВнизПотокобезопасность Найти похожие ветки
← →
Чародей (2008-02-22 13:31) [0]Написал следующий код(упрощено!). Не могу понять является ли он потоко безопасным? (таймеров может быть создано достаточно много)
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 13:35) [1]оп, пропустил
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;
← →
Сергей М. © (2008-02-22 13:39) [2]
> является ли он потоко безопасным?
А почему бы и нет ?
Не вижу пока ничего напоминающего многопоточность.
> таймеров может быть создано достаточно много
Таймеры-то тут причем ?
Упомянутые таймеры к многопоточности не имеют никакого отношения
← →
Сергей М. © (2008-02-22 13:43) [3]И, кстати, за каким лешим понадобилась эта потенциальная куча таймеров ?
В подавляющем большинстве случаев достаточно всего одного на поток)
← →
Чародей (2008-02-22 13:48) [4]
> В подавляющем большинстве случаев достаточно всего одного
> на поток)
Так надо! (я же говорю код сильно урезан, для наглядности)
> Упомянутые таймеры к многопоточности не имеют никакого отношения
Обработчики используют один массив. Может ли быть ситуация, что обработчик таймера что-то читает или очищает значения, во время SetLength, и что собстна при этом произойдет?
← →
Плохиш © (2008-02-22 13:57) [5]
> Чародей (22.02.08 13:48) [4]
> Обработчики используют один массив. Может ли быть ситуация,
> что обработчик таймера что-то читает или очищает значения,
> во время SetLength, и что собстна при этом произойдет?
В данном коде обработчики таймеров запустяться последовательно и только после завершения выполнения кода ProcessBackup, даже если она будет выполняться "тыщи мильёнов" лет...
← →
Сергей М. © (2008-02-22 14:03) [6]
> Обработчики используют один массив. Может ли быть ситуация
Нет, не может. Твои обработчики вызываются последовательно, а не параллельно.
> Так надо
Что ж ... Хозяин - барин)
← →
Чародей (2008-02-22 14:07) [7]
> В данном коде обработчики таймеров запустяться последовательно
> и только после завершения выполнения кода ProcessBackup,
> даже если она будет выполняться "тыщи мильёнов" лет...
Почему? ведь в течении выполнения таймеров, ProcessBackup может быть зыпущен еще несколько раз и тогда выполнение таймеров запущенных в предидущий раз может пересечься с текущим выполнением процедуры
← →
Сергей М. © (2008-02-22 14:11) [8]
> в течении выполнения таймеров, ProcessBackup может быть
> зыпущен еще несколько раз
Это ты сам придумал ? Или кто-то подсказал ?)
← →
Чародей (2008-02-22 14:12) [9]это я сам написал)
← →
Сергей М. © (2008-02-22 14:14) [10]Да это-то мы видим, что сам)
Ты другое скажи - ты САМ дотумкал до гениальной мысли насчет "ProcessBackup может быть зыпущен еще несколько раз" или тебя к ней подтолкнули некие "добродеятели" ?)
← →
Чародей (2008-02-22 14:18) [11]к чему это поясничество?
← →
Сергей М. © (2008-02-22 14:19) [12]А к чему твои "почему", если тебе уже дважды сказано про последовательный вызов твоего таймерного обработчика ?
← →
Palladin © (2008-02-22 14:20) [13]к тому что ты не понимаешь, что происходит. и почему то решил что сообщение WM_TIMER может в одном потоке выполнятся паралельно... как оно паралельно то выполнятся будет? поток комманд один и он непрерывен
← →
Сергей М. © (2008-02-22 14:22) [14]Угу. Еще и потоки с потокобезопасностью сюда приплел. И еще весь на обидах-амбициях при этом
И после этого я паяц)
← →
Сергей М. © (2008-02-22 14:23) [15]
> Чародей (22.02.08 14:18) [11]
> поясничество?
Русский учи, канферонсье)
← →
Чародей (2008-02-22 14:24) [16]
> WM_TIMER
АХААА, Спасобо за ответ! это все что требовалось))))
← →
Чародей (2008-02-22 14:26) [17]
> И после этого я паяц)
Да паяц! а что просто написать "WM_TIMER" трудно? ведь все сразуже становиться понятно!
← →
Плохиш © (2008-02-22 14:26) [18]
> > WM_TIMER
>
> АХААА, Спасобо за ответ! это все что требовалось
Рыдал...
← →
Palladin © (2008-02-22 14:27) [19]А ты думал TTimer как то не через WM_TIMER работает?
На первой же страницы справки сказано
TTimer encapsulates the Windows API timer functions.
← →
Чародей (2008-02-22 14:27) [20]я просто не знал, что таймеры обслуживаются в порядке живой очереди)))
← →
Palladin © (2008-02-22 14:28) [21]мне вот даже в голову не пришло, что ты непонимаешь именно это.
← →
Palladin © (2008-02-22 14:29) [22]
> Чародей (22.02.08 14:27) [20]
любые сообщения одним потоком обслуживаются в порядке этой самой живой очереди, они по другому не могут обслуживаться...
← →
Сергей М. © (2008-02-22 14:31) [23]
> я просто не знал, что таймеры обслуживаются в порядке живой
> очереди
А причем здесь таймеры ?
Любые события/сообщения в пределах одного и того же потока возбуждаются/обслуживаются в порядке "живой очереди".
← →
Сергей М. © (2008-02-22 14:32) [24]А начиналось-то все так солидно и за здравие - "потокобезопасность")
← →
Чародей (2008-02-22 14:35) [25]
> любые сообщения одним потоком
Это как это?? 0_0
А
RegisterClass + WNDCLASS(WNDPROC)+CreateWindow???????
В программировании без меня все изменили????
← →
Сергей М. © (2008-02-22 14:37) [26]
> я просто не знал
Да-да. Это, конечно же, уважительная причина
И исходники этого таймера Борландом открыты для серьезных пацанов, а не для паяцов)
← →
Чародей (2008-02-22 15:11) [27]Фсе не бейти сильна, я фсе понял
*убижал в угол*
← →
Сергей М. © (2008-02-22 15:16) [28]Стоя в углу на горохе заодно подумай про многопоточность)
← →
Плохиш © (2008-02-22 15:18) [29]
> Сергей М. ©
Ты чё сёдня зверствуешь? Не налили? :-))
← →
Palladin © (2008-02-22 15:18) [30]А думать о многопоточности очень удобно глядя на %Delphi%\Demos\Threads
← →
Сергей М. © (2008-02-22 15:25) [31]
> Плохиш © (22.02.08 15:18) [29]
>
>
Да уж не зверее тебя,)
Ну а вообще - да, не налили)... Что-то вдруг девочки наши корпоративные нас, "защитничков", сегодня сочком решили попотчевать)
← →
Palladin © (2008-02-22 15:26) [32]а нам чашки подарили и тоже не налили... даже сока...
ну ниче... будет им... 8 марта...
← →
Сергей М. © (2008-02-22 15:29) [33]
> Palladin © (22.02.08 15:26) [32]
> нам чашки подарили
Стесняюсь спросить, неужели лифчики на подарки распотронили ?)
← →
Плохиш © (2008-02-22 15:35) [34]> Сергей М. © (22.02.08 15:25) [31]
>
> > Плохиш © (22.02.08 15:18) [29]
>
> Да уж не зверее тебя
Я сегодня мягкий и пушистый |-) Вот хожу, коллег с праздником поздравляю :-D
Кстати, тут ИШ объявился, в потрепаться зверствует, боюсь и сюда доберётся ;-)
← →
Palladin © (2008-02-22 15:37) [35]
> Сергей М. © (22.02.08 15:29) [33]
стесьняюсь ответить :) в лифчиках чашечки, а не чашки :)
← →
Сергей М. © (2008-02-22 16:11) [36]
> Palladin © (22.02.08 15:37) [35]
А... ну да... 2-й - это чашечки, а дальше "чашки")
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.006 c