Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

как в DLL организовать таймер, или вывернутся другим способом   Найти похожие ветки 

 
user51   (2010-05-31 11:19) [0]

как в DLL организовать таймер, или вывернуться другим способом.
dll ведет логи некоторых событий открывает файл пишет закрывает. И случается ситуация что события идут очень быстро
и до того как файл закроется, необходимо записать еще в него,
сотоветсвенно возникает ошибка. Отловить ее могу, как запустить повторно процесс запись например через пару секунд.
Второй вопрос как организовать таймер -  выполнять дествия через промежуток времени


 
Медвежонок Пятачок ©   (2010-05-31 11:46) [1]

а при чем здесь dll?


 
user51   (2010-05-31 12:02) [2]

dll пишет логи , не успевает писать, надо позже записать


 
Медвежонок Пятачок ©   (2010-05-31 12:09) [3]

ну и запиши позже


 
user51   (2010-05-31 12:29) [4]

в этом и вопрос как записать например через 5 сек, те отсрочить.


 
Медвежонок Пятачок ©   (2010-05-31 12:41) [5]

засечь текущее время.
подождать пока не пройдет пять секунд.
сделать то что хотел


 
user51   (2010-05-31 12:53) [6]

>засечь текущее время.
>подождать пока не пройдет пять секунд.
>сделать то что хотел

ага это я и хотел с помошью чего можно сделать ?

причем работа dll не должна останавливатся на время ожидания


 
Медвежонок Пятачок ©   (2010-05-31 12:55) [7]

Маета все это.
Через пять секунд история может повториться (файл будет занят другой операцией записи)

Читай про синхронизацию потоков/процессов.


 
user51   (2010-05-31 13:02) [8]

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


 
Медвежонок Пятачок ©   (2010-05-31 13:13) [9]

например тот же самый таймер + список "неуспетых" записей.
в тике таймера проверяем, истек ли зазор.
если истек, проверяем есть ли "неуспетые" записи.
если есть, записываем.
если успешно записались, удаляем их из списка отложенных.


 
user51   (2010-05-31 14:20) [10]

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

А это
>если истек, проверяем есть ли "неуспетые" записи.
>если есть, записываем.
>если успешно записались, удаляем их из списка отложенных.
реализовать смогу


 
turbouser ©   (2010-05-31 14:33) [11]


> user51   (31.05.10 14:20) [10]

Можно делать sleep :)


 
user51   (2010-05-31 15:31) [12]

а следующая комманда после sleep(5000) - выполнится через 5 сек. ?
мне нужено чтоб сразу , а то что должно выполнится через 5 сек (запись лога) должно выполнится независимо от то что счас делает длл


 
0x00FF00   (2010-05-31 15:51) [13]

> (в длл нет же формы чтоб туда таймер положить)

А я-то всё думал, откуда появляются вопросы "как запихнуть форму в DLL"...

Можно использовать timeSetEvent/timeKillEvent из mmsystem.dll (с последним параметром, выставленным в TIME_ONESHOT).
http://msdn.microsoft.com/en-us/library/aa448195.aspx


 
Демо ©   (2010-05-31 16:13) [14]


> user51   (31.05.10 11:19) 
> как в DLL организовать таймер, или вывернуться другим способом.
> dll ведет логи некоторых событий открывает файл пишет закрывает.
>  И случается ситуация что события идут очень быстрои до
> того как файл закроется, необходимо записать еще в него,
>


Как ты определяешь момент, когда нужно записать в журнал?


 
Медвежонок Пятачок ©   (2010-05-31 16:36) [15]

(в длл нет же формы чтоб туда таймер положить)

положи его себе в карман


 
12 ©   (2010-05-31 16:40) [16]


> в длл нет же формы чтоб туда таймер положить

timer1 := tTimer.Create;
timer1.interval :=


 
Leonid Troyanovsky ©   (2010-05-31 18:02) [17]


> 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.


 
Юрий Зотов ©   (2010-05-31 20:53) [18]

Непонятно, зачем тут таймер и зачем каждый раз закрывать файл лога.

Нужна очередь сообщений для лога. Один поток кладет сообщения в очередь, другой поток (в цикле) выбирает сообщение из очереди, пишет его в лог, сбрасывает буфер лога (Flush), удаляет сообщение из очереди и ждет нового сообщения. В начале работы программы файл лога открывается (один раз), в конце - закрывается (тоже один раз).

