Я написал приложение, которое работает с некоторым оборудованием.Приложение отправляет команду на аппаратное обеспечение, а затем ожидает выполнения команды, используя цикл, подобный следующему:
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 с низкой загрузкой ЦП, который займет примерно столько же времени?