写多进程程序碰到的一个问题

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

最近碰到了一个程序设计方面的小问题,最后以一种不完美的的方法解决了它,说出来可能比较有意思:

在写我的程序(FlashIME,http://www.d2ksoft.com 一种仿输入法软件)当中,需要有一个类记住最近的输入到当前编辑器的字符串(旧字符串)。

当我下一次输入新的字符串的时候,我必须在输入新的字符串之前,先比较剪贴板中的内容是否和旧字符串的内容一样。如果一样,就有一些操作,如果不一样,又有另外一些操作(操作的细节无关紧要)。然后我输入新的字符串,再用新字符串的内容更新旧字符串的内容。

我用一个CManageStr类来存储旧字符串,一开始这个类CManageStr是这样设计的:

class CManageStr{

public:

CManageStr():_buf(0){

}

~CManageStr(){

free(_buf);

_buf=0;

}

bool compare_with_clip();

update_from_new(const char* input);

{

free(_buf);

_buf=0;

_buf=malloc(strlen(input)+1);

strcpy(_buf,input);

}

private:

char* _buf;

}

因为不能知道最近输入的字符串可能有多大,所以一开始的想法是用动态分配内存的办法存储旧字符串。

但是由于开发的是仿输入法的程序,所以CManageStr类型的对象将会被多个进程共享使用。而指针显然不能被多个进程共享。这样就不能使用诸如_buf之类的指针类型的数据成员。

仔细考虑为什么要存储最近输入的字符串?实际上目的只是为了和剪贴板中的字符串比较,比较的结果只需要知道两个字符串是否相同。如果能够放宽“相同”的定义,那么就可以重新设计CManageStr的数据成员,以使得CManageStr对象可以被多个进程共享。

例如,将字符串中的所有字符的ascii码相加得到一个整数(check sum)。要比较两个字符串是否相等,只要比较它们的checksum是否相等就可以了。我还可以去每个字符串的前128位得到子字符串。然后比较这两个子字符串。在我的程序中,我结合使用了这两个办法。当然这样做只能保证有很大的概率得到我想要的结果。但是考虑到我程序的具体应用环境,一个大概率正确(而不是绝对正确)的结果也是可以接受的。

class CManageStr{

public:

CManageStr():_latest_checksum(0){

}

~CManageStr(){

}

bool compare_with_clip();

update_from_new(const char* input);

{

sample(input,_latest_prefix,_latest_checksum);

}

private:

void sample(const char* input, char *prefix, unsigned long& checksum)

{ ...

}

private:

char _latest_prefix[128];

unsigned long _latest_checksum;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航