Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Потокобезопасность [D7]


Страницы:   1 2

Чародей ©   (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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо