Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Win32 C++;使用多媒体定时器_C++_Winapi_Timer - Fatal编程技术网

C++ Win32 C++;使用多媒体定时器

C++ Win32 C++;使用多媒体定时器,c++,winapi,timer,C++,Winapi,Timer,我一直在做一个程序,为多个项目保留时间。我一直在使用WM_定时器,最近注意到它正在运行 太慢了。所以我一直在努力让多媒体定时器工作 问题是它将部分显示窗口,在我的所有者绘制的控件所在的位置留下透明的矩形。在 同时,我得到一个错误:程序已经停止工作 从我在网上找到的例子来看,几乎同样的事情也发生了 在全球范围内,我有一个变量: PHANDLE ptrTimerHandle; 如果我读对了,MSDN说可以重命名回调函数 VOID CALLBACK TimerCallback(PVOID lpPar

我一直在做一个程序,为多个项目保留时间。我一直在使用WM_定时器,最近注意到它正在运行

太慢了。所以我一直在努力让多媒体定时器工作

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

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

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

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

PHANDLE ptrTimerHandle;
如果我读对了,MSDN说可以重命名回调函数

VOID CALLBACK TimerCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired);
下面是我如何在WinMain中设置计时器(持续500毫秒,直到它启动,并且每200毫秒滴答一次):

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

VOID CALLBACK TimerCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired) {}
在尝试这样做之前,我复制并粘贴了一个来自MSDN的示例,我也无法开始工作。与上述问题相同

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


谢谢您的时间。

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

#define  _WIN32_WINNT 0x0601 // value for windows 7
因为除非此值大于0x0500,否则队列计时器不工作。当VisualStudio出于某种原因决定我不在Windows7上运行时,我曾经遇到过这种情况

这是
这是你的电话号码


以下代码适用于我:

#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;
}
#包括
#包括
无效uu stdcall
TimerCallback(PVOID lpParameter,布尔TimerOrWaitFired)
{
printf(“Hello World\n”);
}
int
main(int argc,char*argv[]){
把手ptrTimerHandle;
CreateTimerQueueTimer(&ptrTimerHandle,NULL,TimerCallback,NULL,500,200,WT_EXECUTEDEFAULT);
getchar();
DeleteTimerQueueTimer(NULL,ptrTimerHandle,NULL);
返回0;
}
我怀疑您的程序不能正常工作的原因是您使用了
PHANDLE
而不是
HANDLE

这将导致访问异常,因为您从未初始化
PHANDLE
以保持
句柄


如果您注意到,我将使用
句柄
,然后将对该
句柄的引用传递到不会导致访问异常的函数中。

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

#define  _WIN32_WINNT 0x0601 // value for windows 7
因为除非此值大于0x0500,否则队列计时器不工作。当VisualStudio出于某种原因决定我不在Windows7上运行时,我曾经遇到过这种情况

这是
这是你的电话号码


以下代码适用于我:

#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;
}
#包括
#包括
无效uu stdcall
TimerCallback(PVOID lpParameter,布尔TimerOrWaitFired)
{
printf(“Hello World\n”);
}
int
main(int argc,char*argv[]){
把手ptrTimerHandle;
CreateTimerQueueTimer(&ptrTimerHandle,NULL,TimerCallback,NULL,500,200,WT_EXECUTEDEFAULT);
getchar();
DeleteTimerQueueTimer(NULL,ptrTimerHandle,NULL);
返回0;
}
我怀疑您的程序不能正常工作的原因是您使用了
PHANDLE
而不是
HANDLE

这将导致访问异常,因为您从未初始化
PHANDLE
以保持
句柄


如果您注意到,我使用
句柄
,然后将对该
句柄的引用传递到不会导致访问异常的函数中。

您是否尝试过以下示例:在等待计时器时您在做什么?是的,这实际上是我复制和粘贴的。我正在使用wxDevC++进行编译。我有点不确定如何让零件工作。我首先编译为一个控制台程序,无法理解printf,将它们全部注释掉并使用cout。然后我编译,没有错误,正确的包括和库。没有弹出窗口,但程序确实运行了,直到大约10秒,程序就完成了。控制台窗口也从未弹出。而且,
WT_EXECUTEDEFAULT | WT_EXECUTEINTIMERTHREAD
是一个冲突。第一个命令它将函数排队到一个非IO线程,而第二个命令它直接在计时器线程上执行它。主要的一个总是显示出来,它使用定时器为每个调用更新一个50毫秒的整数。然后有一个函数更新时间值。我最近为第二个窗口添加了动画渐变。从主窗口每隔50毫秒,我向第二个窗口发送一条计时器消息,更新R、G、B值,并更新梯度。这就是我真正注意到计时器滞后的地方。从任务管理器中,程序保持恒定的~650kb内存,并且其CPU使用率从不超过0。(在正常使用中)你有没有试过这里的例子:当你在等计时器时你在做什么?是的,那实际上是我复制和粘贴的。我正在使用wxDevC++进行编译。我有点不确定如何让零件工作。我首先编译为一个控制台程序,无法理解printf,将它们全部注释掉并使用cout。然后我编译,没有错误,正确的包括和库。没有弹出窗口,但程序确实运行了,直到大约10秒,程序就完成了。控制台窗口也从未弹出。而且,
WT_EXECUTEDEFAULT | WT_EXECUTEINTIMERTHREAD
是一个冲突。第一个命令它将函数排队到一个非IO线程,而第二个命令它直接在计时器线程上执行它。主要的一个总是显示出来,它使用定时器为每个调用更新一个50毫秒的整数。然后有一个函数更新时间值。我最近为第二个窗口添加了动画渐变。从主窗口每隔50毫秒,我向第二个窗口发送一条计时器消息,更新R、G、B值,并更新梯度。这就是我真正注意到计时器滞后的地方。从任务管理器中,程序保持恒定的~650kb内存,并且其CPU使用率从不超过0。(正常使用中)