мое приложение C # считывает данные со специального USB-устройства. Данные читаются как так называемые «сообщения», каждое из которых имеет 24 байта. Количество сообщений, которые должны быть прочитаны в секунду, может отличаться (максимальная частота довольно высока, около 700 сообщений в секунду), но приложение должно прочитать их все.
Единственный способ прочитать сообщения - вызвать функцию «ReadMessage», которая возвращает одно сообщение, прочитанное с устройства. Функция из внешней библиотеки DLL, и я не могу ее изменить.
Мое решение: у меня есть отдельный поток, который работает все время во время выполнения программы, и его единственная задача - читать сообщения в цикле. Полученные сообщения затем обрабатываются в основном потоке приложения.
Функция, выполняемая в «потоке чтения», выглядит следующим образом:
private void ReadingThreadFunction() {
int cycleCount;
try {
while (this.keepReceivingMessages) {
cycleCount++;
TRxMsg receivedMessage;
ReadMessage(devHandle, out receivedMessage);
//...do something with the message...
}
}
catch {
//... catch exception if reading failed...
}
}
Это решение отлично работает, и все сообщения принимаются правильно. Тем не менее, приложение потребляет слишком много ресурсов, загрузка процессора моего компьютера составляет более 80%. Поэтому я хотел бы уменьшить его.
Благодаря переменной «cycleCount» я знаю, что «скорость цикла» потока составляет около 40 000 циклов в секунду. Это слишком много, потому что мне нужно получить максимум 700 сообщений в секунду. (и устройство имеет буфер для около 100 сообщений, поэтому скорость цикла может быть даже немного ниже)
Я попытался уменьшить скорость цикла, приостановив поток на 1 мс с помощью Thread.Sleep (1); команда. Конечно, это не сработало, и скорость цикла стала около 70 циклов в секунду, что было недостаточно для чтения всех сообщений. Я знаю, что эта попытка была глупой, что для того, чтобы уложить нить в сон, а затем разбудить его, требуется гораздо больше времени, чем 1 мс.
Однако я не знаю, что еще делать: есть ли другой способ замедлить выполнение потока (чтобы уменьшить потребление ресурсов процессора), кроме Thread.Sleep? Или я совершенно не прав и должен ли я использовать что-то другое для этой задачи вместо Thread, может быть Threading.Timer или ThreadPool?
Заранее большое спасибо за все предложения. Это мой первый вопрос, и я новичок в использовании потоков, поэтому, пожалуйста, извините, если это не совсем понятно.