Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.034 c
14-1083483352
kldstat
2004-05-02 11:35
2004.05.23
Отпуск


7-1081233438
random
2004-04-06 10:37
2004.05.23
привод CD-Rom


1-1083909947
bon
2004-05-07 10:05
2004.05.23
TToolBar &amp; TToolButton


3-1083324280
snake1977
2004-04-30 15:24
2004.05.23
ORACLE &amp; InterBase


14-1083325598
WondeRu
2004-04-30 15:46
2004.05.23
Глупый вопрос, но....





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский