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

Вниз

Потокобезопасность   Найти похожие ветки 

 
Чародей   (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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.015 c
15-1202600368
NeyroSpace
2008-02-10 02:39
2008.03.23
QUIK


11-1186055013
Alexey_k
2007-08-02 15:43
2008.03.23
Не изменяется цвет TKolToolbar


2-1204099419
alexsashkan
2008-02-27 11:03
2008.03.23
Непонятная ошибка!!!


2-1204033951
AlexeyMir
2008-02-26 16:52
2008.03.23
Как обозвать компонент созданный в процессе выполнения программы


2-1203502618
Ultimate
2008-02-20 13:16
2008.03.23
Возможно вовсе глупо звучит... но...