settimer

定时器与多线程 SetTimer and Multi-Thread 每个线程独立使用一个定时器

旧城冷巷雨未停 提交于 2020-03-01 11:12:46
定时器与多线程 SetTimer and Multi-Thread 每个线程独立使用一个定时器 生产者——消费者 模拟程序,需求如下: 将生产者和消费者模拟算法封装在一个动态链接库中,主程序调用相关函数。生产者放入产品和消费者取走产品的速度可调节。 分别用循环队列和栈实现。 一般模拟这个算法都是生产这,消费者各开一个线程,同步访问一个共享缓冲区。但是需求要求能调节速度,我的思路是在 每个线程里单独创建一个定时器,但是Windows下定时器特性是: 每隔定时时间,Windows系统放入一个 WM_TIMER 消息到应用程序的消息队列中。 所以我的解决方案如下: /* 更改定时器的消息 */ #define WM_SETTIMER WM_USER + 100 /* 生产者线程函数 */ DWORD WINAPI ProducerFunc(LPVOID lpParameter) { MSG msg; UINT producerTimerId; /* Create a message queue for this thread */ PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); producerTimerId = SetTimer(NULL, 0, g_uProducerTimer, NULL); while(GetMessage(&msg,

调试NO_MORE_USER_HANDLES问题

前提是你 提交于 2019-12-28 11:25:49
文章目录 问题描述 分析过程 问题描述 一台站机管理m台分机,测试多分机时,发现如下现象:当分机数位400时,界面卡死;当分机数为200时,一切正常。 由于界面刷新是通过定时器来不停刷新界面的,于是在定时器处理函数中添加断点。但该断点一直没执行。 在msdn上查Cwnd::SetTimer说明,该函数正常返回非零数值,失败则返回零。检查SetTimer返回值,在失败情况下,通过GetLastError()获取最近的错误代码。结果发现SetTimer失败,错误码为1158. 在MSDN是这样藐视1158的: ERROR_NO_MORE_USER_HANDLES 1158 (0x486) The current process has used all of its system allowance of handles for Window Manager objects. 分析过程 不清楚“handles for window manager objects”什么意思,字面意思是窗口管理对象句柄。于是通过“任务管理器”来查看该软件对应的句柄数和线程数,结果发现句柄数和线程数分别为555和14,和其他进程对比,并不是特别多。 在网上搜索相关资料,有篇文章说,打开“任务管理器”的"用户对象"列,观察其数值,如果接近10000,就必须优化(操作系统为每个进程最多分配10000个用户对象)

《Windows程序设计》之计时器2

我怕爱的太早我们不能终老 提交于 2019-11-27 18:42:04
这是使用SetTimer的第二种方法-----回调函数 下面是几行关键的代码 VOID CALLBACK TimerProc(HWND,UINT,UINT,DWORD);//定义回调函数 SetTimer(hwnd,ID_TIMER,1000,TimerProc);//设置计时器,并调用回调函数 //回调函数实现 void CALLBACK TimerProc(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTime) { static BOOL fFlipFlop=FALSE; HBRUSH hBrush; HDC hdc; RECT rc; MessageBeep(-1); fFlipFlop=!fFlipFlop; GetClientRect(hwnd,&rc); hdc=GetDC(hwnd); hBrush=CreateSolidBrush(fFlipFlop?RGB(255,0,0):RGB(0,0,255)); FillRect(hdc,&rc,hBrush); ReleaseDC(hwnd,hdc); DeleteObject(hBrush); } 来源: CSDN 作者: l0g1n 链接: https://blog.csdn.net/l0g1n/article/details/7495577

Windows程序设计:计时器

微笑、不失礼 提交于 2019-11-27 18:40:39
我们可以通过调用SetTimer函数建立一个计时器。SetTimer函数有一个时间间隔范围为1~4294967295毫秒(将近50天)的整型参数,这个值指示windows每隔一定时间给您的出现发送一个WM_TIMER消息。 在Windows98中,计时器具有55毫秒的分辨率。在Windows NT中,计时器具有10毫秒的分辨率。Windows不能以高于这一分辨率的速度接受WM_TIMER消息。 SetTimer函数使用方法如下: SetTimer(hwnd, 1, uiMsecInterval, NULL); 第一个参数是其窗口过程将要接受WM_TIMER消息的窗口的句柄。第二个参数是计时器ID,他是一个非0数。第三个参数是一个32位无符号整数,以毫秒为单位指定一个时间间隔。第四个参数为回调函数的地址,若为NULL,则用默认的WndProc。也可以另外指定回叫函数: SetTimer(hwnd, 1, uiMsecInterval, TimerProc); 回叫函数TimerProc可定义如下: VOID CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime){} 我们可以调用KillTimer (hwnd, ID_TIMER)在任何时刻停止计时器。 下面的例子,按秒刷新,显示当前时间:

MFC定时器使用

二次信任 提交于 2019-11-26 14:57:36
MFC定时器实现方法 方法一:CWnd类提供的成员函数SetTimer实现定时器功能,只能在CWnd类或其派生类中调用。 方法二:Windows API函数SetTimer来实现。 MFC定时器 启动定时器 启动定时器就需要使用CWnd类的成员函数SetTimer。CWnd::SetTimer的原型如下: UINT_PTR SetTimer( UINT_PTR nIDEvent,//指定一个非零的定时器ID UINT nElapse,//指定间隔时间,单位为毫秒 void (CALLBACK* lpfnTimer)(HWND, UINT, UINT_PTR, DWORD ) //指定一个回调函数的地址, //如果该参数为NULL,则WM_TIMER消息被发送到应用程序的消息队列,并被CWnd对象处理。 //参数lpfnTimer如果此函数成功则返回一个新的定时器的ID,我们可以使用此ID通过KillTimer成员函数来销毁该定时器,如果函数失败则返回0。 ); 处理定时事件 1 通过WM_TIMER消息的消息响应函数 2 通过回调函数 。 如果要启动多个定时器就多次调用SetTimer成员函数。另外,在不同的CWnd中可以有ID相同的定时器,并不冲突。 如果调用CWnd::SetTimer函数时最后一个参数为NULL,则通过WM_TIMER的消息处理函数来处理定时事件。添加WM