Вниз
Скачать: CL | DM;

как в 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?

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


← →
user51   (2010-06-01 12:26) [41]

12 © СПАСИБО

это то что нужно было

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;

это ответ на заданный вопрос


← →
Демо ©   (2010-06-01 12:31) [42]


> это то что нужно было


Я бы сказал - жуть.


← →
sniknik ©   (2010-06-01 12:31) [43]

> помогите человеку если можете.
какая разница могу или не могу? хочу или не хочу вот в чем вопрос... особенно за "Б О Л Ь Ш О Е    С П А С И Б О".

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

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



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

Скачать: CL | DM;



Память: 0.58 MB
Время: -0.95 c
2-1265475416
Алексей2010
2010-02-06 19:56
2010.08.27
Не уничтожается класс с 0 индексом


15-1269808204
Юрий
2010-03-29 00:30
2010.08.27
С днем рождения ! 29 марта 2010 понедельник


15-1265369204
Тайлер Дерден
2010-02-05 14:26
2010.08.27
1С, терминальный сервер и печать


15-1271991405
вт
2010-04-23 06:56
2010.08.27
Исходник, пример подобный Криптоконтейнер


15-1275337781
Юрий
2010-06-01 00:29
2010.08.27
С днем рождения ! 1 июня 2010 вторник




   Наверх