摘要: Case具有两种格式。简单Case函数和Case搜索函数。--简单Case函数CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女'ELSE '其他' END--Case搜索函数CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女'ELSE '其他' END这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功 阅读全文
posted @ 2009-04-13 11:15 dzqabc 阅读(2047) 评论(0) 推荐(0) 编辑
摘要: 用户感觉到软件的好用,就是可以定时地做一些工作,而不需要人参与进去。比如每天定时地升级病毒库,定时地下载电影,定时地更新游戏里的人物。要想实现这些功能,就可以使用定时器的API函数CreateWaitableTimer和SetWaitableTimer来实现了,这对API函数创建的时钟是比较精确的,可以达到100倍的10亿分之一秒。函数CreateWaitableTimer和SetWaitableTimer声明如下:WINBASEAPI__outHANDLEWINAPICreateWaitableTimerA( __in_opt LPSECURITY_ATTRIBUTES lpTimerAtt 阅读全文
posted @ 2009-04-09 15:34 dzqabc 阅读(783) 评论(0) 推荐(0) 编辑
摘要: 线程的基础知识1.进程与线程有那些区别和联系? 每个进程至少需要一个线程。 进程由两部分构成:进程内核对象,地址空间。线程也由两部分组成:线程内核对象,操作系统用它来对线程实施管理。线程堆栈,用于维护线程在执行代码时需要的所有函数参数和局部变量。 进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。 如果在单进程环境中,有多个线程正在运行,那么这些线程将共享单个地址空间。这些线程能够执行相同的代码,对相同的数据进行操作。这些线程还能共享内核对象句柄,因为句柄表依赖于每个进程而不是每个线程存在。进程使用的系统资源比线程多得多。 阅读全文
posted @ 2009-04-09 12:56 dzqabc 阅读(300) 评论(0) 推荐(0) 编辑
摘要: 内核对象可用于不同进程间线程的同步。1.Wait系列函数WaitForSingleObject 挂起当前线程,直到该函数返回。(被等待的对象处于Signal状态或等待超时) 若有多个线程调用该函数等待同一个内核对象,那么当这个内核对象处于Signal状态时只有一个线程会被唤醒。 若线程中有创建Windows的代码,需要用MsgWaitForMultipleObjects代替WaitForSingleObject,否则会产生死锁。WaitForMultipleObjects若需要同时等待多个内核对象,则可以调用该函数2.事件内核对象自动事件当事件处于Signal状态时,只有一个等待该事件的线程会 阅读全文
posted @ 2009-04-09 11:29 dzqabc 阅读(302) 评论(0) 推荐(0) 编辑
摘要: WaitForSingleObject和WaitForMultipleObjects使用详解 WaitForSingleObject的用法DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds);参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果时间是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。hHandle可以是下列对象的句柄: Change notification Console i 阅读全文
posted @ 2009-04-09 10:36 dzqabc 阅读(1825) 评论(0) 推荐(0) 编辑
摘要: 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 阅读(950) 评论(0) 推荐(0) 编辑
摘要: 用VC编程,最重要的是要熟悉消息机制。但这一点好像并不是那么容易搞懂,至少现在我还不是完全明白,只有遇到问题时才想办法把它查清楚。 案例:通过SetTimer设置一个定时器,在OnTimer 中,设置弹出一个对话框,如MessageBox("Hello")。你会发现对话框会不断的弹出,而不是阻塞在那里?如果你对这个问题很清楚,并且不会认为这是多线程机制,那恭喜你,你一定对Windows消息机制比较熟悉,也比我知道的要多,那你就多给我挑挑毛病吧。否则,希望我的这篇文章能对你有所帮助。 首先说明,这个结果绝对不是多线程引起的。有同学开始认为是多线程,每次OnTimer 调用单独 阅读全文
posted @ 2009-04-08 17:02 dzqabc 阅读(1787) 评论(0) 推荐(0) 编辑
摘要: 回调函数 Callback Function 什么是回调函数? 首先做一个形象的比喻: 你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机是我通知你的手段,它就是回叫函数,也叫回调函数.(来自:http://book.77169.org/data/web5505/20050228/20050228__2937934.html) 回调函数是应用程序提供给W 阅读全文
posted @ 2009-04-08 16:32 dzqabc 阅读(225) 评论(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 阅读(236) 评论(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 阅读(368) 评论(0) 推荐(0) 编辑