Нужна синхронизация потоков.


 
sniknik ©   (2010-05-31 21:56) [19]

> зачем каждый раз закрывать файл лога.
ну например чтобы без проблем можно было открывать лог параллельно с работающей программой.

> Один поток кладет сообщения в очередь, другой поток (в цикле) выбирает сообщение из очереди
всегда обходился одним, "выбирающим", а вместо "кладущего" простой постмесейж потоку с сообщением в PChar.

> Нужна синхронизация потоков.
тогда и синхронизация не нужна, и "очередь" сама образуется.


 
turbouser ©   (2010-05-31 22:03) [20]


> sniknik ©   (31.05.10 21:56) [19]
>
> > зачем каждый раз закрывать файл лога.
> ну например чтобы без проблем можно было открывать лог параллельно
> с работающей программой.

Для этого достаточно грамотно выставить флаги в программе на открытие файла


 
sniknik ©   (2010-05-31 22:56) [21]

> Для этого достаточно грамотно выставить флаги в программе на открытие файла
да конечно, и если вдруг в процессе нужно удалить файл лога, чтобы получить "с нуля" только интересующее, можно "снять" его с открытых ресурсов в системе. но проще все таки закрывать файл после записи.

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


 
Юрий Зотов ©   (2010-05-31 23:09) [22]

> sniknik ©   (31.05.10 21:56) [19]

Это уже вопрос реализации, а суть все равно та же.

> sniknik ©   (31.05.10 22:56) [21]

Тут человек говорит, что у него "случается ситуация что события идут очень быстро" -так зачем же еще и переоткрывать файл, тратя на это немалое время, если программа и так не успевает?


 
Скептик   (2010-05-31 23:25) [23]

>И случается ситуация что события идут очень быстро
>и до того как файл закроется, необходимо записать еще в него,
>сотоветсвенно возникает ошибка. Отловить ее могу, как запустить повторно
>процесс запись например через пару секунд.


Ты определись сначала сам, а то у тебя то "очень быстро", то "через пару секунд". Если твои события могут ждать пару секунд, то это не "быстро", это - "медленно". Так что не там ищешь.


 
sniknik ©   (2010-05-31 23:31) [24]

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

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


 
Юрий Зотов ©   (2010-05-31 23:33) [25]


> sniknik ©   (31.05.10 23:31) [24]

Закрытие никак не может быть мизером по сравнению с Flush, потому что при закрытии сначала этот самый Flush и происходит.


 
sniknik ©   (2010-05-31 23:33) [26]

> Так что не там ищешь.
как всегда... где угодно, но только не в своем коде/алгоритме. они идеальны.


 
sniknik ©   (2010-05-31 23:36) [27]

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


 
sniknik ©   (2010-05-31 23:40) [28]

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


 
sniknik ©   (2010-06-01 00:06) [29]

нда, видимо диски стали быстрее... на 100 не видно, по нулям практически (пляшет) если "тики" считать. а вот на 1000 повторов открытие/закрытие без записи (а значит и сброса буфера) 48 тиков в среднем, а с записью 250 тиков на ту же тысячу. (т.е. если 100 против 1 то проиграл, 4,8 против 0,25)


 
Медвежонок Пятачок ©   (2010-06-01 09:03) [30]

> Нужна синхронизация потоков.
тогда и синхронизация не нужна, и "очередь" сама образуется.


зато вполне возможно нужна синхронизация процессов.
кто там наперед знает, как эту длл будут использовать.


 
sniknik ©   (2010-06-01 09:40) [31]

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

> как эту длл будут использовать.
как как... да как всегда здесь, в "одно рыло" т.е. скорее всего это будет просто разделение одной программы на 2/? части. совершенно не нужное, чисто из личных "бзиков" автора... пока еще до него дойдет, что оформив это в простой модуль, получишь более простое и удобное решение. (он конечно будет это отрицать, и говорить, что пишет одну dll для кучи программ на куче языков)


 
user51   (2010-06-01 11:11) [32]

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

>как как... да как всегда здесь, в "одно рыло" т.е. скорее всего это будет >просто разделение одной программы на 2/? части. совершенно не нужное, >чисто из личных "бзиков" автора... пока еще до него дойдет, что оформив это >в простой модуль, получишь более простое и удобное решение. (он конечно >будет это отрицать, и говорить, что пишет одну dll для кучи программ на куче >языков)

dll - полный законченный програмный продукт, кроме  нее никаких програм нет и не нужно. Просто наверно вы незнаете что может быть и так. Установил на десяток компов в пятницу,  пишет логи только пока с  пропусками ;).


 
sniknik ©   (2010-06-01 11:20) [33]

> Просто наверно вы незнаете что может быть и так.
единственное применение того чего я "не знаю, что может быть и так" это внедрение в IE для разных противоправных действий... больше отдельно стоящая dll никаких ассоциаций не вызывает (при условии, что это не COM/ActivX объект, а именно dll).


 
Anatoly Podgoretsky ©   (2010-06-01 11:22) [34]

> user51  (01.06.2010 11:11:32)  [32]

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


 
user51   (2010-06-01 11:36) [35]

Этот проект уже  работает. в IE она не внедряется. Состав проекта - единственная dll. для его работы дополнительно ничего не требуется даже IE.  У dll есть задача она ее выполняет. Проблема с записью логов нарисовалось, если отключть логи вообще она работать хуже не будет. Когда отлажу полностью установлю еще на 100 компов - у меня их около 200.

>это внедрение в IE для разных противоправных действий... больше отдельно стоящая dll никаких ассоциаций не вызывает

однобоко мыслите ;)

лучше подсказали бы насчет задержки


 
sniknik ©   (2010-06-01 11:38) [36]

> Пока все советы были теоретическими и нерабочими.
теоретическими да, т.к. никто не бросился тебе код писать, но нерабочими? посты про потоки успешно проигнорированы? и + "случилась" смена приоритетов... от необходимости задержки из-за ошибки (сомнительной необходимости кстати) вместо устранения этой ошибки, теперь задержка стала самоцелью...


 
sniknik ©   (2010-06-01 11:41) [37]

> однобоко мыслите ;)
ну так расширил бы наше мышление, рассказал как оно само по себе работает и что делает.

p.s. всегда удивляло как люди "гнущие пальцы" о том, что делают крутейшие вещи могут спрашивать о настолько элементарных "проблемах".


 
12 ©   (2010-06-01 11:45) [38]

с фига не рабочими?
вот тока что накидал

var
 Form1: TForm1;
 MMM : function:integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
 LibHandle : tHandle;
begin
 @MMM := nil;
 LibHandle := LoadLibrary("DLL1.DLL");
 if LibHandle >= 32 then begin
   @MMM := GetProcAddress(LibHandle,"Text");
   if @MMM <> nil
      then MMM
      else showmessage("");

procedure MMM;
begin
 ShowMessage("MMM");
end;

function Text:integer; stdcall;
var
  t:tTimer;
  MyEvnt : TMethod;
begin
 MyEvnt.Code := @MMM;
 MyEvnt.Data := nil;
 t := tTimer.Create(nil);
 t.Enabled := false;
 t.Interval := 9000;
 t.OnTimer := TNotifyEvent(MyEvnt);
 t.Enabled := true;

 result := 0;
end;
exports Text;
{$R *.res}
begin
end.
----------------------------

> dll - полный законченный програмный продукт, кроме  нее
> никаких програм нет и не нужно. Просто наверно вы незнаете
> что может быть и так.

кто еще кроме вас так считает?


 
user51   (2010-06-01 11:46) [39]

sniknik

сделайте так

Напишите простую прогу и простую длл
из проги вызовите любую процедуру и запишите через 5 сек лог что процедура была вызвана причем эти 5 секунд длл должна работать а не тупо ждать 5 секунд.

и я ВАМ скажу  Б О Л Ь Ш О Е    С П А С И Б О.

помогите человеку если можете.


 
Демо ©   (2010-06-01 12:01) [40]


> из проги вызовите любую процедуру и запишите через 5 сек
> лог


Почему через 5 сек., а не через 10?
Как организовано взаимодействие основного приложения и DLL?

Ответь на вопросы, а то из твоих сообщений ничего не понятно. Вообще.



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

Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.06 c
3-1238562946
TheEd
2009-04-01 09:15
2010.08.27
как вычитать isert ы, произошедшие в триггере одной из таблиц


2-1268827094
Delphist
2010-03-17 14:58
2010.08.27
DBLookupListBox


2-1269931142
oleg1963lora
2010-03-30 10:39
2010.08.27
TStringList.Clear. Странное поведение метода


15-1266060403
GanibalLector
2010-02-13 14:26
2010.08.27
Транссиб


2-1274083814
Сид
2010-05-17 12:10
2010.08.27
TDBLookupComboBox для редактирования поля





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