存档在 ‘MFC’ 分类

MFC中的调试宏

2013年1月4日

•ASSERT()被测试它的参数,若参数为0,则中断执行并打印一段说明消息。在 Release 版本的程序中它不起任何作用。
•VERIFY()和 ASSERT()很相似,区别在于在 Release 版本中它仍然有效(译者注:原作者在这里没有讲清楚,VERIFY()不会打印说明,只是会对参数表达式求值)。
•ASSERT()使用的时候必须保证参数表达式中不能有函数调用(译者注:ASSERT()宏在 Release 版本中不对表达式求值),因此对于任何有函数调用的参数表达式,应该使用宏 VERIFY(),以保证表达式中的函数调用在 Release 版本中会被正确求值。
•TRACE()基本上就是函数 printf()的一个复制品,唯一的区别是它把结果输出到调试窗口。在 Release 版本中,它也是无效的。
•这三个宏在 Release 版本中都不会产生任何实质性的影响,它们是否起作用取决于是否定义了预定义了宏 _DEBUG。这是对 Microsoft Visual C++ 而言,在其它的编译器中可能其它不同的宏。
*当然还可以用MessageBox()来调试程序输出,也可查找是哪出了错误.

MFC多线程程序的同步机制

2013年1月3日

简介

本文探讨基本的同步概念,并实际动手帮助新手掌握多线程编程。本文的重点在各种同步技巧。

基本概念

在线程执行过程中,或多或少都需要彼此交互,这种交互行为有多种形式和类型。例如,一个线程在执行完它被赋予的任务后,通知另一个线程任务已经完成。然后第二个线程做开始剩下的工作。

下述对象是用来支持同步的:

1)信号量

2)互斥锁

3)关键区域

4)事件

每个对象都有不同的目的和用途,但基本目的都是支持同步。当然还有其他可以用来同步的对象,比如进程和线程对象。后两者的使用由程序员决定,比如说判断一个给定进程或线程是否执行完毕为了使用进程和线程对象来进行同步,我们一般使用Wait*函数,在使用这些函数时,你应当知道一个概念,任何被作为同步对象的内核对象(关键区域除外)都处于两种状态之一:通知状态和未通知状态。例如,进程和线程对象,当他们开始执行时处于未通知状态,而当他们执行完毕时处于通知状态,

为了判断一个给定进程或线程是否已经结束,我们必须判断表示其的对象是否处于通知状态,而要达到这样的目的,我们需要使用Wait*函数。

Wait*函数

下面是最简单的Wait*函数: » 阅读更多: MFC多线程程序的同步机制