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

Вниз

LDSLogger   Найти похожие ветки 

 
Loginov Dmitry ©   (2007-04-09 19:01) [0]

Вот накатал небольшой модулек для ведения логов в многопоточном приложении(ях).

Описание:


Выполняет надежное потокобезопасное логгирование текстовых данных
с возможностью ограничения размера LOG-файла, либо с применением часто
используемой техники переименования старых LOG-файлов. Операцию записи в
файл можно защитить критической секцией (не самый надежный способ, так
как одному LOG-файлу не может соответствовать более одной критической секции,
тем более при ведении одного лога из нескольких приложений это может запросто
привести к ошибке ввода-вывода). Другой способ защиты - использование объекта
синхронизации "мьютекса". Данный способ защиты используется по-умолчанию
и менять его без нужды не следует. Данный способ работает одинаково надежно
как внутри одного приложения (в многопоточном режиме), так и с приложениями,
работающими независимо друг от друга. При возникновении ошибки ввода-вывода
исключение будет перехвачено и погашено (однако о нем вы все-равно узнаете,
так как будет сгенерирован короткий звуковой сигнал функцией Windows.Beep()).
Вы можете указать программе, чтобы она автоматически добавляла в лог ID текущего
процесса и потока. Вы можете изменить формат вывода времени сообщения. Вы можете
определить свойство DefaultPrefix, благодаря которому можно узнать, какая
часть вашей программы осуществляла запись в лог того или иного текста.


Не претендую на универсальность модуля, и более существенно развивать его не собираюсь. Если кто захочет скачать, то ссылка вот:
http://matrix.kladovka.net.ru/download.php?getfilename=uploads/other/ldslogger.zip

Вроде есть какая-никакая польза, ну и выложил, чтоб в забвение не ушел.


 
Суслик ©   (2007-04-10 10:23) [1]

в любом случае убери слово "надежное" :)


 
Суслик ©   (2007-04-10 10:40) [2]

не проверяешь результат выполнения
FMutexHandle := CreateMutex(nil, False, PChar(GenerateMutexName));

в остальном вроде нормально.


 
Суслик ©   (2007-04-10 10:43) [3]

Хотя нет :)
есть у тебя ошибка :)
многопоточной работы.

Lock у тебя неверно написан. перепиши.

создавай крит. секцию в конструкторе, а не по требованию.
тоже самое с мьютексом.


 
Суслик ©   (2007-04-10 10:47) [4]

число скачиваний уже 12!!! одумайтесь, люди.

-------

если серьезно, то советую тебе поизучать серьезный многопоточный код.
любой :) только качественного производителя. да хоть тот же TThread. Тогда таких детских ошибок делать не будешь.

С наилучшими (честно) пожеланиями.


 
Loginov Dmitry ©   (2007-04-10 10:47) [5]

Знаю. При работе с файлами нет ничего надежного :)
А если выставить read-only, то и логгирования вообще не произойдет никакого.

А "надежное" я имел ввиду в плане ведения одного лога сразу несколькими приложениями. Может быть кому-то покажется интересной идея (пусть древнейшая) защиты записи в файл мьютексом, имя которого формируется путем обработки имени файла. Другого, более надежного и простого способа защиты я не придумал :).


 
Суслик ©   (2007-04-10 10:52) [6]

дима, извини, терперь это слово не могу, но завязывай с ламерством :)
честное слово - ну зачем себя позорить то. ты даже не понял, что я тебе сказал.

и вообще - я не мать тереза. сам учись.

(блин, сейчас же еще обиду затаит :) )

---------
дима, скажи только честно - это не развод? :)


 
Суслик ©   (2007-04-10 10:53) [7]

не думаю, что многие захотят смотреть твой код, поэтому приведу его кусок. путь тоже кто-нить покритикует тебя :)

procedure TLDSLogger.Lock;
begin
 if UseCritSect then
 begin
   if FCritSect = nil then
     FCritSect := TCriticalSection.Create; // LoL :)

   FCritSect.Enter;
 end else
 ...
 <skiped>
end;


вот такая у нас процедура lock


 
Суслик ©   (2007-04-10 10:56) [8]

hint
1. возьми этот код
2. распечатай в 2х экземплярах.
3. положит рядом.
4. поводи пальчиком по одной страничке - это один поток.
5. поводи пальчиком по другой страничке - это другой поток.
6. имей в виде, что выполнение потока может быть прервано в любой момент.

