精华内容
下载资源
问答
  • 易语言禁止程序重复运行源码,禁止程序重复运行
  • 易语言源码禁止程序重复运行.rar 易语言源码禁止程序重复运行.rar 易语言源码禁止程序重复运行.rar 易语言源码禁止程序重复运行.rar 易语言源码禁止程序重复运行.rar 易语言源码禁止程序重复运行.rar
  • 易语言源码易语言禁止程序重复运行源码.rar 易语言源码易语言禁止程序重复运行源码.rar 易语言源码易语言禁止程序重复运行源码.rar 易语言源码易语言禁止程序重复运行源码.rar 易语言源码易语言禁止程序重复运行...
  • 易语言源码易语言端口禁止程序重复运行源码.rar 易语言源码易语言端口禁止程序重复运行源码.rar 易语言源码易语言端口禁止程序重复运行源码.rar 易语言源码易语言端口禁止程序重复运行源码.rar 易语言源码易语言...
  • 重复运行程序.rar

    2020-04-05 22:32:56
    重复运行程序.rar 不重复运行程序.rar 不重复运行程序.rar 不重复运行程序.rar 不重复运行程序.rar 不重复运行程序.rar
  • 用创建信号灯的方式防止程序重复运行 用创建信号灯的方式防止程序重复运行 用创建信号灯的方式防止程序重复运行 用创建信号灯的方式防止程序重复运行 用创建信号灯的方式防止程序重复运行
  • 重复运行程序.e.rar

    2020-04-05 22:32:03
    重复运行程序.e.rar 不重复运行程序.e.rar 不重复运行程序.e.rar 不重复运行程序.e.rar 不重复运行程序.e.rar 不重复运行程序.e.rar
  • C++如何使应用程序运行一个实例   在应用程序类中使用互斥量是应用程序运行一次(一个实例)的简单的方法。 实例 第一步:新建一个基于对话框的工程,命名随意如:*****Dlg   第二步: ...

    C++如何使应用程序只运行一个实例

     

    在应用程序类中使用互斥量是应用程序只运行一次(一个实例)的简单的方法。

    实例

    第一步:新建一个基于对话框的工程,命名随意如:*****Dlg

     

    第二步: 使用编辑器自带的生成GUID生成工具“工具--创建GUID(G)”。以 "#define one "产生的全局标志""的形式,添加至对话框头文件中(****Dlg.h)。如下图:

    guid格式,可以随意选择前三个,都可以生成需要用的那种guid。

    本例中产生的语句如下:#define one "0xf8385d66, 0x2427, 0x4062, 0x8c, 0x9f, 0x35, 0x8a, 0xb5, 0xff, 0x7f, 0x17"

     

    第三步: 在应用程序类C****DlgApp::InitInstance()中,用CreateMutex函数创建一个互斥量,后调用函数GetLastError()。如果结果等于ERROR_ALREADY_EXISTS说明已经有一个实例在运行了这时返回FALSE.

    BOOL C****DlgApp::InitInstance()
    {  
        //handle为声明的HANDLE类型的全局变量,在头文件中申明为HANDLE handle;
        handle = ::CreateMutex(NULL,FALSE,one);
        if(GetLastError()==ERROR_ALREADY_EXISTS)   
        {  
            AfxMessageBox("应用程序已经在运行");
            return FALSE;   
        }
    }

    第四步:在C*****DlgApp::ExitInstance()中,删除这个互斥量   //ExitInstance需要由类向导添加,进入类向导,“项目--类向导”。如下图操作。

    int C****DlgApp::ExitInstance()
    {
        CloseHandle(handle);   
        return CWinApp::ExitInstance();
    }

     

     

    展开全文
  • 防止C++程序重复运行的几种方法

    千次阅读 2017-06-23 15:52:31
    今天给自己的程序加了防止重复运行的功能.用的是创建互斥量的方法,感觉还不错. 下面的帖子转自http://bbs.cfan.com.cn/viewthread.php?tid=793295   有时候,为了某些要求,我们希望程序实例只运行一次。...

    今天给自己的程序加了防止重复运行的功能.用的是创建互斥量的方法,感觉还不错.

    下面的帖子转自http://bbs.cfan.com.cn/viewthread.php?tid=793295

     

    有时候,为了某些要求,我们希望程序实例只运行一次。而在VB6中,我们可以很轻易的根据App.hPreInstance来判断程序是否已经运行。但是在C++中,这一切就变得不是那么容易。

      虽然WinMain函数有hPreInstance参数来指示,但是那是在Win16位的前提下,到了32Bit时代,那个参数已经完全成为摆设。

      而本文正好探讨了如何防止C++程序重复运行的方法。

      PS:因为本人使用MFC,所以为了方便,所有代码均为以MFC为基础。大家可以根据自己需要更改

      1.查找窗体

      对于存在GUI窗体(CUI暂不讨论)的程序来说,最容易想到的就是利用FindWindow,以标题作为参数进行查找主窗体,然后使其关闭即可。

      通常,我们能写出如下代码:

    复制代码
    //  Find Window by Caption
    //  Add this code in InitInstance function of class 
    //  you have derived from the CWinApp class

    HWND hWnd 
    =  ::FindWindow(NULL,  " MFCDialog " );

    if  (hWnd)
    {
      AfxMessageBox(
    " Has been running " );
      
    return  FALSE;
    }
    复制代码

     

    以上的代码可以简单的起到防止重复启动的效果,但是局限性很大。

      首先,由于在FindWindow中要指定窗体的标题,如果窗体的标题在程序运行中是不断变化的,那么就给搜索带来了一定难度。

      而且,如果其他程序也恰好是用相同的标题的话……- -#。当然,你可以通过在FindWindow中指定类名来减少错误。但是如果你看过我前面写的文章的话,你就会发现,MFC注册窗口类并不是那么随意,而是经过N次阴谋筹划之后……

      看来这方法的局限性的确很大- -#

      2.额外窗体存储

      此方法来源于对上面一种方法的补充,因为通过搜索MFC的窗体类比较困难,而且准确度不一定高。所以,我想到了使用额外窗体存储(Extra Widnow Memory)的方法

      PS:关于什么是额外窗体存储,请自行google或MSDN或查看我曾经写的The Analyses Of Windows Runnning Principle

      如果你使用SDK进行开发,可以在创建窗体时填充这一属性,然后用GetWindowLong获取。

      而由于我使用MFC,所以我更关注如何在MFC中使用这一属性。

      一般来说,我们可以使用SetWindowLong对额外窗体存储进行填充,然后用GetWindowLong获取,最后配合FindWindow来检验程序是否重复运行。
      

    复制代码
    //  Add this code in InitDialog function
    //  and you can specify any number you want
    BOOL bRet  =  ::SetWindowLong(GetSafeHwnd(), GWL_USERDATA,  256 );

    //  Add this code in InitInstance function
    //  Find Window by using extra memory

    HWND hWnd 
    =  FindWindow(NULL,  " MFCDialog " );

    if  (hWnd)
    {
        BOOL bRet 
    =  ::GetWindowLong(hWnd, GWL_USERDATA);
        
        
    if  ( 256   ==  bRet)   //  compare
        {
            AfxMessageBox(
    " Has been running " );
            
    return  FALSE;
        }
    }
    复制代码

     

     3.全局原子

      你可以使用GlobalAddAtom将某个特定的字符串添加到全局原子列表(Global Atom Table),然后在程序运行时检查该字符串即可。

      但是这个方法有一个致命的弱点,程序退出时,Windows不会自动为你删除添加到列表中的Atom,而是需要你自己使用GlobalDeleteAtom进行删除。

      这就意味着,如果你的程序意外的退出了,没有删除添加的Atom,那么,你的程序将无法运行。

      所以,这并不是一个好方法。


      4.枚举进程

      这或许是一个毕竟正常,或者说相对稳定的方法。

      我们可以使用CreateToolhelp32Snapshot或者EnumProcess来枚举当前的进程,然后检查是否已经运行。如果担心存在同名的进程,还可以检查路径。

      枚举进程的代码我之前已经写过,在这里就不再重复了。

      PS:在Vista下使用EnumProcess时,要注意权限问题,OpenProcess增加了一个新的权限常数,仅限Vista。如果不增加这个参数,很多进程是无法被枚举出来的(不过MS不印象我们自己的进程- -#)。


      5.互斥对象

      使用互斥对象来防止程序重复运行是一个很常用的做法,而且M$也推荐使用这种方法。和上面的几种方法相比,需要写的代码少,而且效率比较高。所谓方便易用~

      一般我们会使用CreateMutex来创建互斥体,当第二次创建相同的互斥体时,这个API会返回前一个互斥体的Handle,而GetLastError则会返回ERROR_ALREADY_EXITS

    复制代码
    //  Mutex Object 
      
    //  Add this code in InistInstance function
      
      HANDLE hMutex 
    =  NULL;
      TCHAR 
    * lpszName  =   " TestMutex " ;

      hMutex 
    =  ::CreateMutex(NULL, FALSE, lpszName);
      DWORD dwRet 
    =  ::GetLastError();

      
    if  (hMutex)
      {
        
    if  (ERROR_ALREADY_EXISTS  ==  dwRet)
        {
          AfxMessageBox(
    " Has been running " );
          CloseHandle(hMutex);  
    //  should be closed
           return  FALSE;
        }
      }
      
    else
      {
        AfxMessageBox(
    " Create Mutex Error " );
      }

      
    //  Add this code in Destruction function
      
      ::CloseHandle(hMutex);
    复制代码

    使用互斥体时要注意几个问题:
      在CreateMutex之后马上GetLastError,GetLastError是一个很复杂的API,任何牵涉到GetLastError的操作在执行之后,都会覆盖先前的值。

      把正常的CloseHandle写到窗体的析构函数或者程序对象的析构函数里。不要在CreateMutex之后立刻CloseHandle,否则互斥对象会被清空。

    这也是我当初所犯的错误,(不知道网上那么多错误的代码是不是经过Debug的囧),当互斥对象的最后一个Handle被Close之后,互斥对象将被删除。如果程序在退出时没有清空互斥对象,Windows将会执行这一操作。当然,把次操作交给OS不是一个好习惯。

    详情请看MSDN的引用:

    引用
    Use the CloseHandle function to close the handle. The system closes the handle automatically when the process terminates. The mutex object is destroyed when its last handle has been closed.

     

     

    展开全文
  • 程序在不同地点只能运行一次。 防止程序重复执行。
  • QT之防止程序重复运行方法

    千次阅读 2016-02-02 10:12:27
    最近在做一个项目,添加了一个功能:防止一个程序能够重复启动。 包括Windows平台和Linux平台,其中Q_OS_WIN32宏用来表示编译运行的目标平台是windows,Q_OS_LINUX则标示目标为linux。 实现的思想是:对windows和...

    最近在做一个项目,添加了一个功能:防止一个程序能够重复启动。

    包括Windows平台和Linux平台,其中Q_OS_WIN32宏用来表示编译运行的目标平台是windows,Q_OS_LINUX则标示目标为linux。

    实现的思想是:对windows和linux分别采取了全局互斥变量和文件锁的方法。

    实现方法:

    #if defined Q_OS_WIN32   //for win
    #include <windows.h>
    bool checkOnly()
    {
        //  创建互斥量
        HANDLE m_hMutex  =  CreateMutex(NULL, FALSE,  L"fortest_abc123" );
        //  检查错误代码
        if  (GetLastError()  ==  ERROR_ALREADY_EXISTS)  {
          //  如果已有互斥量存在则释放句柄并复位互斥量
         CloseHandle(m_hMutex);
         m_hMutex  =  NULL;
          //  程序退出
          return  false;
        }
        else
            return true;
    }
    #endif
    #if defined  Q_OS_LINUX   //for linux
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    bool checkOnly()
    {
        const char filename[]  = "/tmp/lockfile";
        int fd = open (filename, O_WRONLY | O_CREAT , 0644);
        int flock = lockf(fd, F_TLOCK, 0 );
        if (fd == -1) {
                perror("open lockfile/n");
                return false;
        }
        //给文件加锁
        if (flock == -1) {
                perror("lock file error/n");
                return false;
        }
        //程序退出后,文件自动解锁
        return true;
    }
    #endif
    
    

    测试:

    int main(int argc, char *argv[])
    {
        QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));
        QTextCodec::setCodecForTr(QTextCodec::codecForName("GB18030"));
        Q_INIT_RESOURCE(wisdpsclient);
        QApplication app(argc, argv);
        //检查程序是否 已经启动过
        if(checkOnly()==false)
            return 0;
        Test dialog;
        dialog.show();
        return app.exec();
    }


    展开全文
  • IDEA重复运行同一程序

    千次阅读 2019-09-23 11:16:29
    打开运行配置: 勾选允许并行启动选项

    打开运行配置:
    uPMEKe.md.png

    勾选允许并行启动选项
    uPMVDH.md.png

    展开全文
  • 如何判断程序是否重复运行的几种方法 标签: linkerexe编译器dllnull 2008-09-27 00:09 2514人阅读 评论(1) 收藏 举报 分类: VC/MFC(9) 版权声明:本文为博主原创文章,未经博主...
  • Vb.Net防止同一程序重复运行的方法

    千次阅读 2007-11-27 22:08:00
    防止同一个程序多次运行。 *****************方法一:防止程序多次打开***************** 函数名: IsInstanceRunning 功 能: 判断工程是否已运行 参 数: 无 返回值: True 已运行 False 未运行 *****************...
  • Delphi中避免程序重复运行的方法

    千次阅读 2008-10-17 21:30:00
     showmessage('程序运行');  end. 2. 使用互斥对象  var  mymutex: THandle;  begin  mymutex:=CreateMutex(nil,True,'MyMutx');  if GetLastError<>ERROR_ALREADY_EXISTS then  begin  Application....
  • 禁止重复运行.ec

    2011-09-14 20:36:55
    易语言程序禁止重复运行禁止重复运行禁止重复运行
  • 在App::InitInstance()中加入CreateMutex(NULL,true,m_pszAppName); if(GetLastError() == ERROR_ALREADY_EXISTS) { AfxMessageBox(_T("应用程序不可以重复启动"),MB_OK | MB_APPLMODAL |MB_IC
  • 上文是在网上找的检测程序重复运行的类,但是感觉不是很好用,而且还使用了API,似乎完全没有必要,于是晚上自己写了一个函数,经过测试,在多用户下仍然可以检测到程序的多次运行。当然,如果程序改了名字还是可以...
  • VC++防止重复运行同一个程序

    千次阅读 2012-02-09 16:32:48
    在App::InitInstance()中加入 CreateMutex(NULL, true ,m_pszAppName); if (GetLastError() == ERROR_...AfxMessageBox(_T( "应用程序不可以重复启动" ),MB_OK | MB_APPLMODAL |MB_ICONSTOP); return ( false )
  • #include #include #include void func(int sin) { //printf("我是ctrl+c,... printf("只能运行一个应用程序\n"); exit(1); } printf("ctrl+c 退出\n"); signal(SIGINT,func); while(1); return 0; }
  • Delphi 让程序运行一次

    千次阅读 2008-12-31 14:31:00
    使用互斥对象让程序运行一次“怎么我的程序运行时不能重复打开?”经常在论坛上看到有朋友问这方面的问题。本文将比较详细的说明这一问题,并给出一个较为完善的解决方案。尽管这已经不是一个新问题了,但这里...
  • 我点击了两次,原来几乎在同时执行这个进程,我在程序中有线程时间睡眠2秒一次等待队列,打开进程果然两个MAIL.EXE进程,就想在执行前做一个判断阻止重复执行! //在写一些服务型的软件的时候,你可能不希望...
  • Python程序重复执行方法

    万次阅读 2019-08-01 10:44:15
    重复执行本.py文件中的内容 os.execvp(sys.executable, [sys.executable]+sys.argv) 或 python = sys.executable # 获取当前执行python os.execl(python, python, *sys.argv) # 执行命令 ####方法三: ...
  • 防止程序重复执行

    千次阅读 2017-08-29 09:32:27
    有的程序需要现在同一时间只能运行一个,这种需求可以用锁的方式来实现,在START-OF-SELECTION 事件后加锁,如果是加锁成功,说明还没有程序在执行,如果是加锁失败,则说明已经有同名程序运行,报错即可。...
  • The flag 'epoch' is defined twice. 解决办法,close project 关闭工程,new project 新建工程 ,Existing directory-&gt;Location(选择已经存在的工程文件夹)-&gt;Create 把工程重新打开一次 ...
  • 使用互斥对象让程序运行一次“怎么我的程序运行时不能重复打开?”经常在论坛上看到有朋友问这方面的问题。本文将比较详细的说明这一问题,并给出一个较为完善的解决方案。尽管这已经不是一个新问题了,但这里...
  • 所以今天就总结一下几种防止程序重复启动的方式: 1.使用QT中的QLockFile: QLockFile 使用文件提供在不同的进程间的锁。锁文件可以放置多个进程同时访问同一资源。例如磁盘上的配置文件、套接字、端口、共享内存...
  • ---让程序不能被多次运行 ---问题 (1)因为守护进程是长时间运行而不退出,因此./a.out执行一次就有一个进程,执行多次就有多个进程。 (2)这样并不是我们想要的。我们守护进程一般都是服务器,服务器程序只要运行一个...
  • linux下如何让程序无法重复启动

    千次阅读 2016-06-04 22:24:38
    通常情况下一个程序可以被多次执行,也就存在多个相同的进程。...经查找,可以使用flock的方式,建一个lock file,让程序执行前先检查是否有执行中的实例,即对文件加锁。single_program.c#include #include #include

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 847,181
精华内容 338,872
关键字:

怎么让程序重复运行