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

类别:编程语言 点击:0 评论:0 推荐:

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

在写我的程序(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;
}


本文地址:http://com.8s8s.com/it/it22593.htm