все сам поймешь.

еще hint - в результате у тебя каждый поток может ждать СВОЕГО экземпляра критической секции :) какая тут защита? да еще надежная.

ЗЫ И что я так завелся - все равно весь мир не научишь программировать :)


 
Суслик ©   (2007-04-10 10:58) [9]

и еще, дима, имей в виду, что часто при приеме на работу анализируется публичное присутствие человека в сети. если я бы увидел такой код и твои комментарии, то я бы ни секунды не продолжал бы процесс приема тебя к себе на работу: прервал бы стразу.

одним словом - поправь :)
тебе же лучше.


 
Loginov Dmitry ©   (2007-04-10 11:05) [10]

> если серьезно, то советую тебе поизучать серьезный многопоточный
> код.
> любой :) только качественного производителя. да хоть тот
> же TThread. Тогда таких детских ошибок делать не будешь.


Модуль будет правиться по мере наступления на грабли, связанные с неполным учетем особенностей многопоточного приложения. Если такие грабли будут, то может быть перепишу данный модуль. Но пока не вижу практической ситуации, где бы из-за отсутствия проверки GetLastError программа работала бы менее надежно. Насчет критической секции - согласен. Есть ненулевая вероятность того, что при первой попытке записи в лог сразу из нескольких потоков объект критической секции будет создан несколько раз. В этом случае поимеем и утечку памяти и ошибку ввода вывода.
В случае повторного создания мьютекса, имхо, даже ошибка ввода-вывода произойти не должна.
Чесно скажу, ошибка есть и в вызове функции GetFileSize() до CloseFile(), так как до CloseFile() вывод в файл кэшируется, и фактический размер файла не соответствует тому, что выдаст GetFileSize().


 
Loginov Dmitry ©   (2007-04-10 11:06) [11]

> дима, извини, терперь это слово не могу, но завязывай с
> ламерством :)
> честное слово - ну зачем себя позорить то. ты даже не понял,
> что я тебе сказал.
>
> и вообще - я не мать тереза. сам учись.


Я твои посты прочитал уже после отправки [5]. Ну ничего. Не обиделся.


 
Loginov Dmitry ©   (2007-04-10 11:08) [12]

то есть я снача прочел [1], затем отправил [5], а уж потом обнаружил посты [2] - ...


 
Loginov Dmitry ©   (2007-04-10 11:10) [13]

> и еще, дима, имей в виду, что часто при приеме на работу
> анализируется публичное присутствие человека в сети. если
> я бы увидел такой код и твои комментарии, то я бы ни секунды
> не продолжал бы процесс приема тебя к себе на работу: прервал
> бы стразу.
>
> одним словом - поправь :)
> тебе же лучше.


Ладно, подправлю, это уже дело принципа.


 
Суслик ©   (2007-04-10 11:10) [14]


> Чесно скажу, ошибка есть и в вызове функции GetFileSize()
> до CloseFile(), так как до CloseFile() вывод в файл кэшируется,
> и фактический размер файла не соответствует тому, что выдаст
> GetFileSize().

я файлами не пользуюсь, поэтому не знаю :)
а вот многопоточная ошибка у тебя есть.
здесь нет место разговорам о вероятности - код должен быть корректный. никаких если, никаких но.


 
Loginov Dmitry ©   (2007-04-10 11:18) [15]

Я совершенно не искушенный человек в области многопоточности. Не было у меня соответствующей практики. Так и быть, пусть лаймер, однако со временем все меньше людей делают подобные высказывания в мой адрес.


 
Суслик ©   (2007-04-10 11:20) [16]

страшный ты человек. чессо слово.
ламерство - перманентное состояние души, от него не избавишься, если в корне не пересмотришь свою позицию.


 
Игорь Шевченко ©   (2007-04-10 11:47) [17]


> Я совершенно не искушенный человек в области многопоточности.
>  Не было у меня соответствующей практики


А Рихтера не судьба почитать ?


 
Loginov Dmitry ©   (2007-04-10 11:52) [18]

