zoukankan      html  css  js  c++  java
  • 在Windows上只运行一个实例?

    在windows开发中,我们被教导,一个实例的方式可以通过内核对象的句柄来实现,如果系统已经存在了该内核对象句柄,则以后就不应该再次被创建,通常使用的方式是这样的:

    m_hMutex = CreateMutex( NULL, TRUE, _T("OneInstance") );
    if ( m_hMutex != INVALID_HANDLE_VALUE )
    {
    // 第二次创建
    if ( GetLastError() == ERROR_ALREADY_EXISTS )
    {
    // do your things

    }

    }

    是的,我们这么做,也没有发现过问题,那还能有什么问题嘛!?

    有的,那就是实例可能创建多个!!!!!so,如何才能够创建多个实例呢?

    我写了一段python的代码用来进行测试:

    #! /usr/bin/env python
    #
    coding=utf-8

    import os
    import time
    import subprocess

    image_folder
    ='TestImage'

    images_ext
    = ['.jpg', ".bmp", ".tiff", ".png", ".gif", ".jpeg"]

    for file in os.listdir( image_folder ):
    name, ext
    = os.path.splitext(file)
    if ext.lower() notin images_ext:
    continue
    cmd
    ='oneinstance.exe %s\\%s'%(image_folder, file)
    subprocess.Popen( cmd )

    没错,利用管道的形式,打开进程,进程是被我们打开了,然后开始执行代码,由于我们重复执行,这个时候,在执行到CreateMutex的时候,也许另一个进程也在执行CreateMutex,不晓得windows的内核是否存在这方面的问题?

    是的,系统会存在问题的,因为如果我们快速打开多个进程的时候,一个进程执行到CreateMutex的时候,另一个进程可能也执行到了CreateMutex,甚至在内核处理的时候,都存在CPU切换的问题,这个问题与多线程的问题是同样的道理,只是环境放到了操作系统,而线程变成了进程。

    于是,我们会看到,存在多个窗口被打开。是否可以考虑,内核中存在同一个名称的Mutex,还是存在多个名称的Mutex?

  • 相关阅读:
    [题解]POJ_1417_(并查集背包
    [题解]POJ_2912_(带权并查集
    [题解]luogu_P1502_窗口的星星(扫描线
    [题解/模板]POJ_1733_Pairty game(带权并查集/扩展域
    [题解/模板]悬线法luogu_P1169_棋盘制作(悬线法
    [题解]luogu_P2059_卡牌游戏(状态设计/概率dp
    [题解]luogu_P2467_地精部落(思维dp
    「CJOJ2439」军队
    「LG2397」yyy loves Maths VI (mode)
    「LG2114」起床困难综合症
  • 原文地址:https://www.cnblogs.com/ubunoon/p/2076638.html
Copyright © 2011-2022 走看看