Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.007 c
2-1203511255
Ultimate
2008-02-20 15:40
2008.03.23
Эффекты появления


2-1203486854
серж
2008-02-20 08:54
2008.03.23
ComboBox


2-1203588385
Stepan
2008-02-21 13:06
2008.03.23
Как связать две базы в Аксес через Дельфи


15-1202831718
No_Dead
2008-02-12 18:55
2008.03.23
Что я потеряю?


15-1202895646
@!!ex
2008-02-13 12:40
2008.03.23
Программа для снятия скриншотов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский