![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как в DLL организовать таймер, или вывернутся другим способом [D5, WinXP]
user51 © (2010-05-31 11:19:00)как в DLL организовать таймер, или вывернуться другим способом.
dll ведет логи некоторых событий открывает файл пишет закрывает. И случается ситуация что события идут очень быстро
и до того как файл закроется, необходимо записать еще в него,
сотоветсвенно возникает ошибка. Отловить ее могу, как запустить повторно процесс запись например через пару секунд.
Второй вопрос как организовать таймер - выполнять дествия через промежуток времени
Скептик (2010-05-31 23:25:00) [21]>И случается ситуация что события идут очень быстро
>и до того как файл закроется, необходимо записать еще в него,
>сотоветсвенно возникает ошибка. Отловить ее могу, как запустить повторно
>процесс запись например через пару секунд.
Ты определись сначала сам, а то у тебя то "очень быстро", то "через пару секунд". Если твои события могут ждать пару секунд, то это не "быстро", это - "медленно". Так что не там ищешь.
Юрий Зотов (2010-05-31 23:09:00) [22]> sniknik © (31.05.10 21:56) [19]
Это уже вопрос реализации, а суть все равно та же.
> sniknik © (31.05.10 22:56) [21]
Тут человек говорит, что у него "случается ситуация что события идут очень быстро" -так зачем же еще и переоткрывать файл, тратя на это немалое время, если программа и так не успевает?
sniknik (2010-05-31 22:56:00) [23]> Для этого достаточно грамотно выставить флаги в программе на открытие файла
да конечно, и если вдруг в процессе нужно удалить файл лога, чтобы получить "с нуля" только интересующее, можно "снять" его с открытых ресурсов в системе. но проще все таки закрывать файл после записи.
вообще, разве сказано, что это только для того чтобы открывать? по моему сказано "чтобы без проблемможно было открывать". почувствуйте разницу как говорится.
turbouser (2010-05-31 22:03:00) [24]
> sniknik © (31.05.10 21:56) [19]
>
> > зачем каждый раз закрывать файл лога.
> ну например чтобы без проблем можно было открывать лог параллельно
> с работающей программой.
Для этого достаточно грамотно выставить флаги в программе на открытие файла
sniknik (2010-05-31 21:56:00) [25]> зачем каждый раз закрывать файл лога.
ну например чтобы без проблем можно было открывать лог параллельно с работающей программой.
> Один поток кладет сообщения в очередь, другой поток (в цикле) выбирает сообщение из очереди
всегда обходился одним, "выбирающим", а вместо "кладущего" простой постмесейж потоку с сообщением в PChar.
> Нужна синхронизация потоков.
тогда и синхронизация не нужна, и "очередь" сама образуется.
Юрий Зотов (2010-05-31 20:53:00) [26]Непонятно, зачем тут таймер и зачем каждый раз закрывать файл лога.
Нужна очередь сообщений для лога. Один поток кладет сообщения в очередь, другой поток (в цикле) выбирает сообщение из очереди, пишет его в лог, сбрасывает буфер лога (Flush), удаляет сообщение из очереди и ждет нового сообщения. В начале работы программы файл лога открывается (один раз), в конце - закрывается (тоже один раз).
Нужна синхронизация потоков.
Leonid Troyanovsky (2010-05-31 18:02:00) [27]
> user51 (31.05.10 11:19)
> user51 (31.05.10 12:02) [2]
> user51 (31.05.10 12:29) [4]
> user51 (31.05.10 12:53) [6]
> user51 (31.05.10 13:02) [8]
> user51 (31.05.10 14:20) [10]
> user51 (31.05.10 15:31) [12]
Чего тебе надобно, старче?
--
Regards, LVT.
12 (2010-05-31 16:40:00) [28]
> в длл нет же формы чтоб туда таймер положить
timer1 := tTimer.Create;
timer1.interval :=
Медвежонок Пятачок (2010-05-31 16:36:00) [29](в длл нет же формы чтоб туда таймер положить)
положи его себе в карман
Демо (2010-05-31 16:13:00) [30]
> user51 (31.05.10 11:19)
> как в DLL организовать таймер, или вывернуться другим способом.
> dll ведет логи некоторых событий открывает файл пишет закрывает.
> И случается ситуация что события идут очень быстрои до
> того как файл закроется, необходимо записать еще в него,
>
Как ты определяешь момент, когда нужно записать в журнал?
0x00FF00 (2010-05-31 15:51:00) [31]> (в длл нет же формы чтоб туда таймер положить)
А я-то всё думал, откуда появляются вопросы "как запихнуть форму в DLL"...
Можно использовать timeSetEvent/timeKillEvent из mmsystem.dll (с последним параметром, выставленным в TIME_ONESHOT).
http://msdn.microsoft.com/en-us/library/aa448195.aspx
user51 (2010-05-31 15:31:00) [32]а следующая комманда после sleep(5000) - выполнится через 5 сек. ?
мне нужено чтоб сразу , а то что должно выполнится через 5 сек (запись лога) должно выполнится независимо от то что счас делает длл
turbouser (2010-05-31 14:33:00) [33]
> user51 (31.05.10 14:20) [10]
Можно делать sleep :)
user51 (2010-05-31 14:20:00) [34]я так и хотел
а как сами тики таймера организовать в длл ? для меня это самый главный вопрос (в длл нет же формы чтоб туда таймер положить) ,
А это
>если истек, проверяем есть ли "неуспетые" записи.
>если есть, записываем.
>если успешно записались, удаляем их из списка отложенных.
реализовать смогу
Медвежонок Пятачок (2010-05-31 13:13:00) [35]например тот же самый таймер + список "неуспетых" записей.
в тике таймера проверяем, истек ли зазор.
если истек, проверяем есть ли "неуспетые" записи.
если есть, записываем.
если успешно записались, удаляем их из списка отложенных.
user51 (2010-05-31 13:02:00) [36]повторится подождем, важно регистрация происхождения события а не время в которое произошло, можно и час подождать, сейчас пару раз в день не успевает записывать, это без всякой отсрочки. Если можешь подскажи названия каких процедур и функций или способов с помощью которых реализовать можно задержку.
Медвежонок Пятачок (2010-05-31 12:55:00) [37]Маета все это.
Через пять секунд история может повториться (файл будет занят другой операцией записи)
Читай про синхронизацию потоков/процессов.
user51 (2010-05-31 12:53:00) [38]>засечь текущее время.
>подождать пока не пройдет пять секунд.
>сделать то что хотел
ага это я и хотел с помошью чего можно сделать ?
причем работа dll не должна останавливатся на время ожидания
Медвежонок Пятачок (2010-05-31 12:41:00) [39]засечь текущее время.
подождать пока не пройдет пять секунд.
сделать то что хотел
user51 (2010-05-31 12:29:00) [40]в этом и вопрос как записать например через 5 сек, те отсрочить.