Портирование SetTimer () и KillTimer () на C #? - PullRequest
2 голосов
/ 22 апреля 2011

Я пытаюсь перенести код из C ++ в C #.

Я сталкивался с этим в коде C ++:

watchdogTimer = SetTimer(1,1000,NULL);
...
KillTimer(watchdogTimer);

Что делает этот код и как его перенести на C #?

Спасибо.

Ответы [ 2 ]

1 голос
/ 22 апреля 2011

Функция CWnd::SetTimer, на которую вы смотрите, создает таймер, который отправляет в окно события WM_TIMER.Это аналог компонента System.Windows.Forms.Timer в .NET.Он ведет себя несколько иначе, чем System.Timers.Timer.Есть два отличия, которые особенно актуальны:

Windows.Forms.Timer вызывает обработчик событий в потоке пользовательского интерфейса.По умолчанию System.Timers.Timer вызывает обработчик событий в потоке потоков.Вы можете использовать свойство SynchronizingObject для вызова System.Timers.Timer в потоке пользовательского интерфейса.

Другое отличие состоит в том, что невозможно избежать проблем с повторным входом с таймером Windows Forms, потому что Windows не будетразрешить несколько WM_TIMER сообщений от одного и того же таймера в очереди, и при этом он не будет помещать сообщение WM_TIMER в очередь, если оно уже обрабатывается.Как правило, это хорошо.

System.Timers.Timer, с другой стороны, разрешит повторный вход.Поэтому, если ваш обработчик событий таймера занимает больше времени, чем период таймера, вы можете обрабатывать несколько событий для одного и того же таймера одновременно.Если период таймера составляет 100 мс, а обработка занимает 150 мс, вы получите другое уведомление, пока обрабатываете первое.Если вы используете SynchronizingObject для принудительного обратного вызова в потоке пользовательского интерфейса, это может привести к тому, что целый ряд ожидающих обратных вызовов будет поставлен в очередь.

Реализация двух таймеров весьма различна.Таймер Windows Forms использует старые таймеры Windows , которые существуют уже 20 лет.Этот тип таймера требует дескриптора окна и цикла сообщений и поэтому используется только в программах с графическим интерфейсом.System.Timers.Timer - это тонкая оболочка вокруг System.Threading.Timer, которая использует Windows Таймеры пула потоков .

1 голос
/ 22 апреля 2011

Предполагая, что ваше приложение написано в MFC, метод SetTimer () принадлежит классу CWnd и отвечает за настройку таймера Windows.Документация для этого может быть найдена в http://msdn.microsoft.com/en-us/library/49313fdf(v=vs.80).aspx.. Я немного знаю о .NET, но быстрый поиск в Google нашел следующее: http://msdn.microsoft.com/en-us/library/0tcs6ww8(v=VS.90).aspx.

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