软件日志

在一个健全的软件中,日志系统是必不可少的,因为软件发布到各个地方你并不总是有条件去下断点然后去调试。而且如果你的软件中大量使用多线程,那么即使你有条件断点恐怕也是无济与事,因此最古老也是最有效的方法就是为软件实现一个健全的日志模块。 但是日志过多是会影响效率的,日志过少出问题时又难以用于分析。因此我们可以为日志分级。日志模块可以导出接口如下: int log_init(void); int log_set_level(int level); int log_add(int level, const char *format, ...); int l……

代码正交性的一种实现

《unix编程艺术》里面讲到在写代码时尽可能的让代码保持正交性, 但是其实在有些情况下正交性也不是这么容易达到的, 下面举例两个函数, 虽然功能不是很实用, 但是表现的现象在项目中还是经常会碰到的: int sum_a(const int a[], const int b[], int cnt) { int i; int sum; sum = 0; for (i = 0; i < cnt; i++) /*--------------------------line1--------------------------*/ sum += a[i] + b[i]; /*--------------------------l……

关于MFC的MVC一些想法

在写MFC的时候, 很少是一个对话框能够搞定的, 一般都需要多个对话框交互, 如要是DoMudule的对话框也还好, 因为这种对话框一般不用操作父窗口或者与他平级的窗口, 但是如果是类似在一个 PropertySheet或者更复杂时, 就会出现要多个对话框进行交互. 类似下面一种情况: A区域是一个全局区域(如一个树形控件), B区域根据A区域的选择是用来显示不同的对话框, C域可能是一个Log Window, D区域可能是一些全局按钮(它的操作影响到所有会在B区域出现的对话框), 所有在B区域出现的对话框都要……

锁对于性能的影响

很偶然的机会发现了无锁队列,然后又很偶然的接触到并行编程,虽然还没弄明白内存屏障等问题,但是历史遗留下一小段测试代码,在这段测试代码中我用分别用lock-free或lock-based方式将一个变量进行自增, 效果竟然差的惊人, 肉眼都能感觉到效率不止差了至少四倍之多。下面看代码: [c] #include <Windows.h> #define LOCK_FREE 1 int cnt; HANDLE hMutex; static DWORD WINAPI work_thread(void *param) { int i; for (i = 0; i < 1000000; i++) { #if LOCK_FREE //Wa……

关于配置文件协议制定

今天关于某些UI设置怎么保存以便下次加载时重现上次UI设置开会做了讨论(一共就3个人^-^!),我提出使用文本化协议将UI设置存储为文本协议,当下次点开UI时首先去解析设置文本,然后重现用户的设置。 没想到的是,我理由都没提出就被两人集体反对。反对理由很简单,他们想用二进制方式来存储,这样一个fread就可以将一个structure读出来,连解析都省了。 那么我就在这里陈述一下理由好了。 其实理由也很简单: 1. 因为设置不多, 就算用C来解析字符串,也费不了多大功夫,效率不是问……