我似乎无法告诉我为什么我无法停止使用DeleteTimerQueue或其任何版本(例如DeleteTimerQueueTimer或Ex)创建的计时器。当然,我需要根据需要填写参数。
起初,我想在某个条件下停止/删除计时器,但是此后我删除了该条件(if循环),以查看Delete是否在工作,而不是在工作。
我在回调中调用Delete,并且我有两个计时器要在其中一个完成一项任务的同时停止(如果我要说的是Loop的话)。
无论如何,这是我如何创建计时器
BOOL champ1_Success = ::CreateTimerQueueTimer(
&baseAttackTimerHandler,
NULL,
callBaseAttackC1,
this,
0,
(DWORD)(1000/attackSpeed),
WT_EXECUTEDEFAULT);
BOOL champ2_Success = ::CreateTimerQueueTimer(
&baseAttackTimerHandler,
NULL,
callBaseAttackC2,
this,
0,
(DWORD)(1000/attackSpeed),
WT_EXECUTEDEFAULT);
他们很棒!如果我能阻止他们。
在他们的回调中,我打电话给
void CALLBACK Controller::callBaseAttackC1(void* lpParametar,
BOOLEAN TimerOrWaitFired)
{
// This is used only to call QueueTimerHandler
// Typically, this function is static member of CTimersDlg
Controller* obj = (Controller*) lpParametar;
if (!obj->yi->isAlive() && !obj->skarner->isAlive()){
if (!DeleteTimerQueueTimer(baseAttackTimerHandler, NULL, NULL)){
printf("Base Attack Timer failed (%d)\n", GetLastError());
obj->out << "Base A Timer Failed " << GetLastError() << endl;
}
//CloseHandle(baseAttackTimerHandler);
}
obj->basicAttackC1_TimeHandler();
}
Note the
if (!DeleteTimerQueueTimer(baseAttackTimerHandler, NULL, NULL)){
printf("Base Attack Timer failed (%d)\n", GetLastError());
obj->out << "Base A Timer Failed " << GetLastError() << endl;
}
我认为在回调中调用Delete意味着计时器仅执行一次,但不会执行一次。它一直在继续。还要注意的另一件事是,我不确定它的好坏,还是什么意思,但是我有两个不同的计时器,它们使用指向我创建的HANDL对象的同一指针(HANDLE baseAttackTimerHandler = NULL;)。我尝试过使它们具有自己的独特性,但这没有什么区别,所以我选择让它们使用相同的颜色。顺便说一句,DeleteTimerQueue在调用时不断失败。错误代码87?
最重要的是,我真的需要他们停下来,知道我做错了什么还是要弄到他们的招数吗?
编辑:所以我让它像这样工作...
if (!DeleteTimerQueueTimer(NULL, baseAttackTimerHandler_C1, NULL)){
printf("2-Base Attack Timer failed (%d)\n", GetLastError());
obj->out << "2-Base A Timer Failed " << GetLastError() << endl;
}
但是我必须为每个计时器设置不同的句柄以防止错误。 (C1和C2)。即使它第一次发出错误,它在执行一次后仍会停止。
但是,将其置于我的if循环下会阻止其工作。不得不查看我的if循环。
编辑:
找出我的if循环出了什么问题。由于回调似乎必须在(Controller)中创建其类的对象,因此它与我初始化并正在使用的对象不同。因此,即使我对Controller con进行了处理,我仍将Controller obj设为目标。 obj中的结果与con不同,而我的if循环永远不会返回true。必须要弄清楚这一点。如果有一种方法可以使回调不是静态的,并且仍在CreateTimer中使用它,则可以调用con。
编辑:只是使用strcut来使对象将obj间接设置为con。作品。我快完成了,计时器停止了,但是现在我的弹出消息不断被发送垃圾邮件。我想我已经用完了这个线程。
最佳答案
是的,您必须为每个计时器使用不同的句柄。您的原始代码具有:
CreateTimerQueueTimer(&baseAttackTimerHandler ...);
CreateTimerQueueTimer(&baseAttackTimerHandler ...);
第二个调用覆盖了第一个调用的句柄。因此,当您调用
DeleteTimerQueueTimer
删除计时器时,传递的句柄将删除第二个计时器,而不是第一个。您的解决方案是正确的:使用不同的变量来保存每个计时器句柄。这并不奇怪。您如何期望将两个不同的句柄存储在一个句柄值中?
关于c++ - DeleteTimerQueue不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23433312/