0

我一直在研究一个程序来记录多个项目的时间。我一直在使用 WM_TIMER,最近注意到它正在运行

太慢了。所以我一直在尝试让多媒体计时器工作。

问题是它会部分显示一些窗口,在我的所有者绘制的控件所在的位置留下透明的矩形。在

同时,我得到一个错误:程序已经停止工作。

从我在网上找到的例子来看,几乎发生了同样的事情。

在全球范围内,我有这个变量:

PHANDLE ptrTimerHandle;

MSDN,如果我没看错的话,说你可以重命名回调函数。

VOID CALLBACK TimerCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired);

这是我尝试在 WinMain 中设置计时器的方法(持续 500 毫秒直到它开始,并且每 200 毫秒滴答一次):

CreateTimerQueueTimer(ptrTimerHandle, NULL, TimerCallback, 0, 500, 200, WT_EXECUTEDEFAULT | WT_EXECUTEINTIMERTHREAD);

然后这个函数是空的,但我做了测试,没有任何东西发送给它。

VOID CALLBACK TimerCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired) {}

在尝试执行此操作之前,我从 MSDN 复制并粘贴了一个我也无法开始工作的示例。和上面一样的问题。

我已经包含了正确的库,并包含了正确的文件,并且编译得非常好。

谢谢你的时间。

4

1 回答 1

4

尝试在之前(或之后,我忘记了)执行以下操作,包括windows.h

#define  _WIN32_WINNT 0x0601 // value for windows 7

因为队列定时器不工作,除非这个值大于 0x0500。我之前曾发生过这种情况,当时 Visual Studio 出于某种原因决定我没有在 Windows 7 上运行。

这是在备注中告诉您的页面
这是Windows 版本的文档


以下代码适用于我:

#include <Windows.h>
#include <stdio.h>

void __stdcall 
TimerCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired)
{
    printf("Hello World\n");
}

int
main(int argc, char* argv[]) {
    HANDLE ptrTimerHandle;
    CreateTimerQueueTimer(&ptrTimerHandle, NULL, TimerCallback, NULL, 500, 200, WT_EXECUTEDEFAULT );

    getchar();

    DeleteTimerQueueTimer(NULL, ptrTimerHandle, NULL);
    return 0;
}

我怀疑您的程序无法正常运行的原因是因为您使用PHANDLE而不是HANDLE.
这将使您获得访问异常,因为您从未PHANDLE初始化HANDLE.
如果您注意到,我使用 aHANDLE然后将引用传递给HANDLE不会导致访问异常的函数。

于 2013-09-25T02:51:49.827 回答