OnTimer只重复第一次函数调用

时间:2011-09-02 09:50:09

标签: visual-c++ mfc

基本上我有一个程序有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 个答案:

答案 0 :(得分:3)

我从未与MFC进行过串口通信,但我认为SetTimer不是最佳选择。那些计时器非常不可靠。当你把它设置为50毫秒时,你真正说的是“不早于50毫秒”,但它可以是50,55,500或其他什么,这取决于计算机在做什么(以及系统的计时器分辨率)。每当指示的时间过去并且消息队列中没有其他消息时,您的应用就会收到WM_TIMER消息。因此,如果用户正在移动鼠标,则消息将“迟到”。

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

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

答案 1 :(得分:0)

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

编辑:为了澄清,计时器没有问题。

无论如何都为你的回复干杯。