информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / networking
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Ну не может винда меньше! Механизм многопоточности у неё такой ;-) Крути цикл, если надо меньше. 11.07.03 13:01  Число просмотров: 1569
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
<networking>
sleep 11.07.03 11:14   [Ktirf]
Автор: guest Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Привет!

В прграмминг не пускают, поэтому спрашиваю здесь.

Как усыпить поток меньше чем на 1 миллисекунду?
(Скажем 500 микросекунд?)

Вариант с прокручиванием цикла и GetSystemTime не предлагать.

Цель: отправить в сеть дамп winpcap'а точно в том тайминге, в котором он записан. Разрешение таймстемпов там в микросекундах...

Спасибо.
sleep 11.07.03 11:46  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
> Привет!
>
> В прграмминг не пускают, поэтому спрашиваю здесь.

Зарегистрируйтесь и пустят (проблем с регистрацией вроде бы нет).
А то здесь не принято сообщения в другие темы закидывть.
Да и редактировать их можно.

> Как усыпить поток меньше чем на 1 миллисекунду?
> (Скажем 500 микросекунд?)
>
> Вариант с прокручиванием цикла и GetSystemTime не
> предлагать.

Извиняюсь, я под сеть на таком уровне не писал, но имею некоторые знания, чем и поделиться хочу. Произвести какие либо действия через заданный промежуток времени можно всего двумя способами: Задать некоторому эталонному устройству измерения времени (будильник, таймер, ...) задание - подать сигнал через заданное время, как сигнал пришел - выполнить действие. Второй способ - запомнить настоящее время и периодически посматривать на часы, как только время станет запомненное плюс заданное или больше настало время выполнять заданное действие.
Третий же вариант, который давно использовали малограмотные программисты, заключается в эмуляции таймера и аналогичен второму. Засекается время выполнения какого-либо действия, выполнив это действие несколько раз и замерив общее время, затем разделить общее время на количество действий и запомнить время одного цикла. Для вычисления количества циклов нужно заданное время задержки разделить на время одного цикла.
Последние два варианта наименее практичны, так как обязуют заниматься бесполезной работой. Для реализации первого способа был придуман для компьютера таймер, который умеет отмерять время с точностью одна микросекунда, и система прерываний.
Еще раз извиняюсь за то, что так все подробно описал. Это я к тому, что кроме этих двух вариантов других, принципиально отличающихся от них не существует. А Вы в своем вопросе пишете, что циклические опросы и работу с системным таймером не предлагать. Не выйдет похоже по-другому.

> Цель: отправить в сеть дамп winpcap'а точно в том тайминге,
> в котором он записан. Разрешение таймстемпов там в
> микросекундах...
>
> Спасибо.
sleep 11.07.03 12:47  
Автор: guest Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Спасибо за ответ,

Тема не совсем неправильная, так как конечная цель все же связана с сетью.

Проблема как раз втом, что стандартным способом (через SetTimer) разрешение для таймера задается также с разрешением в МИЛЛИсекундах.

Для работы с high-resolution performance counter отсутствуют (или я их не нашел) асинхронные функции, который позволили бы не заниматься тупым опросом в цикле.

Опять спасибо, в след. раз зарегистрируюсь.
Settimer очень неточен. 11.07.03 12:59  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
> Проблема как раз втом, что стандартным способом (через
> SetTimer) разрешение для таймера задается также с
> разрешением в МИЛЛИсекундах.
Задаётся-то оно так, но попробуй задать 1, но померяй сколько реально их было. С удивлением увидишь, что около 15 ;-) Максимум, что можно сделать, это юзать мультимедийные таймеры.
Забыл - ось Windows 2000 11.07.03 11:15  
Автор: guest Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Попробуй поискать в MSDN "Multimedia Timer Functions" — может оно и поможет ;-) 11.07.03 12:39  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 11.07.03 12:54  Количество правок: 1
<"чистая" ссылка>
НО минимальное разрешение таймера там 1 миллисекунда (обычно).

Я тайминги софтины, что выдала тебе лог, мерялись скорее всего с помощью QueryPerformanceCounter() и QueryPerformanceFrequency(), но это тебе ничего не даёт, поскольку остановить поток меньше чем на TIMECAPS.wPeriodMin не получится (imho).
Поискал... 11.07.03 12:55  
Автор: guest Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Спасибо,

Похоже не подходит:

These timer services are useful for applications that demand high-resolution timing. For example, a MIDI sequencer requires a high-resolution timer because it must maintain the pace of MIDI events within a resolution of 1 millisecond.

И интервалы в функциях опять задаются с точностью до миллисекунд...
Ну не может винда меньше! Механизм многопоточности у неё такой ;-) Крути цикл, если надо меньше. 11.07.03 13:01  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
Может, но из драйвера :-) 11.07.03 13:24  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
KeSetTimer sets the absolute or relative interval at which a timer object is to be set to a signaled state and, optionally, supplies a CustomTimerDpc routine to be executed when that interval expires.

BOOLEAN
KeSetTimer(
IN PKTIMER Timer,
IN LARGE_INTEGER DueTime,
IN PKDPC Dpc OPTIONAL
);

Parameters:
Timer
Pointer to a timer object that was initialized with KeInitializeTimer or KeInitializeTimerEx.
DueTime
Specifies the absolute or relative time at which the timer is to expire. If the value of the DueTime parameter is negative, the expiration time is relative to the current system time. Otherwise, the expiration time is absolute. The expiration time is expressed in system time units (100-nanosecond intervals). Absolute expiration times track any changes in the system time; relative expiration times are not affected by system time changes.
Dpc
Pointer to a DPC object that was initialized by KeInitializeDpc. This parameter is optional.
Хм, а еще есть NdisMSleep (в DDK). Не поможет? 11.07.03 13:56  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка>
А в Юниксе есть sleep, msleep и usleep для секунд, милисекунд и микросекунд. 11.07.03 13:14  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
Можно комбинировать: если время больше милисекунды - то системную функцию вызвать, а остальное - циклом. На гигагерцовых процессорах можно и наносекунды отловить опрашивая счетчик тактов. В крайнем случае таймер спаять и в СОМ-порт втыкнуть. Закинуть в порт время, а он в ответ прерывание через это время. Шучу, конечно:)
Наносекунды тоже отлавливаются - nanosleep :) 11.07.03 13:55  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach