How can i prevent my app open multiple times with Qt?



  • I am using ubuntu and the way i check if another instance of my application is running is via a command called "pidof".
    I have heard about "QtSingleApplication":http://doc.qt.nokia.com/solutions/4/qtsingleapplication/qtsingleapplication.html but its kinda weird. Seeing "this topic":http://developer.qt.nokia.com/forums/viewthread/3387 ( the link is dead ) i can understand that QtSingleApplication was never a part of the Qt libs. Is there any full guide on how to use this function? From downloading-installing to implementing it at your app.

    P.S Should i stay with pidof or try the QtSingleApplication?
    Thanks for any answers :)



  • If you have a target platform for which you develop, looking for pid could be the answer you're looking for, but it's not really all that great either (if your app crashes, the pid stays but the app doesn't work). There are examples about single instances of an application, but they are all "hacks". There is not Qt functionality about that (at least not with the GPL license).

    Common cross platform solution is to run a tcp server on localhost and try to connect to it on start up. If you app can connect, it means another instance of your app is running. There are ways to communicate between the two copies as well. I cannot help you with link pointing to the right code atm.



  • Try QtSingleApplication - it's right way :)

    Link to repo: http://qt.gitorious.org/qt-solutions/qt-solutions



  • [quote author="Vass" date="1315747553"]Try QtSingleApplication - it's right way :)

    Link to repo: http://qt.gitorious.org/qt-solutions/qt-solutions[/quote]

    Can u tell me. From all the files that are in qtsingleapplication.pro project which one should i see?



  • Open INSTALL.TXT file, and read how you can build QtSingleApplication as Shared Library. after you would do it, you can use QtSingleApplication Library in you program. See examples in examples directory.



  • [quote author="Vass" date="1315761368"]Open INSTALL.TXT file, and read how you can build QtSingleApplication as Shared Library. after you would do it, you can use QtSingleApplication Library in you program. See examples in examples directory.[/quote]

    Can't install it.. It keeps saying the same message:
    !http://img690.imageshack.us/img690/4669/screenshotqtsingleappli.png(screen)!



  • Have you tried to run qmake and make commands? :)



  • yeah... qmake -> make -> ./configure
    just the same message...



  • Why do you run configure as last element? It should be executed first.



  • It is ./configure -> qmake -> make.



  • O was reading not configured, when it is now configured..
    So i quess now i completed the 3rd step of the install.txt. So after that what? The txt file is really messed up.

    I still have an error when including the QtSingleApplication.



  • Are you using the QtSingleApplication files directly or are you using them as a library?
    If so, did the library compile without any errors? If not, which?
    What errors do you have when including QtSingleApplication?



  • Ok so here is the complete outpout of ./configure -> qmake -> make ( http://paste.ubuntu.com/688207/ )
    After doing that i am including QtSingleApplication at my app and it says QtSingleApplication is not declared.



  • Build looks fine. Have you set up include path correctly? Have you even included the neccessary header files?



  • So you mean copying the qtsinglecoreapplication.h file at my project directory and then
    @#include "qtsingleapplication.h"
    @
    ?



  • The usual way is to add the path to the include path in your project file.
    @
    INCLUDEPATH += <location_of_qtsingleapplication_headers>
    @
    In addition, the QtSingleApplication libraries have to be added too.
    @
    LIBS += -L<location_of_qtsingleapplication_libraries>
    LIBS += -l<name_of_qtsingleapplication_library>
    @
    And - of course - you will have to include the headers in your sources files too.
    @
    #include <QtSingleApplication>
    @



  • So whats wrong with that:
    @INCLUDEPATH += <~/Downloads/qt-solutions-qt-solutions/qtsingleapplication/src>
    LIBS += -L<~/Downloads/qt-solutions-qt-solutions/qtsingleapplication/src>
    LIBS += -l<~/Downloads/qt-solutions-qt-solutions/qtsingleapplication/src/qtsinglecoreapplication.h>@
    ?



  • Remove < and > simbols



  • Forgot.
    @INCLUDEPATH += ~/Downloads/qt-solutions-qt-solutions/qtsingleapplication/src
    LIBS += -L~/Downloads/qt-solutions-qt-solutions/qtsingleapplication/src
    LIBS += -l~/Downloads/qt-solutions-qt-solutions/qtsingleapplication/src/qtsinglecoreapplication.h@

    But still i cant
    @#include <QtSingleApplication>@
    at my cpp file.

    P.S Should it have a spece between -l and ~ symbol.?



  • Try this

    @INCLUDEPATH += ~/Downloads/qt-solutions-qt-solutions/qtsingleapplication/src
    LIBS += -L~/Downloads/qt-solutions-qt-solutions/qtsingleapplication/src
    LIBS += -lqtsinglecoreapplication
    @



  • The same. I can only include the "qtsingleapplication.h".

    P.S I have reopened qt so as to refresh.



  • There are two ways on how to use QtSingleApplication:

    • You add the sources directly to your project or
    • You compile QtSingleApplication into a library and your application links against this library

    #1 requires you to add all of the QtSingleApplication sources to your application. The easiest way to do is including the qtsingleapplication.pri from the src directory.
    @
    // .pro
    include(../qtsingleapplication/src/qtsingleapplication.pri)
    @

    #2 requires you to build the library first
    @
    // shell
    ./configure -library
    qmake
    make
    @
    and then reference it in your project file
    @
    // .pro
    INCLUDEPATH += ../qtsingleapplication/src
    LIBS += -L../qtsingleapplication/lib
    LIBS += -lQtSolutions_SingleApplication-head
    @



  • How should it be with the first way?
    @include(~/Downloads/qt-solutions-qt-solutions/qtsingleapplication/src/qtsingleapplication.pri)
    @
    ?

    P.S All this sounds a bit complicated, and if someone wants to compile my app they must download qtsingleapplication librarie. Should i stay with the command pidof or QtSingleApplication will be better?



  • It is as complicated as integrating any other third party code or library. QtSingleApplications license allows you to redistribute it along with your code. So if you have set it up properly there is no extra work for "someone".

    I would go with QtSingleApplication. It is much less error-prone than the pidof approach.



  • I can't get it.
    So if you have set it up properly there is no extra work for “someone”.

    With both ways you must set the path to the qtsingleapplication library. How someone that doesnt have it won't need to do extra work?

    P.S You didn't answer yo my previous question. With:
    @include(~/Downloads/qt-solutions-qt-solutions/qtsingleapplication/src/qtsingleapplication.pri)@
    all still the same.

    Appreciate any help until now :)



  • Well, I do not consider adding a single line or three lines to a file extra work ;-)

    And if you redistribute the QtSingleApplication code along with your application, then no, there isn't even this "work" for someone because you have done all the "work" for them.

    I'm not quite sure if qmake correctly expands the ~. Use an absolute path or a path relative to your project instead. Take a look at the command line which is executed when make is run - are the include pathes correctly set there (-I <path>)?



  • i copied the src folder at my application folder and added
    @include(src/qtsingleapplication.pri)@
    to my .pro file.. Just the same. I think i will go with pidof..

    1. src folder is 50 kb ( my app's is 100kb so it's kinda big size )
    2. i just can't implement QtSingleApplication at my app whatever i do


  • Another simple way is to use QSharedMemory :

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

    // Unique Application
    QSharedMemory sharedMemory("{--KeyCode--}");
    if(!sharedMemory.create(sizeof(int)))
    {
        qDebug()<< "already running!" ;
        return 1;
    }
    else
    {
        new Start();
        return app.exec&#40;&#41;;
    }
    

    }@



  • [quote author="dmcr" date="1315982933"]Another simple way is to use QSharedMemory :

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

    // Unique Application
    QSharedMemory sharedMemory("{--KeyCode--}");
    if(!sharedMemory.create(sizeof(int)))
    {
        qDebug()<< "already running!" ;
        return 1;
    }
    else
    {
        new Start();
        return app.exec&#40;&#41;;
    }
    

    }@[/quote]

    This one works fine :D
    But why i can't get it focus at the window when the app is running?
    None of this works:

    MainWindow w;
    w.activateWindow();
    w.raise();
    w.setFocus();
    w.setVisible(1);@



  • Hehe, yes, this is a problem.

    I'm not 100% sure about the linux way, but on windows it is not possible to pull the focus from a different app. And you app does not have the focus. It is on the desktop or who ever opens the process. the new process would get the focus, but it emideatly terminates, so --> it does not work ;-(



  • Leon, I had troubles with that for some time as well. One of the features about QtSingleApplication was that I could communicate with the running copy and send (eventually) commands to it (with QTcpServer haven't really tested with shared memory as there was something in the documents I was looking at against using that). All that ended up that I could actually receive commands on windows only, but I could still detect the app is already running and stop the new instance. And yeah, as Gerolf said - you cannot take the focus of other application. Tried all kind of ways, as you did, the best you can do is to show a notification, make the taskbar entry "flashing" =/

    I guess you could always do that in some native linux way.



  • [quote author="Eus" date="1316069611"]Leon, I had troubles with that for some time as well. One of the features about QtSingleApplication was that I could communicate with the running copy and send (eventually) commands to it (with QTcpServer haven't really tested with shared memory as there was something in the documents I was looking at against using that). All that ended up that I could actually receive commands on windows only, but I could still detect the app is already running and stop the new instance. And yeah, as Gerolf said - you cannot take the focus of other application. Tried all kind of ways, as you did, the best you can do is to show a notification, make the taskbar entry "flashing" =/

    I guess you could always do that in some native linux way.[/quote]

    My friend's app is focusing, using pidof to test if the application is already running. I will post back when he tells me the way to do the focusing thing.



  • Hello,

    Sorry to answer late on this post, i didn't notice as it grows ;) !

    To make your application to have focus, you can communicate with the process that you made working ( with readyReadStandardOutput()....), then you can send kind of "events" to the app, and itself can then use activateWindow().

    This is not a simple way, but as your simple try does not work, i have used this one, and at least it works.

    altought the behaviour seems different on windows, it is still ok.

    democrie


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.