значит мне надо сделать вот такую штуку: есть поток который с задержкой в минуту вызывает другую процедуру... но проблема в том что задержка в потооке осуществляеться не точно( и каждый раз из-за этого у меня идут потери во времени))) на таймере тоже самое быходить, я делал так на форму кидал таймер и вызывал указаную процедуру раз минуту тоже были подобные проблемы( мож кто подскажет ка можна более точно контролировать задержку в потоке или что-то подобное реализовать? в тему я прикрепил программу которая это реализует, а также скрипт для показа этой проблемы(это интерпретатор)
вот в этом коде и есть проблемы: procedure TSony.timer(); begin repeat sleep(60000);//здесь не всегда точно в минуту задержка((( TSony(self).Time;//а здесь макс. потери около 1сек, но они оч. ////редки... until com_=''; end; думаю еще попробывать запустить эту процедуру TSony(self).Time в отдельном потоке тогда потери времени будут меньше... эта процедура находиться в модуле tel, которий прикреплен к теме
XshStasX Используй мультимидийный таймер. Хотя повсему тебе сторожевой тамер нужен. RTFM А еще неплохобы прочитать. Джеффри РИХТЕР. Windows для профессионалов
Используй мультимидийный таймер. Хотя повсему тебе сторожевой тамер нужен. А это какие такие таймера??? если они в этой книге то ее скачать сейчас не смогу(((( вот переделал так: Код (Text): procedure TSony.timer(); var id:DWORD; B:Boolean; //а почему невидиться в проц. New???(она ведь глобальная для нее. Function New_(p:Pointer):integer; var I:Integer; begin if b then begin Result:=0; if not TSony(p).TimeStart then exit; for i:=1 to TSony(p).StateLine.line.count do if (TSony(p).StateLine.TimeStart[i]<>-1)and(TSony(p).StateLine.line.line[i].stat<=1) then inc(TSony(p).StateLine.TimeStart[i]); end else begin B:=true; TSony(p).Time; end; b:=false; end; begin B:=false; repeat sleep(60000); BeginThread(nil,0,@new_,self,0,id); until com_=''; end; как думаете так более точно будет?? сейчас пока буду тестировать на телефоне
SetTimer(Дескриптор окна, Номер, Период, Процедура) Дескриптор окна = Form.Handle Номер - Любой номер какой нравится в разумных пределах Период - Периодичность вызова процедуры Процедура - Указатель на процедуру вида function (Handle, Message, WParam, LParam):Result;stdcall; подробнее смотри Help>Windows SDK в Delphi
Да знаю я....но нет желания с ним работать( да и пробывал стандартный таймер в дельфи, я ж думаю его там то подобним обрзом сделали. А вот про мультимидийный и сторожевой таймер мне очень интересно, ето что?
Sleep - наименее точный метод отмерения времени в win. SetTimer - следующий по точности. Читайте описание SetWaitableTimer. Например, здесь. Также, оффтоп.
XshStasX Ага, продолжаешь блуждать в 3-х соснах Значит ответы 1 и 2 тебя ничему не научили, и справку видать читал - не дочитал. Повторяю: функция потока (как и любая другая callback-функция, передаваемая в другую функцию) может работать только с переданным ей параметром и с глобальными переменными, объявленными на уровне модуля. Локальные переменные и параметры функций глобальными не являются, т.к. размещаются в стеке, обращение к ним осущ-ся не по абсолютным ("глобальным") адресам, а по смещениям относительно текущего значения регистра EBP и соотв-но обращаться к ним можно только в контексте данной функции. Поэтому если callback-функция является вложенной в другую ф-ю и "не дай бог" ссылается на локальные переменные или параметры вышестоящей функции, то при ее вызове в другом контексте значение регистра EBP будет ес-но другим и обращение будет происходить "фиг знает куда" (тем более, что у каждого потока вообще свой стек и ес-но никакой переменной B в стеке нового потока вообще нет). Резюме: 1) Чтобы в очередной раз не наступать на грабли, вытащи свою функцию New_ "наружу", т.е. сделай ее не вложенной 2) Если переменная B должна быть общей для всех потоков, то либо сделай ее глобальной, либо включи ее в класс TSony и соотв-но обращайся к ней как TSony(p).B