Я читал Рихтера. Однако прочтение и понимание материала - это не есть практика.
Практикой в использовании многопоточности я считаю - разработка серьезного коммерческого приложения, в котором одновременно крутятся десятки потоков и любая ошибка карается. В подобных разработках мне не приходилось учавствовать. К сожалению.


 
Игорь Шевченко ©   (2007-04-10 12:06) [19]


> Практикой в использовании многопоточности я считаю - разработка
> серьезного коммерческого приложения, в котором одновременно
> крутятся десятки потоков и любая ошибка карается


Ну зачем же так сурово. Кроме того, мне не представляется серьезное коммерческое приложение с такой функциональностью и тем более, написанное на Delphi - я просто не вижу области его применения.


 
Loginov Dmitry ©   (2007-04-10 12:25) [20]

> Ну зачем же так сурово. Кроме того, мне не представляется
> серьезное коммерческое приложение с такой функциональностью
> и тем более, написанное на Delphi - я просто не вижу области
> его применения.


Первое, что приходит в голову - организация магазина с несколькими десятками касс, с одним СОМ-сервером БД, взаимодействие между которыми происходим с помощью MIDAS. Каждому клиенту в данном случае будет соответствовать по меньшей мере один поток, а вот ошибки программы в таких приложениях могут обойтить довольно дорого. Как магазину, так и программисту, который можеть и не додуматься, как последствия таких ошибок можно исправить.


 
Loginov Dmitry ©   (2007-04-10 12:32) [21]

Кстати, я подправил модуль LDSLogger. Вроде все что можно было учел. Сейчас крит. секция создается в конструкторе и во всех случаях защищает запись в файл. При установке параметра UseMutex (устанавливается по умолчанию) происходит дополнительная защита записи в файл. Критическая секция защищает теперь не только запись в файл, но также и другие операции, выполнение поторых может повлиять на запись в файл. Теперь я думаю, модуль не подведет даже в самых жестких условиях (если он конечно сможет устоять критике Дмитрия :)


 
SlymRO ©   (2007-04-10 12:35) [22]

почему string параметры не const? непорядок


 
Игорь Шевченко ©   (2007-04-10 12:36) [23]


> Первое, что приходит в голову - организация магазина с несколькими
> десятками касс, с одним СОМ-сервером БД, взаимодействие
> между которыми происходим с помощью MIDAS


Пример здорово надуманный, потому что систем автоматизации торговли как звезд на небе и с проблемами многопоточности они не сталкиваются.


 
Loginov Dmitry ©   (2007-04-10 12:43) [24]

> почему string параметры не const? непорядок


А в каком месте для них необходим const?


 
Суслик ©   (2007-04-10 12:45) [25]


> А в каком месте для них необходим const?

оптимальней просто с const - не создается локальная копия :)
CPU посмотри.


 
Loginov Dmitry ©   (2007-04-10 12:47) [26]

> оптимальней просто с const - не создается локальная копия
> :)
> CPU посмотри.


Спорно. Копия будет создана только при обращении к элементу строки в виде S[i]. Поэтому про оптимальность - это Вы зря.


 
SlymRO ©   (2007-04-10 12:57) [27]

Loginov Dmitry ©   (10.04.07 12:47) [26]
без const как минимум вызывает LStrAddRef со const нет...


 
Суслик ©   (2007-04-10 13:05) [28]


>  [26] Loginov Dmitry ©   (10.04.07 12:47)

дима, зачем ты это делаешь?
зачем себя смешно вести?
ну возьми прежде чем постить что-то разберись.


 
Loginov Dmitry ©   (2007-04-10 13:20) [29]

> дима, зачем ты это делаешь?
> зачем себя смешно вести?
> ну возьми прежде чем постить что-то разберись.


В каком месте это смешно? Я разбирал в определенной степени работу со строками в Дельфи. И просто говорю, что Const в данном случае в плане скорости никаких преимуществ не даст. А что Вам кажется смешным - не понятно. Читая [28] мне самому смешно стало. Не за себя.


 
Суслик ©   (2007-04-10 13:33) [30]


> [29] Loginov Dmitry ©   (10.04.07 13:20)

ну бог тебе в помощь.
я начинаю понимать почему старшие товарищи в топиках с твоим участием не светятся :)


 
Loginov Dmitry ©   (2007-04-10 13:37) [31]

> я начинаю понимать почему старшие товарищи в топиках с твоим
> участием не светятся


Я стараюсь не заводить лишних топиков (если и завожу то не чаще раза в месяц).


 
Rouse_ ©   (2007-04-10 13:54) [32]


> Суслик ©  

Димыч, ты чего на человека набросился то? :)
Ну нет у него опыта, научится же...


 
Игорь Шевченко ©   (2007-04-10 13:58) [33]

Rouse_ ©   (10.04.07 13:54) [32]


> Ну нет у него опыта, научится же...


"Может, он потом пожарником станет"
(с) Волшебная сила искусства


 
db2admin   (2007-04-10 14:01) [34]

Loginov Dmitry ©
Ты не кипятись спокойно подумай, проверь что предлагается.
Конечно обидно когда твою супер прогу критикуют, но создовая пост этого ты и хотел.


 
Manic Mechanic ©   (2007-04-10 14:07) [35]

>> Ну нет у него опыта, научится же...

Он упорно учился на ошибках ... Но его обошли те, кто учился по книгам. (с)


 
Loginov Dmitry ©   (2007-04-10 14:12) [36]

> Ты не кипятись спокойно подумай, проверь что предлагается.
> Конечно обидно когда твою супер прогу критикуют, но создовая
> пост этого ты и хотел.


Я исправил модуль согласно с замечаниям Дмитрия. После этого по теме многопоточности замечаний не было (видимо, Дмитрий не нашел в чему придраться (скорее не стал этим заниматься), и тут SlymRO начал придираться к отсутствию пресвоутого Const, наличие которого ускорило бы выполнение программы аж на пол-такта.

Вот этот код без Const:
constructor TLDSLogger.Create(AFileName: string);
begin
 FCritSect := TCriticalSection.Create;
 FMaxFileSize := MAX_LOGFILE_SIZE;
 FDateTimeFormat := DATE_TIME_FORMAT;
 FUseMutex := True;
 FileName := AFileName;
 FEnabled := True;
 FCanWriteLogWords := True;
 FClearOldLogData := True;
end;

Ну зачем нужно было к нему придираться?


 
Суслик ©   (2007-04-10 15:13) [37]


> программы аж на пол-такта.

о, блин, опытный какой - такты умеет считать.
сравни (я не поленился, а вот ты поленился это сделать)

{$o+}
procedure TestConst(const S: String);
begin
  ShowMessage(S);

(*

Unit1.pas.38: ShowMessage(S);
0046B66C E8E391FCFF       call ShowMessage
Unit1.pas.55: end;
0046B671 C3               ret
0046B672 8BC0             mov eax,eax

*)
end;

procedure TestNoConst(S: String);
begin
  ShowMessage(S);

(*

Unit1.pas.52: begin
0046B674 55               push ebp
0046B675 8BEC             mov ebp,esp
0046B677 51               push ecx
0046B678 8945FC           mov [ebp-$04],eax
0046B67B 8B45FC           mov eax,[ebp-$04]
0046B67E E8B994F9FF       call @LStrAddRef
0046B683 33C0             xor eax,eax
0046B685 55               push ebp
0046B686 68AFB64600       push $0046b6af
0046B68B 64FF30           push dword ptr fs:[eax]
0046B68E 648920           mov fs:[eax],esp

Unit1.pas.53: ShowMessage(S);
0046B691 8B45FC           mov eax,[ebp-$04]
0046B694 E8BB91FCFF       call ShowMessage

Unit1.pas.84: end;
0046B699 33C0             xor eax,eax
0046B69B 5A               pop edx
0046B69C 59               pop ecx
0046B69D 59               pop ecx
0046B69E 648910           mov fs:[eax],edx
0046B6A1 68B6B64600       push $0046b6b6
0046B6A6 8D45FC           lea eax,[ebp-$04]
0046B6A9 E8DA8FF9FF       call @LStrClr
0046B6AE C3               ret

*)
end;


 
Loginov Dmitry ©   (2007-04-10 15:33) [38]

Ну и что здесь нового. Понятно, что выполняется инкремент и декремент счетчика ссылок. Ошибся, каюсь. Не пол такта, а чуть больше. Второй вариант - оптимальнее. Я давно про это знаю и с этим не спорил. Но свой пост [25] прочитайте же наконец! Какая локальная копия? Локальная копия чего?


 
default ©   (2007-04-10 15:42) [39]

автор, ты действуешь недальновидно!
ну кто после таких веток будет без смеха смотреть на твои посты о усоврешненствования матричной системы и тем более использовать её
хотя бы ник что-ли сменил-бы...


 
Суслик ©   (2007-04-10 16:35) [40]

:)


 
Loginov Dmitry ©   (2007-04-10 18:29) [41]

