• 13075阅读
  • 11回复

如何让QT程序只运行一次 [复制链接]

上一主题 下一主题
离线cresthong
 

只看楼主 倒序阅读 楼主  发表于: 2008-11-17
— 本帖被 XChinux 执行加亮操作(2008-11-30) —
就是不能同时运行两个相同的程序,请问怎么实现?
离线fanzhichao

只看该作者 1楼 发表于: 2008-11-17
最好的解决方法:
设计模式:单例模式
离线duduqq

只看该作者 2楼 发表于: 2008-11-17
QtSingleApplication,但这个类只有在商业版才有,你可以上网去找找这个类的源代码,有人公布出来了
离线cresthong

只看该作者 3楼 发表于: 2008-11-17
用Linux环境下的特定方法,怎样实现
离线wvins
只看该作者 4楼 发表于: 2008-11-17
通常的做法是
启动程序的时候尝试建立一个系统全局对象

同样,通常是Mutex
如果这个对象已经存在,则会创建失败,则退出程序。
-------------
QMutex虽然不是系统相关的,但我相信他是全局的,可以试试

...
貌似还需要继续找找。

-------------
QSystemSemaphore可以实现这个功能。
[ 此贴被wvins在2008-11-17 20:27重新编辑 ]
离线marslee_suc
只看该作者 5楼 发表于: 2008-11-17
如果你是在kde下开发的可以使用kde的库
kuniqueappliction
离线wvins
只看该作者 6楼 发表于: 2008-11-17
...
QSystemSemaphore和我想像的有差距,没办法只好把QSharedMemory用上了,
以下代码在Ubuntu下测试通过:

#include <QApplication>
#include <QSystemSemaphore>
#include <QSharedMemory>
#include <QLabel>
#include <QtDebug>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QSystemSemaphore sema("JAMKey",1,QSystemSemaphore::Open);
    sema.acquire();//在临界区操作共享内存  SharedMemory
    QSharedMemory mem("SystemObject");//全局对象名
    if (!mem.create(1))//如果全局对象以存在则退出
    {   
        qDebug()<<mem.errorString();
        sema.release();//如果是Unix系统,会自动释放。
        return 0;
    }
    sema.release();//临界区

    QLabel label("Demo");
    label.show();
    return app.exec();//释放栈上的mem对象。
}
离线cresthong

只看该作者 7楼 发表于: 2008-11-17
谢谢楼上
离线vrcats
只看该作者 8楼 发表于: 2008-11-18
如果只是Linux就没那么复杂,在/tmp创建一个独占文件,如果有实例在运行,创建会失败。
离线lazybone
只看该作者 9楼 发表于: 2008-11-18
文件锁 或 端口锁定
离线duduqq

只看该作者 10楼 发表于: 2008-11-18
找QtSingleApplication的源码吧,最方便的了。
离线many_many
只看该作者 11楼 发表于: 2010-06-03
QSystemSemaphore是不能达到这个效果的

因为QSystemSemaphore结合QSharedMemory一起用,
是让你的qt程序 “能且只能” 运行一次,
而不是,
让程序同一时间之出现一个。

用那个,
会让你的程序以后都不能运行。
除非修改对应的参数

继续关注!
联系方式:
lishenzhi123@163.com
QQ:904421718
快速回复
限100 字节
 
上一个 下一个