Как правильно использовать приоритет реального времени

Мой вопрос, возможно, не касается обработки в реальном времени, но опять же, может быть.

В моем приложении есть несколько потоков, которые гораздо важнее, чем графический интерфейс, НО я хочу, чтобы графический интерфейс был по крайней мере пригодным для использования. Я не хочу, чтобы он был постоянно заблокирован, и я хочу обновлять экран с учетом результатов обработки, которую я выполняю.

В настоящее время все мои основные элементы изолированы в отдельных потоках, и я вызываю делегата в свой графический интерфейс для отображения результатов.

Мой графический интерфейс работает, но если я переключаю вкладки или сворачиваю/разворачиваю его, известно, что другие мои потоки мешают им выполнять свои операции в течение отведенного им времени в 0,1 с.

Вот что я делаю, чтобы вызвать своего делегата:

delegate void FuncDelegate(ResultContainer Result);
FuncDelegate DelegatedDisplay= new FuncDelegate(DisplayResults);
//then later on
Invoke(DelegatedDisplay, Result);

Большинство моих критических процессов представляют собой потоки, которые работают в непрерывных циклах, извлекая и отправляя в различные буферы (ArrayLists и обычные списки).

Один из моих критических потоков запускается каждый раз, используя:

Thread mythread = new Thread(new ThreadStart(ProcessResults));
mythread.Start();

Причина, по которой я решил сделать это вместо того, чтобы просто запускать поток в цикле, извлекающий из списков, заключается в том, что я думал, что, возможно, причина, по которой я нехватка времени заключалась в том, что у меня есть цикл опроса, который, как я беспокоюсь, потребляет слишком много ресурсов (хотя я использую Thread.Sleep(5) каждый раз, когда опрос оказывается отрицательным).

Затрачивает ли мне драгоценное время запуск нового потока каждый раз, когда мне нужен параллельный процесс? Это должна быть петля? Мои петли виноваты?

Могу ли я дать потоку более высокий приоритет, чем другим, или это использование Thread.Спать мой единственный вариант? Если я назначу более высокие приоритеты потокам, как я могу быть уверен, что другие потоки вообще выживут?

Почему события простых форм так сильно мешают моим другим потокам? Есть ли способ предоставить моему GUI-потоку назначенное меньшее количество ресурсов? Могу ли я каким-то образом использовать Thread.Sleep для блокировки событий формы, если другие потоки исчерпали время?

Если не считать ответа на все мои разочаровывающие вопросы, есть ли какой-нибудь профилировщик потоков, который я могу использовать, чтобы помочь разобраться в моей неразберихе? Я пытался использовать «Managed Stack Explorer», но почему-то это не всегда показывает, какие потоки есть в моем приложении.

Мне бы очень помогла любая помощь в этом вопросе.

5
задан Gorchestopher H 31 May 2012 в 13:11
поделиться