OnTimer只重复第一个函数调用



基本上我有一个程序,有6个滑块,通过串行端口发送一个值,我使用一个计时器来动态地重新发送这些值,因为它们是由用户改变的。我所遇到的问题是,我的计时器调用的6个函数行为奇怪,第一个函数调用应该正常工作,并不断发送信号,但其他5个调用之后只在用户改变值时发送信号。(我希望每个滑块的当前值不断地重新发送,所以我发送它的设备不会退出,它们的代码是相同的,但计时器只与第一个正常工作)。我想知道这是计时器的已知问题还是我做错了什么。

My Timer is:

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);
}

我从来没有做过串行通信与MFC,但我不认为SetTimer是要走的路。那些计时器很不可靠。当你将它设置为50毫秒时,你真正说的是"滴答不早于50毫秒",但它可以是50、55、500或其他,这取决于计算机在做什么(以及系统的计时器分辨率)。你的应用程序将获得WM_TIMER消息,每次指定的时间已经过去,并且在消息队列中没有其他消息。因此,如果用户正在移动鼠标,则消息将显示为"迟到"。

除此之外,我不知道这些Write_X函数花了多长时间,但你不应该在计时器处理程序中做冗长的事情,否则你会错过滴答(这可能就是正在发生的事情)。

也就是说,如果你真的需要连续发送滑块状态(或任何你需要发送的数据),你应该找到一种方法来连续地完成它,而不是基于计时器。我的意思是,找到一种方式发送你的数据,当完成后,通知你的应用,或发送者线程,然后再次开始发送。但是我真的不知道应该怎么做。

我现在让它工作了。问题是我发送的信号没有包含校验和,所以我发送到的设备没有返回正确的值。

编辑:澄清一下,计时器没有问题。

谢谢你的回复。

最新更新