Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Вниззаменить sleep в delphi Найти похожие ветки
← →
demonson (2004-03-23 10:07) [0]народ подскажите чем заменить sleep в делфи тк надо выполнить действие через определенный промежуток времени, а не когда система разрешит таймер тоже не подходит тк приложение консольное
← →
Ega23 © (2004-03-23 10:23) [1]GetTickCount в цикле проверять?
← →
demonson (2004-03-23 10:34) [2]а если нужно чтоб приложение в этот момент требовало как можно меньше ресурсов, бездействовало?
← →
pasha_golub © (2004-03-23 10:43) [3]
var TimeToSleep,Time:cardinal;
begin
TimeToSleep := 200; //ms
Time := GetTickCount;
repeat
until (GetTickCount - Time >= TimeToSleep);
end;
← →
Asdor © (2004-03-23 10:55) [4]CreateWaitableTimer + WaitForSingleObject ?
А чем sleep не нравится?
Даже цикл от pasha_golub © (23.03.04 10:43) [3] будет выполнен когда система разрешит (особенности Windows), плюс он начисто сожрет все процессорное время...
← →
demonson (2004-03-23 11:01) [5]В том то и дело что sleep гарантирует что выполнение пороизойдет НЕ раньше установленного времени, а мне нада чтоб и НЕ больше. Уж очень неопределенная вторая граница
← →
Erik © (2004-03-23 11:02) [6]To pasha_golub
А ты сам свой ответ запустить поробовал? Знаеш, что будет?! 100% CPU будет занято!
Я телепатически чувствую, что ты хочеш чтобы окошко двигалось и система ненагружалась. Если это так то:
В переведущей пример вставь
Sleep(50);
Application.PorcessMessage;
Еще вариает, создай отдельный поток(TThread) и в нем Slepp(...) сколько нужно.
← →
demonson (2004-03-23 11:04) [7]2Asdor ты предлагаешь создать объект таймер(такой же как на закладке System)и его использовать?
← →
Erik © (2004-03-23 11:05) [8]Ситемы реального времени на виндах непишутся. Ты раясни полностью задачу, может чего и посоветуем. А пока почитай это:
Таймер который неподведет
http://www.delphikingdom.ru/mastering/timer.htm
← →
demonson (2004-03-23 11:12) [9]Висит программка в памяти выполненна в виде консольного приложения, раз в заданное время надо выполнять кое-какие дейчтвия. Как отсчитать время?
ЗЫ: пример со sleep не устраивает тк нет гарантии, что программа выполнится через указаное время, как показала практика период растягивается иногда оччень надолго,а потом залпом выполняет то что от него тробовалось(не подходит т.к. нужна точность, хотябы примерная а не ~~ когда нибудь)
ЗЗЫ: пример pasha_golub хавает ресурсы что тоже не есть гуд
жду с нетерпением ваших мнений
← →
Romkin © (2004-03-23 11:16) [10]demonson (23.03.04 11:12) [9] нет гарантии, что программа выполнится через указаное время, как показала практика период растягивается иногда оччень надолго
Дык! windows так устроены. Повышай уровень до TIME_CRITICAL, может помочь, но гарантии тебе даже Билл Гейтс не даст :))
Это не система реального времени!!
← →
demonson (2004-03-23 11:17) [11]2Romkin а как быть?
← →
Ega23 © (2004-03-23 11:19) [12]QNX
← →
Asdor © (2004-03-23 11:26) [13]А что в системе-то творится-то время работы программы, что твоя прога не получает процессорного времени?
ЗЫ: пример со sleep не устраивает тк нет гарантии, что программа выполнится через указаное время, как показала практика период растягивается иногда оччень надолго,а потом залпом выполняет то что от него тробовалось(не подходит т.к. нужна точность, хотябы примерная а не ~~ когда нибудь)
Не может она залпом выполнять, т.к. ничего не копится - твой поток просто не получает времени от планировщика потоков. Возможно он даже в sleep не успел войти... :) Для повышения точности - повышай приоритет твоего потока.
← →
Anatoly Podgoretsky © (2004-03-23 11:26) [14]Ни одна многозадачная система реального времени не гарантирует этого. Одни больще другие меньше.
← →
demonson (2004-03-23 11:30) [15]а как быть? Считать в цикле самому только так выходит.(
← →
demonson (2004-03-23 11:30) [16]QNX что это?
← →
Fay © (2004-03-23 11:33) [17]это система мягкого реального времени. Само существование таких понятий, как "мягкое" и "жёсткое" рв говорит о том, что АП прав. 8)
← →
panov © (2004-03-23 13:26) [18]>demonson (23.03.04 11:30) [15]
а как быть? Считать в цикле самому только так выходит
Так хоть сам считай, хоть таймер используй - все едино.
Тебе что, точность нужна до 1мкс?
Если тебе достаточно 10мс, то совершенно спокойно усыпляй поток таймером, перед этим повысив приоритет до максимально возможного.
Если у тебя срабатывает таймер позже, то введи дельту (уменьши время ожидания. Это увеличит вероятность срабатывания ДО заданного времени, после срабатывания проверяй время, дожидаясь нужного значения в цикле, и выполняй нужную операцию...
← →
pasha_golub © (2004-03-23 13:33) [19]Да, конечно. В своем примере я упустил важную деталь. На самом деле тело цикла не должно быть пустым. Это пример для того, чтобы тело цикла работало не более чем... а не наоборот. Для бездействия конечно лучше Sleep, но точно это не сраобтает, как сказано уже выше.
← →
Fay © (2004-03-23 13:34) [20]2panov © (23.03.04 13:26) [18]
Это не повысит точность.
← →
panov © (2004-03-23 14:29) [21]>Fay © (23.03.04 13:34) [20]
Это повысит вероятность срабатывания в заданный промежуток времени, а, следовательно, и точность.
← →
panov © (2004-03-23 14:34) [22]>Fay © (23.03.04 13:34) [20]
Пример:
1. Нужно срабатывание таймера в 10.00
- устанавливаем приоритет потока в TIME_CRITICAL
- устанавливаем таймер в 09.55 на 5 минут-0.01сек.
- в промежутке 10.00-0.01сек. таймер срабатывает в 99.99%случаях из-за высокого приоритета.
- вручную отсчитываем оставшееся до 10.00 время и выполняем необходимую работу ровно в 10.00.
Если такой метод не подходит, то прошу аргументы...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.043 c