C++
一种通用的高级编程语言,作为 C 编程语言的扩展而创建,除了用于低级别内存操作的功能外,还具有面向对象、泛型和功能性等特点。
146 个问题
我一直在使用一个应用程序,该应用程序与带有 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++
根据 MSDN:
如果函数成功且 hWnd 参数为 NULL,则返回值是标识新计时器的整数。应用程序可以将此值传递给 KillTimer 函数以销毁计时器。
因此,您需要将代码修改为:
UINT_PTR id = 0;
......
id = SetTimer(NULL, TIMER_ID_SEND_REQUEST, 1000 * 3, (TIMERPROC)StatusRequest);
......
KillTimer(NULL, id);
如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。
注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。