在Win32控制台程序中使用定时器

定时器Timer,是编程中最常用的功能之一,在VC MFC中,定时器功能很好实现,例程也很多,那么在黑漆漆的Win32 Console窗口中如何实现呢?

方法有二,一是使用多媒体时钟来计时,二是用传统Timer只不过需要自己传消息。下面分别贴代码。

1.多媒体时钟

#include"stdlib.h"
#pragma comment(lib,"Winmm.lib")

void CALLBACK TimerProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
	printf("Timer\n");

}
void main()
{
	MMRESULT nIDTimerEvent = timeSetEvent(1000, 0, TimerProc, 0, (UINT)TIME_PERIODIC);
	while (1);
}



2.SetTimer

/*Timer process function*/
void CALLBACK TimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
        printf("timer\n");
}

/*main function*/
void main()
{
	SetTimer(NULL, 1, 1000, TimerProc);
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (msg.message == WM_TIMER)
		{
			DispatchMessage(&msg);
		}
	}
}


3.线程中使用,在网上看到过类似的东西,不嫌麻烦或者另有他用可以试试:

VOID CALLBACK TimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
	printf("timer\n");
}

DWORD CALLBACK Thread(PVOID   pvoid)
{
	MSG  msg;
	PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
	UINT  timerid = SetTimer(NULL, 1, 1000, TimerProc);
	BOOL  bRet;


	while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
	{
		if (bRet == -1)
		{
			//   handle   the   error   and   possibly   exit   
		}
		else
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	KillTimer(NULL, timerid);
	printf("thread end here\n");
	return   0;
}

void main()
{
	DWORD   dwThreadId; 	
	HANDLE  hThread = CreateThread(NULL, 0, Thread, 0, 0, &dwThreadId);
	while (1);
}



4.直接用多线程取代定时器

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
	while(1)
	{
		printf("thread 1\n");
		Sleep(1000);
	}
	return 0;
}

void main()
{
	HANDLE hThread;
	hThread = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL);
	while(1);
}








  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在VS2010使用Win32控制台应用程序来实现定时器功能有以下步骤: 1. 打开VS2010,选择创建新项目,选择Win32控制台应用程序模板。 2. 在下一步,选择空项目并勾选“空项目”选项。 3. 创建项目后,进入“解决方案资源管理器”,右击项目名称,选择“属性”。 4. 在属性窗口,选择“配置属性” > “链接器” > “系统”,将“子系统”选择为“控制台(/SUBSYSTEM:CONSOLE)”,然后点击“应用”按钮保存更改。 5. 打开“main.cpp”文件,进行编码。 6. 在代码,首先包含头文件`#include<Windows.h>`,用于使用Windows API。 7. 在代码定义回调函数`VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)`作为定时器事件处理函数。 8. 在`main()`函数使用`SetTimer(NULL, 0, 1000, TimerProc)`来设置定时器,第一个参数为窗口句柄,若为NULL表示当前控制台窗口,第二个参数为定时器 ID,若为0表示不需要 ID,第三个参数为定时器间隔时间(毫秒),第四个参数为定时器事件处理函数。 9. 程序运行后,每隔1秒会调用一次定时器事件处理函数。 10. 在定时器事件处理函数,可以进行需要定时执行的操作,例如输出一段文字,并且保存到文件,或者执行其他需要定时执行的任务。 以上就是在VS2010使用Win32控制台应用程序实现定时器功能的大致步骤。具体的实现细节可以根据实际需求进行调整和修改。 ### 回答2: 在VS2010,我们可以使用Win32控制台应用程序来实现定时器的功能。下面是一个简单的示例: 首先,我们需要包含Windows头文件和一些必要的函数库: ```c #include <Windows.h> #include <iostream> #pragma comment(lib, "winmm.lib") ``` 在控制台应用程序的入口点main函数,我们可以定义一个定时器函数来处理定时器事件,通过SetTimer函数来设置定时器: ```c VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { std::cout << "定时器触发!" << std::endl; } int main() { UINT_PTR timerId = SetTimer(NULL, 0, 1000, TimerProc); // 设置定时器,每隔1秒钟触发一次TimerProc函数 if (timerId == 0) { std::cout << "定时器设置失败!" << std::endl; return 1; } // 主循环 MSG msg; BOOL bRet; while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { // 错误处理 return 1; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } KillTimer(NULL, timerId); // 停止定时器 return 0; } ``` 上述代码,我们定义了一个名为TimerProc的回调函数,该函数会在定时器到达指定时间间隔时被调用。在main函数,我们使用SetTimer函数设置一个1秒钟的定时器,并传入回调函数TimerProc。然后进入主循环,等待消息的到来。最后,在程序结束前,我们使用KillTimer函数停止定时器。 以上就是在VS2010使用Win32控制台应用程序实现定时器的简单示例。当定时器触发时,会在控制台输出"定时器触发!"。需要注意的是,由于控制台应用程序是基于消息循环的,所以需要在主循环处理消息,以便正常接收和处理定时器事件。 ### 回答3: 在VS2010使用Win32控制台应用程序使用定时器实例主要有以下步骤: 1. 创建一个新的Win32控制台应用程序项目。 2. 在主函数使用SetTimer函数来创建定时器。SetTimer函数的原型如下: UINT_PTR SetTimer( HWND hWnd, // 窗口句柄,控制台应用程序没有窗口句柄,可以传入NULL UINT_PTR nIDEvent, // 定时器标识符,可以自定义一个ID UINT uElapse, // 定时器间隔时间,以毫秒计算 TIMERPROC lpTimerFunc // 定时器回调函数,即定时器事件处理函数 ); 3. 在定时器回调函数处理定时器事件。定时器回调函数的原型如下: VOID CALLBACK TimerProc( HWND hwnd, // 窗口句柄,控制台应用程序没有窗口句柄,可以传入NULL UINT uMsg, // 消息标识符 UINT_PTR idEvent, // 定时器标识符,与SetTimer函数传入的值相同 DWORD dwTime // 当前时间 ); 4. 在定时器回调函数可以添加需要定时执行的逻辑,例如打印一些信息。 5. 调用GetMessage函数或使用无限循环语句来保持控制台程序的运行。 6. 在程序结束前,使用KillTimer函数取消定时器。KillTimer函数的原型如下: BOOL KillTimer( HWND hWnd, // 窗口句柄,控制台应用程序没有窗口句柄,可以传入NULL UINT_PTR uIDEvent // 定时器标识符,与SetTimer函数传入的值相同 ); 以上是在VS2010使用Win32控制台应用程序使用定时器实例的基本步骤。定时器可以用于定时执行某些任务或事件,例如更新数据、刷新界面等。控制台应用程序没有窗口句柄,但定时器函数仍然可以使用,只需要将窗口句柄参数传入NULL即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值