摘要: CxxxDlg::OnTimer(UINT nIDEvent){ static int i = 0,j; j = i++; if (i==2) KillTimer(nIDEvent); MessageBox("!"); i++; CString str; str.Format("%d,%d ",j,i); ::OutputDebugString(str);} 以上代码在执行的时候,会弹出2个messagebox。很多人都有1个疑问,那就是当第一个消息框弹出的时候,应该相当于是模态对话框,怎么还会第二次进入OnTimer,并且再次弹出messagebox? 阅读全文
posted @ 2009-04-08 17:17 dzqabc 阅读(972) 评论(0) 推荐(0) 编辑
摘要: 用VC编程,最重要的是要熟悉消息机制。但这一点好像并不是那么容易搞懂,至少现在我还不是完全明白,只有遇到问题时才想办法把它查清楚。 案例:通过SetTimer设置一个定时器,在OnTimer 中,设置弹出一个对话框,如MessageBox("Hello")。你会发现对话框会不断的弹出,而不是阻塞在那里?如果你对这个问题很清楚,并且不会认为这是多线程机制,那恭喜你,你一定对Windows消息机制比较熟悉,也比我知道的要多,那你就多给我挑挑毛病吧。否则,希望我的这篇文章能对你有所帮助。 首先说明,这个结果绝对不是多线程引起的。有同学开始认为是多线程,每次OnTimer 调用单独 阅读全文
posted @ 2009-04-08 17:02 dzqabc 阅读(1827) 评论(0) 推荐(0) 编辑
摘要: 回调函数 Callback Function 什么是回调函数? 首先做一个形象的比喻: 你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机是我通知你的手段,它就是回叫函数,也叫回调函数.(来自:http://book.77169.org/data/web5505/20050228/20050228__2937934.html) 回调函数是应用程序提供给W 阅读全文
posted @ 2009-04-08 16:32 dzqabc 阅读(244) 评论(0) 推荐(0) 编辑
摘要: 什么时候我们需要用到SetTimer函数呢?当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了。 使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。1.1 用WM_TIMER来设置定时器先请看SetTimer这个API函数的原型UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器 UINT uElapse, // 时间间 阅读全文
posted @ 2009-04-08 16:23 dzqabc 阅读(261) 评论(0) 推荐(0) 编辑
摘要: SetTimer函数的用法 1 )用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类中,调用就不用指定窗口句柄了 于是SetTi. 阅读全文
posted @ 2009-04-08 14:19 dzqabc 阅读(402) 评论(0) 推荐(0) 编辑
摘要: 内核对象主要要用来供系统和应用程序管理系统资源,像进程、线程、文件等。存取符号对象、事件对象、文件对象、作业对象、互斥对象、管道对象、等待计时器对象等都是内核对象。我们在编程时经常要创建、打开和操作它们。内核对象通过调用函数来创建,如要创建文件映射对象,就调用CreateFileMapping函数。每个内核对象都会分配一个内存块,只能由其内核访问。该内存块是一种数据结构,用于管理对象的各种信息。 我们的应用程序不能直接访问内核对象的数据结构。需要通过Windows提供的函数来访问。 内核对象由内核拥有,并不是进程所拥有。每个内核对象都有一个计数器来存储有多少个进程在使用它的信息。 内核对象有安 阅读全文
posted @ 2009-04-08 12:34 dzqabc 阅读(285) 评论(0) 推荐(0) 编辑
摘要: VariantClear 和 VariantInit 函数两个函数是做什么的呢?近日程序出错,我不得不认真研究了一下它们的作用。1.VariantClear()函数Clears the contents of a variant and sets the variant to VT_EMPTY.如何做到Clears the contents of a variant (清空变量的内容呢)? 实际是通过调用相应变量类型的释放空间的方法来达到这个目的的。而且他不仅释放了空间,还初期化了变量。简单的英文说明,不译了。CommentsVariantClear is used to clear the. 阅读全文
posted @ 2009-04-08 12:28 dzqabc 阅读(4109) 评论(0) 推荐(0) 编辑
摘要: 9.6.2 互斥对象与关键代码段的比较就等待线程的调度而言,互斥对象与关键代码段之间有着相同的特性。但是它们在其他属性方面却各不相同。表9 - 1对它们进行了各方面的比较。表9-1 互斥对象与关键代码段的比较特性互斥对象关键代码段运行速度慢快是否能够跨进程边界来使用是否声明HANDLE hmtx;CRITICAL_SECTION cs;初始化h m t x = C r e a t e M u t e x (N U L L,FA L S E,N U L L);I n i t i a l i z e C r i t i c a l S e c t i o n ( & e s );清除C l 阅读全文
posted @ 2009-04-08 11:36 dzqabc 阅读(554) 评论(0) 推荐(0) 编辑