• 12214阅读
  • 4回复

程序只运行一次,看了QSingleApplication,为什么需要那么复杂? [复制链接]

上一主题 下一主题
离线conta
 
只看楼主 倒序阅读 楼主  发表于: 2010-10-29
— 本帖被 XChinux 执行加亮操作(2010-10-29) —
各位大侠帮我看看,我自己写的下面那个singleApplication有问题吗?:
如果没有问题的话,网上流传的那个QSingleApplication为什么那么复杂,还要用到QShareMemory?

#include <QtGui>
#include <QLocalServer>
#include <QLocalSocket>

int main(int argc,char* argv[])
{
   QApplication app(argc,argv);

   QLocalSocket socket;
   socket.connectToServer("China");
   if(socket.waitForConnected(3000))
   {
       return 0;
   }

   QLocalServer server;
   server.listen("China");

   return app.exec();
}




**************************************************有界面版本**********************************************************
#include <QtGui>
#include <QLocalServer>
#include <QLocalSocket>

int main(int argc,char* argv[])
{
   QApplication app(argc,argv);


   QLocalSocket socket;
   socket.connectToServer("China");
   if(socket.waitForConnected(3000))
   {
       QMessageBox::StandardButton isSave;
       isSave = QMessageBox::warning(0, "Warning!", "\nThis program is runing...\n",QMessageBox::Ok);
       return 0;
   }


   QLocalServer server;
   server.listen("China");


   QWidget w;
   w.setWindowTitle("Dragon");
   w.setStyleSheet("background-color:red;");
   w.setGeometry(500,500,300,300);
   w.show();

   return app.exec();
}
[ 此帖被conta在2010-10-29 08:57重新编辑 ]
离线dbzhang800

只看该作者 1楼 发表于: 2010-10-29
1. 个人对多线程和多进程编程不了解,但据说是很难的东西,竞争、临界、同步、等等
2. Qt 官方的给的解决方案是     QtSingleApplication  QtSingleCoreApplication ,不清楚你提到的网上流传的是哪个
3. 有大牛用 QSharedMemory 实现过,但结论还是官方的方案的好     http://www.cuteqt.com/blog/?p=1813
4. 官方实现中:其实用了 QLocalServer,但不止是用了 QLocalServer  

如果你的实现够你用的,就不用太考虑别的。但是,编程就是这样:可能为了一点改进,复杂度会成倍增加
离线conta
只看该作者 2楼 发表于: 2010-10-29
引用第1楼dbzhang800于2010-10-29 09:31发表的  :
1. 个人对多线程和多进程编程不了解,但据说是很难的东西,竞争、临界、同步、等等
2. Qt 官方的给的解决方案是     QtSingleApplication  QtSingleCoreApplication ,不清楚你提到的网上流传的是哪个
3. 有大牛用 QSharedMemory 实现过,但结论还是官方的方案的好     http://www.cuteqt.com/blog/?p=1813
4. 官方实现中:其实用了 QLocalServer,但不止是用了 QLocalServer  
.......



直觉上,我的应该也是不完整的,也应该是有bug,只是现在我没有发现而已。

看看qt官方居然把这个分开了openSource和commercail,就知道,里面应该是很有技术含量的:

http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Utilities/qtsingleapplication/


离线dbzhang800

只看该作者 3楼 发表于: 2010-10-29
引用第2楼conta于2010-10-29 09:40发表的  :
直觉上,我的应该也是不完整的,也应该是有bug,只是现在我没有发现而已。
.......


有没有bug是看你需求的,比如你这个,很明显。在某种情况下:如果同时启动 10 个程序,而这10个程序执行你的 socket.connectToServer,尚未有一个 server 存在。10个程序都会运行。

再比如:在多用户系统上,不同的用户在同时启动你的程序等等。


至于你提到 openSource和commercail,只能说明你对Qt授权什么的还不了解
离线shegood1985
只看该作者 4楼 发表于: 2011-01-17
在网上看到过一个用共享内存的方法实现的,据说在unix下如果程序崩掉内存不释放会出问题,至于socket的做法没看到说有什么问题,顶下lz的钻研精神
快速回复
限100 字节
 
上一个 下一个