终止计时器不会结束计时器 - WINAPI c++

Hui Liu-MSFT 48,571 信誉分 Microsoft 供应商
2024-04-23T06:56:53.6233333+00:00

我一直在使用一个应用程序,该应用程序与带有 com 接口的微控制器通信并发送状态请求并每隔几秒钟接收一次答案。我使用了相同的设置计时器。当状态发生更改时,警告消息应仅弹出一次,即使状态更改在收到的下一个数据包中仍然存在。但是每次收到数据包时都会弹出警告消息。计时器标志不起作用。如果我遗漏了什么,请告诉我


void CALLBACK StatusRequest(HWND StatusHwnd, UINT uMsg, UINT timerId, DWORD dwTime){

ret = sendReceivePacket(........);

TIMEFLAG = false ;

if (TIMEFLAG == false) { if(ret ==0) // change is status { //warning message// TIMEFLAG = True; ................. } else { }

}

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wP, LPARAM lP){

switch (msg){ case WM_INITDIALOG:

SetTimer(NULL, TIMER_ID_SEND_REQUEST, 1000 * 3, (TIMERPROC)StatusRequest);

case WM_TIMER:

KillTimer(NULL, TIMER_ID_SEND_REQUEST);

} }

DLg proc 是具有不同消息的主要对话功能。Timeflag 用于停止每次打印警告消息,但它不起作用。杀戮计时器也不起作用。

Note:此问题总结整理于:Kill Timer doesnot end the timer - WINAPI c++

C++
C++
一种通用的高级编程语言,作为 C 编程语言的扩展而创建,除了用于低级别内存操作的功能外,还具有面向对象、泛型和功能性等特点。
146 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Jiale Xue - MSFT 46,466 信誉分 Microsoft 供应商
    2024-04-23T08:12:51.42+00:00

    根据 MSDN

    如果函数成功且 hWnd 参数为 NULL,则返回值是标识新计时器的整数。应用程序可以将此值传递给 KillTimer 函数以销毁计时器。

    因此,您需要将代码修改为:

    UINT_PTR id = 0;  
      
    ......  
      
    id = SetTimer(NULL, TIMER_ID_SEND_REQUEST, 1000 * 3, (TIMERPROC)StatusRequest);  
      
    ......  
      
    KillTimer(NULL, id);  
    

    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。