代码改变世界

随笔档案-2013年1月26日

Chapter11-"windows线程池" 之 内核对象触发调用回调函数

2013-01-26 23:58 by java20130722, 441 阅读, 收藏,
摘要: 众所周知,一般可以调用WaitForSingleObject、WaitForMultiObject来实现线程同步。但是当多个线程等待同一个内核对象变为触发态时,这并不是一种明智的做法,这样会浪费大量的系统资源。而windows线程池很有效提供系统性能。 利用windows线程池实现,当内核对象变为触发态时,自动调用一个回调函数,一如既往的需要四步创建对应的回调函数,回调函数必须符合如下原型VOID CALLBACK WaitCallback( _Inout_ PTP_CALLBACK_INSTANCE Instance, ... 阅读全文

C++ 定时器使用

2013-01-26 19:45 by java20130722, 473 阅读, 收藏,
摘要: 用WM_TIMER来设置定时器先请看SetTimer这个API函数的原型UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器 UINT uElapse, // 时间间隔,单位为毫秒 TIMERPROC lpTimerFunc // 回调函数 ); 例如SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了,例如:UIN... 阅读全文

Chapter11-"windows线程池"之 间隔执行函数

2013-01-26 19:25 by java20130722, 492 阅读, 收藏,
摘要: 按照一定的时间间隔,周期性调用某个函数,大致需要用到以下五步按照一定的时间间隔,周期性被调用的TimerCallback函数的原型如下VOID CALLBACK TimerCallback( _Inout_ PTP_CALLBACK_INSTANCE Instance, _Inout_opt_ PVOID Context, _Inout_ PTP_TIMER Timer );调用CreateThreadpoolTimer函数将TimerCallback函数通知给线程池(thread pool)PTP_TIMER WINAPI CreateThreadpoo... 阅读全文

Chapter11-"windows线程池"之异步调用函数

2013-01-26 15:18 by java20130722, 268 阅读, 收藏,
摘要: 利用线程池(thread pool)异步调用函数时,不需显式调用 CreateThread 函数,系统会为进程自动创建线程池(thread pool)。线程池的每个线程实际运行你事先定义好的回调函数。 写到这里,也许大多人会想:怎么不直接调用众所周知的 CreateThread 函数去创建线程?这里就有必要讲一下线程池(thread pool)的机制了。 线程池(thread pool)的线程在执行完后不是立即销毁的(CreateThread创建的线程执行完成以后就销毁了),而是再次进入线程池(thread pool),等待进程请求该线程的再次执行。线程池的这种机制使得在需要创建许多线... 阅读全文

__stdcall、__cdecl 、CALLBACK 几种函数修饰符

2013-01-26 10:19 by java20130722, 930 阅读, 收藏,
摘要: CALLBACK == WINAPI ==__stdcall实际上就是一种调用模式,就是约定由调用函数来自行解决压栈参数,同 pascal 调用。回调函数只能是类的静态成员函数或是类外定义的全局函数#define CALLBACK __stdcall #define WINAPI __stdcall #define WINAPIV __cdecl #define APIENTRY WINAPI #define APIPRIVATE __stdcall #define PASCAL __stdcall #define cdecl _cdecl #ifndef... 阅读全文