Экземпляр Windows.Forms.Timer и потоки пользовательского интерфейса - PullRequest
0 голосов
/ 18 апреля 2010

У меня есть пользовательский элемент управления, основная цель которого - рисовать данные. Я хочу добавить метод ScheduleUpdate (int milliSeconds) к элементу управления, который заставит обновление X миллисекунд с этого момента.

Так как все это графическая оболочка, я должен использовать Windows.Forms.Timer, но как этот экземпляр таймера узнает, к какому потоку он принадлежит? Что если ScheduleUpdate () вызывается из потока, не являющегося пользовательским интерфейсом?

Должен ли я создать таймер в конструкторе Control? Или, возможно, событие Load? Или это безопасно отложить конструкцию, пока я не буду внутри ScheduleUpdate ()?

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

1 Ответ

1 голос
/ 18 апреля 2010

Он знает, потому что знает, в каком потоке он был создан. Есть невидимое вспомогательное окно, которое получает сообщение WM_TIMER, которое, в свою очередь, вызывает событие Tick. Окно имеет сходство с потоком, цикл сообщений в потоке отправляет сообщение. Какой должен быть поток пользовательского интерфейса вашего приложения.

Убедитесь, что вы создали этот таймер в том же потоке, что и форма и ее элементы управления. Просто поместите его в форму или создайте его в конструкторе формы или элемента управления. Затем вам просто нужно установить для свойства таймера Enable значение true. Это потокобезопасно, вы можете сделать это в потоке планировщика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...