hdqqq

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  35 随笔 :: 0 文章 :: 104 评论 :: 0 Trackbacks
共2页: 1 2 
hThread[i] = CreateThread(NULL, 0, helloFunc, (LPVOID)i, 0, NULL);
上面这句是有问题的,因为CreateThread返回时候,并不保证线程已经启动了,所以进入下一个循环后i就被修改,导致线程取得了错误的参数.
这段代码是创建微软xml com对象的,程序就这里用了com接口, 看来对异常处理的还是不够.
测试还是不够,让兄弟们见笑了.
有可能.
所以还需要一个附加机制来记录程序的运行栈,可以象这样
#ifdef _DEBUG
struct _run_stack {
static std::stack< std::string > _debug_stack;
};
#endif

template<typename a>
std::string make_debug(a pa)
{
stringstream ls;
ls << pa << std::endl;
return ls.str();
}

template<typename a,typename b>
std::string make_debug(a pa, b pb)
{
stringstream ls;
ls << pa << " " << pb << std::endl;
return ls.str();
}
...按需要扩充

struct debug_help {

template<typename a>
debug_help(a pa) {
_run_stack::_debug_stack.push(make_debug(pa));
}
template<typename a, typename b>
debug_help(a pa,b pb) {
_run_stack::_debug_stack.push(make_debug(pa,pb));
}
...按需要扩充

~debug_help() {
_run_stack::_debug_stack.pop();
}
};

-----
实际使用
void excepti_func
{
#ifdef _DEBUG
debug_help(__FILE__,__LINE__);
#endif
....
}

或者
void _fd
{
int i,j,k;
for (i = 0; i< 100; i__) {
debug_help(__FILE__,__LINE__, i);
for (j = 0; j < 100; j++) {
debug_help(__FILE__,__LINE__, j);
for(k = 0; k < 100; k++) {
debug_help(__FILE__,__LINE__, k);
}
}
}
}

出现异常的时候,只要把_run_stack::_debug_stack显示出来看看就可以了.也可以通过条件编译,在最终release中将其去掉.
这个其实使用了编译器内建的__FILE__,和 __LINE__宏,在编译器就确定了的,上面的代码来说,如果在某个函数中处理了异常并显示信息,以后不管这个函数在那里被调用,显示的异常信息都是一样的. 象下面

void excep_handle(...)
{
try {
...
THROW_EX( " there is a exception\n " );
} catch (more_exception & e) {
SET_CATCH_POS(e);
std::cout << e;
}
}

而调用的函数是这样的
void test()
{
int i,j,k;
for (i = 0; i < 100; i++) {
excep_handle(...)
for (j = 0; j < 100; j++) {
excep_handle(...)
for(k = 0; k < 100; k++) {
excep_handle(...)
}
}
}
}

上面的代码,不管在那层循环的调用中,异常弹出的都是同一个文件和同一个行数无法知道具体是在那一层出现的异常.
re: zlib 压缩管道 hdqqq 2006-11-22 16:28
@ar4ever
你可以在zlib的官方网站下载它的压缩包,以zlib1.2.3为例,解压缩后,其目录下的project子目录下,有vc 6 的工程文件,有8个项目,分别是汇编和c代码的dll和lib输出的工程,你编译全部后,把你要用的lib 和头文件 zlib.h 放到vc的include 和lib设置中就可以了.
共2页: 1 2