Как я могу заблокировать поток на наносекунды или микросекунды? Функция Sleep()
невозможна, потому что она принимает миллисекунды, что явно не то, что мне нужно.
Как заставить поток спать/блокироваться на наносекунды
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
Чем это отличается от занятой петли?
- person user3060326; 28.03.2014
Это временная петля занятости. Разве это не то, что вы искали?
- person Robert Harvey; 28.03.2014
Частота тика не запрограммирована жестко и может быть прочитана из свойства Frequency.
- person David Heffernan; 28.03.2014
@user3060326 user3060326 Я думаю, вам нужно использовать цикл занятости по времени. Передача управления ОС будет означать, что вы не можете гарантировать, что получите обратно контроль, когда он вам понадобится.
- person Graymatter; 28.03.2014
@ user3060326: Да, но только на очень короткий период времени. Windows обычно выделяет временные интервалы по 20 мс каждому потоку, поэтому вам нужно сохранить контроль над потоком, если вы хотите, чтобы интервал задержки был меньше этого. На многоядерной машине (которой в настоящее время является большинство машин) вы даже не заметите задержки.
- person Robert Harvey; 28.03.2014
Это очень разумный ответ. Генерация импульса в реальном времени, скажем, 500 мкс с помощью микросхемы памяти или ввода-вывода (например, карты PCI) вполне нормальна, и загрузка ЦП — это способ работать в течение таких коротких периодов времени. Вы не остановите упреждающую многозадачность, увеличивая время, но и не сокращая его.
- person Brian Frost; 28.03.2014
Windows не поддерживает наносон. Планирование потоков, используемое Windows, намного грубее. Квант потока Windows на несколько порядков больше наносекунды.
person
David Heffernan
schedule
27.03.2014
В практических тестах с использованием GetTickCount я всегда видел, что он пропускает по крайней мере 12 или 15 миллисекунд. (Загрузите это: msdn.microsoft.com/en-us/library /aa450636.aspx )
- person Stijn Sanders; 28.03.2014
@StijnSanders да, и в Windows XP ожидайте до 50-55 мс, IIRC в Windows 7, это 15 мс, не уверен насчет Vista и Windows 8
- person ; 28.03.2014