Псевдо-потоки в реальном времени - PullRequest
0 голосов
/ 18 ноября 2010

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

В настоящее время контроллер является делегатом, который активируется при запуске-запуске и деактивируется токеном отмены, а затем вызывается при помощи endinvoke. Внутри лямбда-кисти PropertyChanged (подключен к INotifyPropertyChanged), которая поддерживает актуальность пользовательского интерфейса.

Из того, что я понимаю, метод BeginInvoke активирует задачу, а не другой поток (который на моих компьютерах активирует другой поток, но это не является гарантией от прочитанного мною чтения, это зависит от пула потоков, как он хочет чтобы получить задание выполнено), что хорошо от всех испытаний, которые я сделал. Лямбда не завершается, пока не отменен токен отмены. У него есть сон и обновление (так что это своего рода имитация физического движка в реальном времени ... это грубо, но мне не нужна реальная точность в реальном времени, просто достаточно, чтобы почувствовать)

Вопрос, который у меня возникает, будет ли это работать на других компьютерах, или я должен переключиться на явные потоки, которые я запускаю и отменяю? Сценарий, о котором я думаю, связан с одноядерным процессором. Возможно ли, что вторая задача получит значительно меньше процессорного времени и тем самым превратит мою приемлемо неточную модель во что-то недопустимо неточное (т. Е. Ожидание миллисекунд перед переключением, а не микросекунд?). Или это лучший способ сделать это, чего я еще не придумал?

1 Ответ

1 голос
/ 18 ноября 2010

По моему опыту, использование пула потоков описанным выше способом в значительной степени гарантирует разумно оптимальную производительность на большинстве компьютеров, и вам не придется разбираться в том, как разделить потоки.

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

При этом микросекунды - это не много времени для контекстапереключение между потоками, так что YMMV.Вам придется попробовать и посмотреть, насколько хорошо это работает;может потребоваться некоторая настройка.

...