Читал про QueryPerformanceFrequency, QueryPerformanceCounter, но ничего полезного из этого не вышло.
Код моего таймера для данного простоя таков, что эти самые микросекунды нормально отсчитываются в огромных кол-вах... вот, собственно, и код:
public class PerfCounter
{
Int64 freq = 0;
Int64 _start = 0;
Int64 finish = 0;
public PerfCounter()
{
Clear();
}
void Clear()
{
QueryPerformanceFrequency(ref freq);
freq = (long)(freq/(1000000));
}
public void wait(int mks)
{
Clear();
freq = freq*mks;
QueryPerformanceCounter(ref _start);
while ((finish-_start)< freq) QueryPerformanceCounter(ref finish);
// for (int i=0; i< mks; i++) LPTWorker.LPTIn(888);
}
[DllImport("Kernel32.dll")]
static extern bool QueryPerformanceCounter(ref Int64 performanceCount);
[DllImport("Kernel32.dll")]
static extern bool QueryPerformanceFrequency(ref Int64 frequency);
}
}
P.S. не советуйте, пожалуйста QNX и т.п., мне нужно считывать данные с LPT с минимальным простоем между запросами 4 мкс (Win9x/NT), переключение между процессами блокирую так:
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime
Один не очень авторитетный программист сказал, что запрос на чтение данных с LPT занимает 1 мкс, во что я не очень верю. Пробовал Thread.Sleep(new TimeSpan(1000)) , но в MSDN прочел, что малые простои игнорируются, и это будет как Sleep(0) , но и это лишь гарантия минимального простоя, максимальный при этом неизвестен, к тому же таймер посылает сообщения лишь каждые 55 мс(насколько помню)... внешние устройства пожалуйста тоже не советуйте, только программно. СПАСИБО.
Ответить
|