Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.161.222] |
|
Сообщ.
#1
,
|
|
|
Надо усыпить поток на время меньшее 100 микросекунд. Sleep позволяет усыпить на время не меньшее 1 милисекунде. Надо меньше 100 микросекунд. Может есть какие либо самописные функции?
|
Сообщ.
#2
,
|
|
|
Усыпить нельзя, да и смысла это не имеет никакого - если поток потерял управление, оно к нему вернётся не скоро.
Можно подождать нужного значения QueryPerformanceCounter или др. функции |
Сообщ.
#3
,
|
|
|
Цитата MBo @ Усыпить нельзя, да и смысла это не имеет никакого - если поток потерял управление, оно к нему верётся не скоро. Можно подождать нужного значения QueryPerformanceCounter или др. функции Я сейчас так и делаю. А эта функция тоже переключает поток? |
Сообщ.
#4
,
|
|
|
Нет
|
Сообщ.
#5
,
|
|
|
Цитата a_n_y_a @ Надо усыпить поток на время меньшее 100 микросекунд Попробуй через NtDelayExecution. Она берёт задержку в 100 наносекундных интервалах. Скажем, усыпить на 80 микросекунд: function NtDelayExecution(Alertable:boolean;Interval:PLARGE_INTEGER):NTSTATUS; stdcall; external 'ntdll.dll'; ... var st:NTSTATUS; p:LARGE_INTEGER; begin p.QuadPart:=-80*10; // относительное время st:=NtDelayExecution(false,@p); end; |
Сообщ.
#6
,
|
|
|
Цитата Krid @ Попробуй через NtDelayExecution. Она берёт задержку в 100 наносекундных интервалах. Бесполезно, т.к. в винде отсчет времени всех функций ожидания осуществляется по системному таймеру, который имеет разрешение по умолчанию 10-15 мс и минимум 1 мс (можно установить путем вызова ф-ии timeBeginPeriod). PS. Начиная с Win 8 для более точного отсчета времени функций ожидания используется счетчик высокого разрешения а ля QueryPerformanceCounter, но его вызов по любому происходит только при запуске планировщика потоков, т.е. либо по тому же сис.таймеру, либо в случайные моменты времени переключения с одного потока на другой. См. Timer Accuracy: Цитата The timer can still expire up to a system clock period later than the specified time, and might expire even later if processing of the system clock interrupt is delayed by interrupt processing for other devices. |
Сообщ.
#7
,
|
|
|
Цитата leo @ Почему Win 8 ? Он ещё в 2000 был...Начиная с Win 8 Цитата leo @ Это простая функция, которая не делает никаких переключений в ядро. Она тупо использует rdtsc (при его наличии), только его результат делится на 1024 (не знаю на всех ли системах именно 1024, но у меня на 7-ке точно).но его вызов по любому происходит только при запуске планировщика потоков, т.е. либо по тому же сис.таймеру, либо в случайные моменты времени переключения с одного потока на другой Так что всё ок. Единственное, конечно, с его помощью "заснуть" не получится, цикл будет грузить проц по полной: procedure TForm1.Button1Click(Sender: TObject); var F, N1, N2: Int64; begin QueryPerformanceFrequency(F); QueryPerformanceCounter(N1); repeat QueryPerformanceCounter(N2) until (N2-N1)/F > 50/1000000; MessageBox(0, PChar(IntToStr(N2-N1)+' / '+IntToStr(F)+ ' = '+FloatToStr((N2-N1)/F*1000000)+' mcs'), '', MB_OK or MB_ICONINFORMATION or MB_TASKMODAL or MB_SETFOREGROUND) end; |
Сообщ.
#8
,
|
|
|
Цитата Jin X @ Почему Win 8 ? Он ещё в 2000 был... Речь не о PerformanceCounter-е как таковом, а о его использовании в системных функциях задержки и ожидания типа KeDelayExecutionThread и т.п. - cм. Timer Accuracy, предпоследний абзац. |
Сообщ.
#9
,
|
|
|
Сакральный вопрос: а зачем?
|