Конференция "Начинающим" » как в DLL организовать таймер, или вывернутся другим способом [D5, WinXP]
 
  • user51 (31.05.10 11:19) [0]
    как в DLL организовать таймер, или вывернуться другим способом.
    dll ведет логи некоторых событий открывает файл пишет закрывает. И случается ситуация что события идут очень быстро
    и до того как файл закроется, необходимо записать еще в него,
    сотоветсвенно возникает ошибка. Отловить ее могу, как запустить повторно процесс запись например через пару секунд.
    Второй вопрос как организовать таймер -  выполнять дествия через промежуток времени
  • Медвежонок Пятачок © (31.05.10 11:46) [1]
    а при чем здесь dll?
  • user51 (31.05.10 12:02) [2]
    dll пишет логи , не успевает писать, надо позже записать
  • Медвежонок Пятачок © (31.05.10 12:09) [3]
    ну и запиши позже
  • user51 (31.05.10 12:29) [4]
    в этом и вопрос как записать например через 5 сек, те отсрочить.
  • Медвежонок Пятачок © (31.05.10 12:41) [5]
    засечь текущее время.
    подождать пока не пройдет пять секунд.
    сделать то что хотел
  • user51 (31.05.10 12:53) [6]
    >засечь текущее время.
    >подождать пока не пройдет пять секунд.
    >сделать то что хотел

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

    причем работа dll не должна останавливатся на время ожидания
  • Медвежонок Пятачок © (31.05.10 12:55) [7]
    Маета все это.
    Через пять секунд история может повториться (файл будет занят другой операцией записи)

    Читай про синхронизацию потоков/процессов.
  • user51 (31.05.10 13:02) [8]
    повторится подождем, важно регистрация происхождения события а не время в которое произошло, можно и час подождать, сейчас пару раз в день не успевает записывать, это без всякой отсрочки. Если можешь подскажи названия каких процедур и функций или способов с помощью которых реализовать можно задержку.
  • Медвежонок Пятачок © (31.05.10 13:13) [9]
    например тот же самый таймер + список "неуспетых" записей.
    в тике таймера проверяем, истек ли зазор.
    если истек, проверяем есть ли "неуспетые" записи.
    если есть, записываем.
    если успешно записались, удаляем их из списка отложенных.
  • user51 (31.05.10 14:20) [10]
    я так и хотел
    а как сами тики таймера организовать в длл ? для меня это самый главный вопрос (в длл нет же формы чтоб туда таймер положить) ,

    А это
    >если истек, проверяем есть ли "неуспетые" записи.
    >если есть, записываем.
    >если успешно записались, удаляем их из списка отложенных.
    реализовать смогу
  • turbouser © (31.05.10 14:33) [11]

    > user51   (31.05.10 14:20) [10]

    Можно делать sleep :)
  • user51 (31.05.10 15:31) [12]
    а следующая комманда после sleep(5000) - выполнится через 5 сек. ?
    мне нужено чтоб сразу , а то что должно выполнится через 5 сек (запись лога) должно выполнится независимо от то что счас делает длл
  • 0x00FF00 (31.05.10 15:51) [13]
    > (в длл нет же формы чтоб туда таймер положить)

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

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

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


    Как ты определяешь момент, когда нужно записать в журнал?
  • Медвежонок Пятачок © (31.05.10 16:36) [15]
    (в длл нет же формы чтоб туда таймер положить)

    положи его себе в карман
  • 12 © (31.05.10 16:40) [16]

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

    timer1 := tTimer.Create;
    timer1.interval :=
  • Leonid Troyanovsky © (31.05.10 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.
  • Юрий Зотов © (31.05.10 20:53) [18]
    Непонятно, зачем тут таймер и зачем каждый раз закрывать файл лога.

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

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

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

    > Нужна синхронизация потоков.
    тогда и синхронизация не нужна, и "очередь" сама образуется.
  • turbouser © (31.05.10 22:03) [20]

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

    Для этого достаточно грамотно выставить флаги в программе на открытие файла
  • sniknik © (31.05.10 22:56) [21]
    > Для этого достаточно грамотно выставить флаги в программе на открытие файла
    да конечно, и если вдруг в процессе нужно удалить файл лога, чтобы получить "с нуля" только интересующее, можно "снять" его с открытых ресурсов в системе. но проще все таки закрывать файл после записи.

    вообще, разве сказано, что это только для того чтобы открывать? по моему сказано "чтобы без проблем можно было открывать". почувствуйте разницу как говорится.
  • Юрий Зотов © (31.05.10 23:09) [22]
    > sniknik ©   (31.05.10 21:56) [19]

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

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

    Тут человек говорит, что у него "случается ситуация что события идут очень быстро" -так зачем же еще и переоткрывать файл, тратя на это немалое время, если программа и так не успевает?
  • Скептик (31.05.10 23:25) [23]
    >И случается ситуация что события идут очень быстро
    >и до того как файл закроется, необходимо записать еще в него,
    >сотоветсвенно возникает ошибка. Отловить ее могу, как запустить повторно
    >процесс запись например через пару секунд.


    Ты определись сначала сам, а то у тебя то "очень быстро", то "через пару секунд". Если твои события могут ждать пару секунд, то это не "быстро", это - "медленно". Так что не там ищешь.
  • sniknik © (31.05.10 23:31) [24]
    > -так зачем же еще и переоткрывать файл, тратя на это немалое время, если программа и так не успевает?
    открытие/закрытие мизер по сравнению с Flush. т.е. если подымаешь штангу, то бабочка сверху погоды не сделает (не в мультфильме живем).

    p.s. сомневаюсь я что то, то программа не успевает из-за закрытия файла. если уж есть время на повтор через пару секунд... это времени на десятки, если не на сотни мегабайт записи.
  • Юрий Зотов © (31.05.10 23:33) [25]

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

    Закрытие никак не может быть мизером по сравнению с Flush, потому что при закрытии сначала этот самый Flush и происходит.
  • sniknik © (31.05.10 23:33) [26]
    > Так что не там ищешь.
    как всегда... где угодно, но только не в своем коде/алгоритме. они идеальны.
  • sniknik © (31.05.10 23:36) [27]
    > Закрытие никак не может быть мизером по сравнению с Flush, потому что при закрытии сначала этот самый Flush и происходит.
    именно, оно "тяжелое" только из-за  этого "довеска".
    > выбирает сообщение из очереди, пишет его в лог, сбрасывает буфер лога (Flush)
    а делать его так и так предлагали.
  • sniknik © (31.05.10 23:40) [28]
    кстати можно "померятся"... 100 открытий/закрытий файла без буфера, чтобы сбрасывать нечего было против одного с парой килобайт...
    (не пробовал, чисто теоретически, т.что все честно будет :)
  • sniknik © (01.06.10 00:06) [29]
    нда, видимо диски стали быстрее... на 100 не видно, по нулям практически (пляшет) если "тики" считать. а вот на 1000 повторов открытие/закрытие без записи (а значит и сброса буфера) 48 тиков в среднем, а с записью 250 тиков на ту же тысячу. (т.е. если 100 против 1 то проиграл, 4,8 против 0,25)
  • Медвежонок Пятачок © (01.06.10 09:03) [30]
    > Нужна синхронизация потоков.
    тогда и синхронизация не нужна, и "очередь" сама образуется.


    зато вполне возможно нужна синхронизация процессов.
    кто там наперед знает, как эту длл будут использовать.
  • sniknik © (01.06.10 09:40) [31]
    > зато вполне возможно нужна синхронизация процессов.
    если про авторское решение из ветки, то наверное да... но тогда, я говорил про себя, про принцип в программе, цельной программе, как обычно пишу. т.что как то упустил эту возможную нужду.

    > как эту длл будут использовать.
    как как... да как всегда здесь, в "одно рыло" т.е. скорее всего это будет просто разделение одной программы на 2/? части. совершенно не нужное, чисто из личных "бзиков" автора... пока еще до него дойдет, что оформив это в простой модуль, получишь более простое и удобное решение. (он конечно будет это отрицать, и говорить, что пишет одну dll для кучи программ на куче языков)
  • user51 (01.06.10 11:11) [32]
    Почитал другие форумы, похоже сделать задержку (таймер) без формы не совсем просто как кажется. Пока все советы были теоретическими и нерабочими. Можете проверить. Напишите простую прогу и простую длл
    из проги вызовите любую процедуру и запишите через 5 сек лог что процедура была вызвана причем эти 5 секунд длл должна работать а не тупо ждать 5 секунд.

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

    dll - полный законченный програмный продукт, кроме  нее никаких програм нет и не нужно. Просто наверно вы незнаете что может быть и так. Установил на десяток компов в пятницу,  пишет логи только пока с  пропусками ;).
  • sniknik © (01.06.10 11:20) [33]
    > Просто наверно вы незнаете что может быть и так.
    единственное применение того чего я "не знаю, что может быть и так" это внедрение в IE для разных противоправных действий... больше отдельно стоящая dll никаких ассоциаций не вызывает (при условии, что это не COM/ActivX объект, а именно dll).
  • Anatoly Podgoretsky © (01.06.10 11:22) [34]
    > user51  (01.06.2010 11:11:32)  [32]

    dll - не законченный програмный продукт по определению, для использование
    нужен еще один программный продукт.
  • user51 (01.06.10 11:36) [35]
    Этот проект уже  работает. в IE она не внедряется. Состав проекта - единственная dll. для его работы дополнительно ничего не требуется даже IE.  У dll есть задача она ее выполняет. Проблема с записью логов нарисовалось, если отключть логи вообще она работать хуже не будет. Когда отлажу полностью установлю еще на 100 компов - у меня их около 200.

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

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

    лучше подсказали бы насчет задержки
  • sniknik © (01.06.10 11:38) [36]
    > Пока все советы были теоретическими и нерабочими.
    теоретическими да, т.к. никто не бросился тебе код писать, но нерабочими? посты про потоки успешно проигнорированы? и + "случилась" смена приоритетов... от необходимости задержки из-за ошибки (сомнительной необходимости кстати) вместо устранения этой ошибки, теперь задержка стала самоцелью...
  • sniknik © (01.06.10 11:41) [37]
    > однобоко мыслите ;)
    ну так расширил бы наше мышление, рассказал как оно само по себе работает и что делает.

    p.s. всегда удивляло как люди "гнущие пальцы" о том, что делают крутейшие вещи могут спрашивать о настолько элементарных "проблемах".
  • 12 © (01.06.10 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 (01.06.10 11:46) [39]
    sniknik

    сделайте так

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

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

    помогите человеку если можете.
  • Демо © (01.06.10 12:01) [40]

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


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

    Ответь на вопросы, а то из твоих сообщений ничего не понятно. Вообще.
  • user51 (01.06.10 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;

    это ответ на заданный вопрос
  • Демо © (01.06.10 12:31) [42]

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


    Я бы сказал - жуть.
  • sniknik © (01.06.10 12:31) [43]
    > помогите человеку если можете.
    какая разница могу или не могу? хочу или не хочу вот в чем вопрос... особенно за "Б О Л Ь Ш О Е    С П А С И Б О".

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

    > это ответ на заданный вопрос
    это очень грустно... таймаут как самоцель. я бы считал ответом решение по устранению от ошибки изза которой закрутилась вся эта "бодяга".
 
Конференция "Начинающим" » как в DLL организовать таймер, или вывернутся другим способом [D5, WinXP]
Есть новые Нет новых   [134432   +18][b:0][p:0.001]