Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QEventLoop: Cannot be used without QApplication Qt static



  • Hi all,
    I am building a SDK using Qt 5.7.0 static when I test it with an application I get the error in the title.
    The SDK depends on multiple libraries including SingalR client for c++ .
    I built the SDK and tester with Qt 5.7.0 dynamic and it ran without any error , it only appears when I build the SDK and depends static.

    Can anybody point me to what may cause this ?
    Thanks in advance.


  • Qt Champions 2017

    Which platform ? Can you show us where are you creating the Application objects ?Typcially your main.cpp code. It helps to help you.



  • @dheerendra
    The system is Ubuntu . I can't show all the code in my main but here is how it looks like :

     loggingFunction();
    
        QCoreApplication a(argc, argv);
    	
    	ChooseSDKFunction();
    
    	ConfigurationFunction();
    	RunSDKFunction(); //The error appears inside this function
    //
    //    QFuture<void> task = QtConcurrent::run([&] {
    //        ProgramExecutable();
    //    });
    
        std::future<void> future = std::async(std::launch::async,[&]{
            ProgramExecutable();
        });
    	int result = a.exec();
            return result;
    
    


  • Where's the event loop started in the code above? inside loggingFunction()?



  • @VRonin

    loggingFunction() doesn't have an event loop it is a simple two lines code to initialize the logger of the program.

    I put QCoreApplication first and it doesn't change the output of the program.



  • Do you have any global object? It's difficult to tell you what the problem is without code and without knowing how deep in the chain the snipped you posted is



  • @VRonin
    Yes I have a single global variable but used only in main function and ProgramExecutable() function and what i posted is the main function of the tester.
    I followed the source of the error inside SignalR client code to a call to get function for a webpage.



  • What puzzles me what the difference between the static build and dynamic that could cause this ?


  • Lifetime Qt Champion

    @Mohammedbie can you show the global variable? which type is it?


  • Qt Champions 2017

    There is not difference between the static and dynamic build. It could be the way you have written something. It could be the way you have defined the global variables somewhere. Some where you are creating some Qt objects globally without creating the QApplication object.


  • Qt Champions 2017

    I'm almost ready to bet that a QThread was created at global scope ... [1]

    [1] https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qeventloop.cpp.html#_ZN10QEventLoopC1EP7QObject



  • @aha_1980
    it is a custom made class which have all the SDK operation I can't show it it all but here how it looks like :

    class Program : public QObject
    {
    
        Q_OBJECT
    
    public:
        Program(QCoreApplication &app , int instance);
        void Operation1();
        void Operation2();
    	void Operation3();
    	void Operation4();
        void Operation5();
        void Operation6();
        CustomClass2* Operation7();
        void Operation8();
    
        CustomClass2* CustomInstance;
        CustomClass3* CustomInstance2;
        CustomClass4* CustomInstance3;
        CustomClass5* CustomInstance4;
        const char *pin = "1234";
    
    	static QHash<QString, QString> prop;
    
    private:
        QVector<QUuid> *OpenSessions = new QVector<QUuid>();
    	CustomClass4*a;
    	QSslCertificate * cert;
    	QSslKey * key;
    	QList<QSslCertificate> * importedCerts;
    	
    
    public slots:
        void Slot1(arg args);
    	void Slot2(arg *args);
    	void Slot3(arg  *args);
    	void Slot4(arg *args);
    	
    	void Slot5(arg * args);
    	void Slot6(arg * args);
    
        QUuid Slot7();
        int Slot8();
    	void Slot9();
    };
    

  • Qt Champions 2017

    It could be code something like this. Since you are not showing the code we can only guess & try to help you. E.g See the following code. Thread object is created in global scope. When you try start the thread, it will starts its event loop. Simillary I'm just trying to create the event loop object. When you QEventLoop object is created, QApp object should exist.

    QThread th;
    
    int main(int argc, char *argv[])
    {
        //th.start();
        QEventLoop loop;
        QApplication a(argc, argv);
        Widget w;
        w.show();
    
        return a.exec();
    }
    
    So you need to start looking at your code for such instances.
    


  • The same SDK ran on windows with no problem with Qt5.12.0 static.


  • Qt Champions 2017

    You never know if you have ifdef for windows. You need to identify the specific statement where this issue comes.



  • Yes on the windows we are using the native functions of the windows but it is used in Networking and logging only and the difference only in the includes and functions name.


  • Qt Champions 2017

    Since you say it is coming from RunSDK method, can you tell us which Qt classes you use inside this class. Where are you creating them ? Also you error is only following statement. Is that correct ?
    "QEventLoop: Cannot be used without QApplication"
    There is no "Qt Static" appended at the end.



  • @dheerendra

    There are many levels in this function as I call other functions in it, the first level of the function uses :
    QString qDebug() QFile QSslCertificate QSslKey QList QByteArray QUuid QLoggingCategory QHash

    and yes the message is without "Qt Static" I added it as it only happens with Qt static.



  • I sill can't understand what cause this in Qt static and not in Qt dynamic of the same version as the code in the two cases the same .


  • Qt Champions 2017

    I'm going back to basics. Can you create the simple Qt Project with your static Qt build & check if this works ? If this is not working we can see why it is so. Please note. By any chance

    1. By any chance QCoreApplication object what you are creating, is it getting destroyed ?
    2. Can you try handling destroyed.. signal like the follows in main.cpp
    QObject::connect(a,&QApplication::destroyed,[](){
            qDebug() << Q_FUNC_INFO << " I am dying " << endl;}
        );
    
    1. This error comes from only one source in Qt & it is QEventLoop. Issue can happen only if the QCoreApp instance is not created, created but destroyed.
    2. We have to just focus on the commenting out some code in RunSDK method & figure out.
    3. Since we don't have code, I'm proposing different possibilities to check the error.


  • @dheerendra
    That the first step I did after building Qt static I built a console application to test it and it ran with no problem then I ran SignalR tester to test SignalR and it ran without problems.
    I tried handling destroyed and "I am dying" never appeared as it should.
    I debugged the code in RunSDK method until the error appeared at a get function in SignalR code for getting a url.


  • Qt Champions 2017

    @Mohammedbie said in QEventLoop: Cannot be used without QApplication Qt static:

    SignalR code for getting a url.

    Do you mean that here you are using some QNework* classes to post the URL and get the response from webserver ?


  • Qt Champions 2017

    @Mohammedbie said in QEventLoop: Cannot be used without QApplication Qt static:

    I sill can't understand what cause this in Qt static and not in Qt dynamic of the same version as the code in the two cases the same .

    The source may be the same, the way the generated binary/ies are run is different. The most significant difference is with globals/statics initialization. So if you have such, check them first.
    Important: QCoreApplication must be the first QObject to be created and the last destroyed, which means you can't have global QObjects.

    That's the best I can give you without source code or a stack trace (e.g. running a debug build with QT_FATAL_WARNINGS=1), or any additional information; I'm not about to just guess semi-randomly.



  • @dheerendra
    Yes indeed and I tried opening the Last Get function in Qt creator but it didn't open so I couldn't trace at which line exactly in this function the error generated but I traced with "qDebug"s to it.



  • @kshegunov

    I will check for global QObject s and Will give a stack trace as soon as possible.



  • @kshegunov

    Stack trace :

    1  __GI_raise              raise.c          51   0x7f5666f8ce97 
    2  __GI_abort              abort.c          79   0x7f5666f8e801 
    3  qt_message_fatal        qlogging.cpp     1680 0x7f566839a31e 
    4  QMessageLogger::warning qlogging.cpp     560  0x7f566839596d 
    5  QEventLoop::QEventLoop  qeventloop.cpp   103  0x7f56685265cc 
    6  QThread::exec           qthread.cpp      506  0x7f56683a1e6d 
    7  QThread::run            qthread.cpp      574  0x7f56683a2068 
    8  QThreadPrivate::start   qthread_unix.cpp 344  0x7f56683aa1a1 
    9  start_thread            pthread_create.c 463  0x7f56673466db 
    10 clone                   clone.S          95   0x7f566706f88f
    
     The error message is generated in a get function for QNetworkAccessManager in SignalR.


  • I tried something new , I tried building the SDK as a static library and it ran with Qt 5.7.0 static with no error on linux what can cause this ?



  • Any thought ?



  • Hi, just guessing but the QCoreApplication a(argc, argv); call loads lots of stuff, like the Qt plugins, and if something fails your thread might start anyway, giving you that error because no healthy QCoreApplication is seen by the thread. Static builds depend on all the plugins are linked in properly, so it could be something missing for a static build (but the .so files are all present so your dynamic build runs fine).



  • @hskoglund
    Thanks for the reply. Will check the plugins built with Qt static and see if it built with success.


Log in to reply