Можно ли приостановить поток менее чем за 1 мс без загрузки процессора - PullRequest
0 голосов
/ 25 сентября 2019

Я написал приложение, которое работает с некоторым оборудованием.Приложение отправляет команду на аппаратное обеспечение, а затем ожидает выполнения команды, используя цикл, подобный следующему:

while True do
begin
  asm
    in Status, DevicePort;
  end;
  if Status and DeviceBusyFlagMask=0 then
    break;
end;

Это работает с хорошей скоростью, но загрузка ЦП составляет 100% для одного ядра.Но мне нужно запустить 16 экземпляров этого приложения для 16 устройств одновременно.После 4 случаев у меня было значительное снижение скорости процессора с 4 ядрами.

Да, я знаю, что IRQ решит эту ситуацию, но приложение должно работать в Win x64, а для корректной работы оборудования требуется драйвер от производителя, поэтомуЯ не могу использовать драйвер с IoReportResourceForDetection для получения вектора IRQ ...

Также я попытался создать службу, которая может регистрировать каждый экземпляр приложения, и вызывать SetEvent для каждого приложения, когда связанное устройство завершает команду (аналогичный циклно один на все случаи).Это дает лучший результат, теперь я могу запустить около 8 экземпляров без снижения скорости, но не 16.

Мне нужно сделать паузы в этом цикле примерно на 0,2-0,3 мс, чтобы уменьшить загрузку процессора.Sleep или WaitForXXXXXObject не имеют такой точности.Может быть, существует какая-то хитрость, чтобы сделать это?Может быть, вызов какого-то стандартного аппаратного обеспечения, который занимает 0,2-0,3 мс и не использует процессор?Или вызовите какой-нибудь API с низкой загрузкой ЦП, который займет примерно столько же времени?

...