OnTimer только повторяет первый вызов функции - PullRequest
2 голосов
/ 02 сентября 2011

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

Мой таймер:

Loop_Timer = SetTimer(1,50,0);

...

void CSerialPortDlg::OnTimer(UINT nIDEvent)
{
    Write_1(); //works as expected, continually writes from this function without user input
    Write_2(); // these only work when they are changed, and stop sending afterwards..
    Write_3();
    Write_4();
    Write_5();
    Write_6();
    CDialog::OnTimer(nIDEvent);
}

Ответы [ 2 ]

3 голосов
/ 02 сентября 2011

Я никогда не осуществлял последовательную связь с MFC, но я не думаю, что SetTimer - это путь.Эти таймеры очень ненадежны.Когда вы устанавливаете 50 мс, то, что вы на самом деле говорите, это «отметьте не раньше, чем 50 мс», но это может быть 50, 55, 500 или что-то еще, в зависимости от того, что делает компьютер (и разрешение таймера системы).Ваше приложение будет получать сообщения WM_TIMER каждый раз, когда указанное время истекло , а в очереди сообщений нет других сообщений.Таким образом, если пользователь перемещает мышь, сообщение будет «поздно».

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

Тем не менее, если вам действительно нужна непрерывная отправка статуса ползунка (или каких-либо данных, которые вам нужно отправить), вы должны найти способ делать это непрерывно, не основываясь на таймере.Я имею в виду, найти способ отправить ваши данные и, когда закончите, уведомить ваше приложение или поток отправителя, и начать отправку снова.Но я не совсем уверен, как это сделать.

0 голосов
/ 06 сентября 2011

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

Редактировать: чтобы уточнить, с таймером проблем не было.

Спасибо за ваши ответы в любом случае.

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