точний подсчет времени

Тема в разделе "WASM.BEGINNERS", создана пользователем XshStasX, 17 фев 2009.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    значит мне надо сделать вот такую штуку:
    есть поток который с задержкой в минуту вызывает другую процедуру... но проблема в том что задержка в потооке осуществляеться не точно(
    и каждый раз из-за этого у меня идут потери во времени)))
    на таймере тоже самое быходить, я делал так на форму кидал таймер и вызывал указаную процедуру раз минуту тоже были подобные проблемы(
    мож кто подскажет ка можна более точно контролировать задержку в потоке или что-то подобное реализовать?
    в тему я прикрепил программу которая это реализует, а также скрипт для показа этой проблемы(это интерпретатор)
     
  2. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    вот в этом коде и есть проблемы:
    procedure TSony.timer();
    begin
    repeat
    sleep(60000);//здесь не всегда точно в минуту задержка(((
    TSony(self).Time;//а здесь макс. потери около 1сек, но они оч.
    ////редки...
    until com_='';
    end;
    думаю еще попробывать запустить эту процедуру TSony(self).Time в отдельном потоке тогда потери времени будут меньше...
    эта процедура находиться в модуле tel, которий прикреплен к теме
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    XshStasX
    Используй мультимидийный таймер.
    Хотя повсему тебе сторожевой тамер нужен.

    RTFM
    А еще неплохобы прочитать. Джеффри РИХТЕР. Windows для профессионалов
     
  4. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Используй мультимидийный таймер.
    Хотя повсему тебе сторожевой тамер нужен.

    А это какие такие таймера??? если они в этой книге то ее скачать сейчас не смогу((((
    вот переделал так:
    Код (Text):
    1. procedure TSony.timer();
    2. var
    3.  id:DWORD;
    4.  B:Boolean; //а почему невидиться в проц. New???(она ведь глобальная для нее.
    5. Function New_(p:Pointer):integer;
    6. var
    7.  I:Integer;
    8. begin
    9. if b then
    10. begin
    11. Result:=0;
    12. if not TSony(p).TimeStart then   exit;
    13. for i:=1 to TSony(p).StateLine.line.count do
    14. if (TSony(p).StateLine.TimeStart[i]<>-1)and(TSony(p).StateLine.line.line[i].stat<=1) then
    15.  inc(TSony(p).StateLine.TimeStart[i]);
    16. end else
    17. begin
    18.  B:=true;
    19.  TSony(p).Time;
    20. end;
    21. b:=false;
    22. end;
    23. begin
    24.  
    25. B:=false;
    26. repeat
    27.  sleep(60000);
    28.  BeginThread(nil,0,@new_,self,0,id);
    29. until com_='';
    30. end;
    как думаете так более точно будет??
    сейчас пока буду тестировать на телефоне
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    SetTimer(Дескриптор окна, Номер, Период, Процедура)
    Дескриптор окна = Form.Handle
    Номер - Любой номер какой нравится в разумных пределах
    Период - Периодичность вызова процедуры
    Процедура - Указатель на процедуру вида
    function (Handle, Message, WParam, LParam):Result;stdcall;
    подробнее смотри Help>Windows SDK в Delphi
     
  6. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Да знаю я....но нет желания с ним работать(
    да и пробывал стандартный таймер в дельфи, я ж думаю его там то подобним обрзом сделали.
    А вот про мультимидийный и сторожевой таймер мне очень интересно, ето что?
     
  7. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
    Sleep - наименее точный метод отмерения времени в win. SetTimer - следующий по точности.

    Читайте описание SetWaitableTimer. Например, здесь.


    Также, оффтоп.
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    XshStasX
    Ага, продолжаешь блуждать в 3-х соснах ;) Значит ответы 1 и 2 тебя ничему не научили, и справку видать читал - не дочитал.
    Повторяю: функция потока (как и любая другая callback-функция, передаваемая в другую функцию) может работать только с переданным ей параметром и с глобальными переменными, объявленными на уровне модуля. Локальные переменные и параметры функций глобальными не являются, т.к. размещаются в стеке, обращение к ним осущ-ся не по абсолютным ("глобальным") адресам, а по смещениям относительно текущего значения регистра EBP и соотв-но обращаться к ним можно только в контексте данной функции.
    Поэтому если callback-функция является вложенной в другую ф-ю и "не дай бог" ссылается на локальные переменные или параметры вышестоящей функции, то при ее вызове в другом контексте значение регистра EBP будет ес-но другим и обращение будет происходить "фиг знает куда" (тем более, что у каждого потока вообще свой стек и ес-но никакой переменной B в стеке нового потока вообще нет).

    Резюме:
    1) Чтобы в очередной раз не наступать на грабли, вытащи свою функцию New_ "наружу", т.е. сделай ее не вложенной
    2) Если переменная B должна быть общей для всех потоков, то либо сделай ее глобальной, либо включи ее в класс TSony и соотв-но обращайся к ней как TSony(p).B