> ну кто после таких веток будет без смеха смотреть на твои
> посты о усоврешненствования матричной системы и тем более
> использовать её
> хотя бы ник что-ли сменил-бы...


Ник менять мне не нужно. Я, имхо, ничего смешного не сказал.

ЗЫ: Тоже поугарать хочу! Че такого особенного курите? Расскажите! :)


 
default ©   (2007-04-10 18:34) [42]

Loginov Dmitry ©   (10.04.07 18:29) [41]
всё выглядит вот так потому что:
1 у меня всё зашибись работает
2 вот тебе ошибка номер 1
1 аа...ну даа фикня поправил всё теперь всё клёво у меня!
2 вот тебе ошибка номер 2
1 где?ты гонишь!аааа...даа точно ну а теперь?
2 извини, но мне уже лень...


 
Loginov Dmitry ©   (2007-04-10 18:52) [43]

Не так, имхо.
Дмитрий в первых же постах указал все мои ошибки. Если не читать [10], то я их всех послушно исправил.
Больше об ошибках речь не идет, но начинается придирка с Const. Я бы и в этом случае подправил код, но скажите что это может дать на практике - уменьшение несколько тактов (связанных с корректировкой счетчика ссылок) при отработке конструктора. Дык лишняя закачка исходников на сайт - гораздо более накладная операция :))


 
Суслик ©   (2007-04-10 18:54) [44]

Дима, я кстати твой логер уже начал использовать для утилитарных задач. Вполне рабочая штука.


 
Loginov Dmitry ©   (2007-04-10 19:01) [45]

Вторую версию?


 
default ©   (2007-04-10 19:03) [46]

Loginov Dmitry ©   (10.04.07 18:52) [43]
просто const почти везде используют со строками которые не изменяются, считай что это правила хорошего тона(+скорость на практике)
понятно, что если ты строку переданную как не const не модифицируешь в коде копия не создаётся, НО подитоживая(и добавляя)
1)это текущие детали реализации
с точки зрения логики копия создаётся(ибо строка не объявлена как var) и изменения внутри вызываемого кода не должны быть видны вызывающему
просто текущая реализация механизма работы со строками не создаёт копию пока строка фактически не меняется - это тебе просто позло считай, не основывай свой код на таким допущения и нервы будут твои крепче
2)правила хорошего тона
3)скорость
4)логичность(если строка не меняется ставим const)
5)читаемость кода(сразу понятно что строка передаётся без модицикации внутри вызываемого кода)


 
default ©   (2007-04-10 19:04) [47]

мда, коряво пишу тороплюсь...


 
Loginov Dmitry ©   (2007-04-10 19:10) [48]

Лана! В другой раз знать буду :)
Так ведь все-равно найдете к чему придраться. Это ж всегда так...


 
Суслик ©   (2007-04-10 19:24) [49]


>  [45] Loginov Dmitry ©   (10.04.07 19:01)
> Вторую версию?

да.
я не смотрел детально, но вроде исправил о чем говорили.


 
SlymRO ©   (2007-04-11 05:04) [50]

SlymRO ©   (10.04.07 12:35) [22]
Мда хорош я в роли гоблина :) 25 постов const перетирали!


 
Loginov Dmitry ©   (2007-04-11 10:02) [51]

В бою смешались гоблины и троли....
:)



Страницы: 1 2 вся ветка

Текущий архив: 2007.05.06;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.022 c
3-1171843720
Lirik
2007-02-19 03:08
2007.05.06
SQL Server Compact Edition 2005


15-1176093581
vajo
2007-04-09 08:39
2007.05.06
Подскажите с апгрейдом компа.


2-1176362871
allucard
2007-04-12 11:27
2007.05.06
Хранение второго значения в ListBox.


15-1175945597
frame3
2007-04-07 15:33
2007.05.06
дипломная работа


2-1176840303
Михась
2007-04-18 00:05
2007.05.06
В каждой строке матрицы А(8,12) вместо минимального элемента запи