Форум: "Основная";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
ВнизПотоки Найти похожие ветки
← →
FireMan_Alexey © (2004-05-11 10:19) [0]Ув. Мастера!
Подскажите пожалуйста как определить точное прохождение одной секунды в заданном потоке.
Т.е. нужно при выполнении процедуры Execute в цикле узнать когда пройдет 1-секунда.
Если можно с примерами.
← →
Тимохов © (2004-05-11 10:29) [1]
> Подскажите пожалуйста как определить точное прохождение
>
никак
← →
Тимохов © (2004-05-11 10:34) [2]если не точно, а примерно, то sleep(1000) - заснет примерно на одну секунду, может на две, может на 1000, фиг его знает, но скорее всего примерно на одну...
Можно еще воспользоваться связкой CreateWaitableTimer+WaitForSingleObject (о них читайте в MSDN).
сам не делал никогда, но говорят, что можно повысить приоритет потока - тогда будет точнее, но возможен гиморрой с тормозами во всей системе...
← →
Ozone © (2004-05-11 10:35) [3]Можно так попробовать
GetSystemTime(curTime);
lastTime := curTime;
inc(curTime.wSecond, WAIT);
if curTime.wSecond >= 60 then dec(curTime.wSecond,60);
while lastTime.wSecond <= curTime.wSecond do GetSystemTime(lastTime);
где WAIT - количество секунд
← →
Style © (2004-05-11 10:51) [4]
> Ozone © (11.05.04 10:35) [3]
Ну и CPU, будет на 100% ипользоваться.
← →
pasha_golub © (2004-05-11 10:51) [5]Именно ТОЧНО низзя, а примерно можно.
Windows is not RTOS!
← →
Тимохов © (2004-05-11 10:53) [6]
> Style © (11.05.04 10:51) [4]
имхо не весь cpu, скорее только то время cpu, которое выделяется данному потоку, что, наверное, тоже нехорошо.
так вроде...
я за sleep :))
← →
Erik © (2004-05-11 11:08) [7]Ты точнее опиши задачу. Можеш почитать на королевстве статью "таймер который неподведет", давольно хорошо расписаны все проблемы со срабатыванием в конкретный период времени + исходники.
← →
Style © (2004-05-11 11:28) [8]
> имхо не весь cpu, скорее только то время cpu, которое выделяется
> данному потоку, что, наверное, тоже нехорошо.
>
> так вроде...
Я лишь перевел то, что мне пишет Task Manager
CPU-Usage 100% :)
P.S. я тоже за Sleep, только если время использую в расчетах, то после Sleep высчитываю сколько реально прошло времени.
← →
panov © (2004-05-11 12:09) [9]Sleep +
TThread.Priority =tpHighest
← →
Fay © (2004-05-11 12:34) [10]
> Sleep +
> TThread.Priority =tpHighest
А если там другой джигит?
← →
Мунька © (2004-05-11 12:38) [11]Для чего Вам это надо? Задержать на 1 секунду? По истечении 1 секунды что-то сделать? Или что? Если задержать Sleep(1000), что-то сделать - запустите таймер и не мучайтесь. Можно еще масштабированным циклом. От задачи зависит.
Да и вообще WIN - не есть система реального времени. 1 секунда будет весьма относительной.
← →
panov © (2004-05-11 13:19) [12]>Fay © (11.05.04 12:34) [10]
А если там другой джигит?
Это о чем?
← →
Fay © (2004-05-11 13:41) [13]TThread.Priority =tpHighest - это ничего не даст
← →
panov © (2004-05-11 13:49) [14]>Fay © (11.05.04 13:41) [13]
Даст.
По истечении интервала ожидания в Sleep система переключится на выполнение первого потока, у которого наивысший приоритет, затем следующий, приоритет которого ниже.
таким образом, из всех потоков управление получит быстрее всех тот, приоритет которого выше.
← →
panov © (2004-05-11 13:49) [15]Удалено модератором
Примечание: Дубль
← →
Fay © (2004-05-11 13:52) [16]Можно подумать, что процесс один. Пойду проверю 8)
← →
panov © (2004-05-11 13:53) [17]>Fay © (11.05.04 13:41) [13]
Так управление получает поток, а не процесс-)
← →
Тимохов © (2004-05-11 14:01) [18]
> panov © (11.05.04 13:49) [14]
> >Fay © (11.05.04 13:41) [13]
> Даст.
>
> По истечении интервала ожидания в Sleep система переключится
> на выполнение первого потока, у которого наивысший приоритет,
> затем следующий, приоритет которого ниже.
Имхо.
Гарантированного ожидания в одну сек. это все равно не даст:
1. На факт, что нет другого потока таким же высоким приоритетом.
2. Потоки с низшим приоритетом, которые испытывают голодание также могут получить время (иногда).
Т.е. мое имхо такое (как я сказал в начале) - повышение приоритета повысит точность, но не на 100 процентов.
← →
panov © (2004-05-11 14:08) [19]>Тимохов © (11.05.04 14:01) [18]
1. На факт, что нет другого потока таким же высоким приоритетом.
Ну естественно.
2. Потоки с низшим приоритетом, которые испытывают голодание также могут получить время (иногда).
При наличии активных потоков с более высоким приоритетом - не получат.
Конечно, 100%-точности не даст, но позволит интервал получить интервал времени, максимально близкий к 1сек.
← →
Тимохов © (2004-05-11 14:15) [20]
> 2. Потоки с низшим приоритетом, которые испытывают голодание
> также могут получить время (иногда).
>
> При наличии активных потоков с более высоким приоритетом
> - не получат.
>
> Конечно, 100%-точности не даст, но позволит интервал получить
> интервал времени, максимально близкий к 1сек.
Насколько я помню рихтера, а читал его я недавно, потоки, которые испытывают голодание все равно получат время (только мало и редко) т.к. временно из приоритет будет поднят так, что они попадут в планирование, потому будет опущен.
Вообще говоря я дома это проверял - у меня один поток был норамал, другой наест (в нем крутился while true do;)- нормал получал время, но редко.
← →
panov © (2004-05-11 14:20) [21]>[20] Тимохов © (11.05.04 14:15)
Согласен-)
Но мне кажется, что не стоит их принимать во внимание-)
← →
FireMan_Alexey © (2004-05-11 14:54) [22]Скажите а если использовать GetTickCount, то он показывает кол-во тиков в милисекундах, но ведь таймер компа срабатывает через 55-мс т.е. секунда это 18,2 раза срабатывания. Дело вот в чем
у меня WaitForSingleObject(...,...,time_out=100 мс)
но срабатывание может произойти раньше и поэтому мне нужно приблизительно знать когда прошла секунда.
Конечно хотелось бы по точнее, если есть таковые примеры или ссылки!
← →
panov © (2004-05-11 15:09) [23]Если тебе нужно измерение точнее, используй
QueryPerformanceCounter
QueryPerformanceFrequency
← →
FireMan_Alexey © (2004-05-11 15:22) [24]Если можно по подробней, что мне делать с этими функциями?
Как именно мне достать нужную величину?
да и еще
function QueryPerformanceCounter(var lpPerformanceCount: TLargeInteger): BOOL;
Функция возвращает текущее значение счетчика производительности, если такой существует.
Параметры:
lpPerformanceCount: указатель на переменную,в которую функция записывает текущее значение счетчика. Если аппаратное обеспечение не поддерживает счетчик , этот параметр может быть равен нулю.
Возвращаемые значения
Если ппаратное обеспечение поддерживает счетчик производительности, то возвращается ненулевое значение и нуль в противном случае.
А если аппаратное не поддерживает?
Может я что-то не понимаю, но из утверждения разработчиков я понимаю, что моя программа не всегда будет работоспособна.
← →
Тимохов © (2004-05-11 15:27) [25]
> FireMan_Alexey © (11.05.04 15:22) [24]
предлагаю пойти с другого конца:
1. раскажите о вашей задаче.
2. предъявите ваши требования.
думаю так легче подобрать решение.
← →
panov © (2004-05-11 15:32) [26]>Тимохов © (11.05.04 15:27) [25]
предлагаю пойти с другого конца:
1. раскажите о вашей задаче.
2. предъявите ваши требования.
думаю так легче подобрать решение.
ТОчно!
Иногда решение задачи находится совсем не там, где его искал-)
← →
FireMan_Alexey © (2004-05-11 15:56) [27]У меня есть 2-сокета которые я опрашиваю с интервалом 100 мс
мне нужно если есть какие-то данные то через каждое N-е кол-во секунд я должен отсылать данные с указанным кол-вом байт.
← →
Тимохов © (2004-05-11 16:19) [28]
> FireMan_Alexey © (11.05.04 15:56) [27]
вы поймите, что точно у вас все равно не выйдет сделать.
Посполльзуетсесь ttimer с интервалом равным 1000 (т.е. примерно 1 сек).
Чем плох вариант?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.032 c