Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Потоки   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.024 c
1-1083862732
Алексей Петухов
2004-05-06 20:58
2004.05.23
OnClose в объекте TToolBar


7-1082164913
Ivanov
2004-04-17 05:21
2004.05.23
Время из системных часов


1-1084297006
Oleg_
2004-05-11 21:36
2004.05.23
ошибка при открытии файла excel


1-1083943549
DDA
2004-05-07 19:25
2004.05.23
Result=PChar(s)


14-1083249319
Goida
2004-04-29 18:35
2004.05.23
А мне только что досталась лицензионная версия Borland C++!!!