Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.07 c
1-1082487598
KLAUS
2004-04-20 22:59
2004.04.11
HELp строку из файла с LAbel


1-1082816283
jiurasic
2004-04-24 18:18
2004.04.11
Как работать с неизвестным типом данных?


4-1076002747
dima_matrix
2004-02-05 20:39
2004.04.11
дочерний процесс


6-1079210061
Russu
2004-03-13 23:34
2004.04.11
ClientSocket+Proxy


1-1082382811
A. Sonin
2004-04-19 17:53
2004.04.11
Собственное создание формы без использования кода в проекте





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский