晃晃悠悠

isrobert

  VC知识库BLOG :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 登录 ::
  12 随笔 :: 0 文章 :: 34 评论 :: 0 Trackbacks
<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

留言簿(0)

随笔分类

随笔档案

文章档案

相册

收藏夹

相关链接

搜索

最新评论

阅读排行榜

评论排行榜

今天在留意到这个问题的严重性,真是失败。。。
我的程序需要保存前次设置,如果多次打开程序,如果关闭是需要保存设置,那么后关闭的程序会覆盖前次的设置。。。 所以,我们需要互斥!!!

感谢[zill_li]的留言!!

一、在VC下的实现

Visual C++ 是WIN32编程最主要也是最强大的编程工具这一,引用一名话来说VC就是“只有你想不到的,没有VC做不到的”。废话少说,下面看看用VC是如何这个功能。

A. 使用编译器来实现(使用MFC框架):

在.cpp文件开头加上以下几行:
#pragma data_seg("Shared")    
int volatile g_lAppInstance =0;
#pragma data_seg()
#pragma comment(linker,"/section:Shared,RWS")


我们来看一下上面的内容:
第一句 #pragma data_seg("Shared") 创建一个称为Shared 的新节。
第二句 int volatile g_lAppInstance =0 将 g_lAppInstance 放入Shared节中。注意此时只有将g_lAppInstance初始化,编译器才会将其放入Shared节中,否则,将放入Shared以外的节。(实际上Visual C++ 编译器提供了一个allocate 说明符,使我们可以将数据放到任何节中。)
第三句指示编译器Shared 节结束。 #pragma comment(linker,"/section:Shared,RWS")

这一句,我们使编译链接器知道我们的Shared节具有读,写,共享的属性。这是我们实现互斥运行的关键。这样我们就可以在应用程序之间的多个实例之间共享g_lAppInstance 变量。
在InitInstance() 函数中加入: if(++g_lAppInstance>1)
{
    AfxMessageBox("程序已经运行!");
    return FALSE;
}
以上代码的作用是在程序是开始对g_lAppInstancd 加1 ,如果发现其值大于1,那么显示Message Box ,并返回FALSE。(注意:在MFC中如果InitInstance返回FALSE,程序将不会被运行!)

B.使用命名互斥对象:

使用API函数CreateMutex来创建命名互斥对象来实现程序互斥是一个比较通用的方法,我们可以在IninInstance()函数加入如下代码: HANDLE hObject = CreateMutex(NULL,FALSE,"LJPXYXC");
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
    CloseHandle(hObject);
    AfxMessageBox("程序已经运行!");
    return FALSE;
}
以上的CreateMutext函数创建一个称为“LJPXYXC”的命名的互斥对象,当程序的第二个实例运例时,调用CreateMutex 返回ERROR_ALREADY_EXISTS。我们根据这个值来实现程序的互斥运行。

方法不止这几种,但是目的只有一个,就是让程序不能多次启动~~
posted on 2007-03-30 17:59 isrobert 阅读(2167) 评论(4)  编辑 收藏

评论

# A方法显然有点小问题 2007-04-02 09:06 局部变量
多线/进程, 只用个volatile是不够的

# re: 程序互斥~ 2007-04-04 18:16 个性礼品
基本有道理

# re: 程序互斥~ 2007-04-12 09:34 isrobert
多线程应该可以吧~
多进程没研究过,不知道:)

# re: 程序互斥~ 2007-04-24 09:59 清风雨
volatile不能做互斥保护的,一般用于告诉编译器不要过度优化,重新读取该值:别的线程或硬件会修改变量。

我用到过如下:
m_flag = true;
while( m_flag ) DoSomething(); //等待另一个线程修改该变量值
如果这个bool m_flag不定义为volatile,那么release会被编译器优化(VC8试过,因为volatile是关键字,所以gcc没试,理论上它应该也会做类似优化)为 while( true ) DoSomething();


标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]