写多进程程序碰到的一个问题
来源:互联网 发布:php扩展开发手册 编辑:程序博客网 时间:2024/09/21 08:57
最近碰到了一个程序设计方面的小问题,最后以一种不完美的的方法解决了它,说出来可能比较有意思:
在写我的程序(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;
}
- 写多进程程序碰到的一个问题
- 写一个Transform Filter碰到的问题
- 写PL/SQL程序时碰到的一些问题
- 刚才写用户注册程序时碰到的怪问题
- 写PL/SQL程序时碰到的一些问题
- 写MFC程序中碰到的一些小问题
- 写一个Transform Filter碰到的问题(2)
- 碰到一个郁闷的问题
- 偶然碰到的一个问题
- 编程碰到的一个问题
- 碰到的一个编码问题
- 写android程序碰到的一些记录
- 碰到写xml文件的一个错误
- 写短信发送器碰到的问题
- <自己动手写CPU>碰到的问题
- 这几天写了个小程序,期间碰到的问题,现已解决
- UMIP程序中碰到的问题
- 编写Java程序时碰到的问题
- 联赛第3轮
- 我的Java的学习历程
- 【转】对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16,GBK,GB2312的理解[holen@donews]
- 起程——今天
- ASP FAQ,无法打开关键字的解决方案
- 写多进程程序碰到的一个问题
- GG两周年
- CODER经典语句收集
- 龟仙人今日落户,哈哈
- struts设计上的一点想法
- 论‘地图编辑器’
- 深刻理解Linux进程间通信(IPC)
- 区位码查询-来自倚天龍記
- 4.3