Хорошо, это название, возможно, было расплывчатым, но позвольте мне объяснить.
Я имею дело с большим списком из сотен сообщений, которые должны быть отправлены на шину CAN в виде массивов байтов. Каждое из этих сообщений имеет свойство Interval, указывающее, как часто должно отправляться сообщение в миллисекундах. Но я вернусь к этому.
Итак, у меня есть нить. Поток проходит через этот гигантский список сообщений до тех пор, пока не остановится, с телом примерно таким:
Stopwatch timer = new Stopwatch();
sw.Start();
while(!ShouldStop)
{
foreach(Message msg in list)
{
if(msg.IsReadyToSend(timer)) msg.Send();
}
}
Это прекрасно работает, с феноменальной точностью соблюдает интервал объектов Message. Тем не менее, он загружает весь процессор. Проблема в том, что из-за огромного количества сообщений и особенностей CAN-шины обычно проходит менее половины миллисекунды, прежде чем поток должен отправить другое сообщение. Никогда не было бы случая, чтобы поток мог спать, скажем, более 15 миллисекунд.
Я пытаюсь выяснить, есть ли способ сделать это, который позволяет потоку мгновенно блокироваться или уступать, позволяя процессору спать и экономить несколько циклов. Получу ли я хоть какую-то точность, если попытаюсь разделить работу на потоки для каждого сообщения? Есть ли другой способ сделать это, которого я не вижу?
РЕДАКТИРОВАТЬ: Возможно, стоит упомянуть, что свойство Interval Message не является абсолютным. Пока поток продолжает извергать сообщения, получатель должен быть счастлив, но если поток регулярно засыпает, скажем, на 25 мс из-за того, что потоки с более высоким приоритетом крадут его квант времени, это может вызвать тревогу у получателя.
Thread.Sleep(0)
прямо внутриwhile()
, чтобы он играл красиво. Если это приложение с графическим интерфейсом, то вашwhile()
не должен находиться в основном потоке. - person MickyD   schedule 01.02.2016