Как заставить поток спать/блокироваться на наносекунды

Как я могу заблокировать поток на наносекунды или микросекунды? Функция Sleep() невозможна, потому что она принимает миллисекунды, что явно не то, что мне нужно.


person user3060326    schedule 27.03.2014    source источник
comment
Не ожидайте такой точности в Windows (и ни на одной из платформ, поддерживаемых Delphi XE5). Если вы собираетесь управлять каким-то устройством, используйте микроконтроллер или управляйте им из какой-нибудь RTOS.   -  person TLama    schedule 28.03.2014
comment
Windows не является ОС реального времени. и ни OSX/Android/iOS. Я не знаю функции сна с таким уровнем детализации. Возможно, будет лучше, если вы объясните, чего вы пытаетесь достичь с помощью своего потока, чтобы увидеть, есть ли лучшее решение, чем блокировка/спящий режим.   -  person Ken White    schedule 28.03.2014
comment
Сомневаюсь, что ты можешь так спать. Лучшее, что вы можете сделать, это крутиться. Вряд ли то же самое.   -  person David Heffernan    schedule 28.03.2014
comment
Возможный дубликат (другой язык) stackoverflow.com/questions/6768975/   -  person Graymatter    schedule 28.03.2014
comment
Окна? Вы должны использовать мультимедийный таймер для этого.   -  person Free Consulting    schedule 28.03.2014


Ответы (2)


Используйте класс TStopWatch и напишите while цикл, который выполняется до тех пор, пока не будет достигнуто желаемое значение. число тиков (интервалы 100 наносекунд).

 property ElapsedTicks : Int64 read GetElapsedTicks;

Это не передаст управление другим потокам; он просто будет ждать в текущем потоке желаемый период времени. Будет некоторая степень ошибки; количество ошибок будет зависеть от того, сколько времени требуется Delphi для выполнения каждого цикла.

Дополнительная литература
Как точно измерить прошедшее время с помощью счетчика производительности с высоким разрешением

person Robert Harvey    schedule 27.03.2014
comment
Чем это отличается от занятой петли? - person user3060326; 28.03.2014
comment
Это временная петля занятости. Разве это не то, что вы искали? - person Robert Harvey; 28.03.2014
comment
Частота тика не запрограммирована жестко и может быть прочитана из свойства Frequency. - person David Heffernan; 28.03.2014
comment
@user3060326 user3060326 Я думаю, вам нужно использовать цикл занятости по времени. Передача управления ОС будет означать, что вы не можете гарантировать, что получите обратно контроль, когда он вам понадобится. - person Graymatter; 28.03.2014
comment
@ user3060326: Да, но только на очень короткий период времени. Windows обычно выделяет временные интервалы по 20 мс каждому потоку, поэтому вам нужно сохранить контроль над потоком, если вы хотите, чтобы интервал задержки был меньше этого. На многоядерной машине (которой в настоящее время является большинство машин) вы даже не заметите задержки. - person Robert Harvey; 28.03.2014
comment
Это очень разумный ответ. Генерация импульса в реальном времени, скажем, 500 мкс с помощью микросхемы памяти или ввода-вывода (например, карты PCI) вполне нормальна, и загрузка ЦП — это способ работать в течение таких коротких периодов времени. Вы не остановите упреждающую многозадачность, увеличивая время, но и не сокращая его. - person Brian Frost; 28.03.2014

Windows не поддерживает наносон. Планирование потоков, используемое Windows, намного грубее. Квант потока Windows на несколько порядков больше наносекунды.

person David Heffernan    schedule 27.03.2014
comment
В практических тестах с использованием GetTickCount я всегда видел, что он пропускает по крайней мере 12 или 15 миллисекунд. (Загрузите это: msdn.microsoft.com/en-us/library /aa450636.aspx ) - person Stijn Sanders; 28.03.2014
comment
@StijnSanders да, и в Windows XP ожидайте до 50-55 мс, IIRC в Windows 7, это 15 мс, не уверен насчет Vista и Windows 8 - person ; 28.03.2014