Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Unsolved Program doesn't completely quit

    General and Desktop
    5
    25
    3431
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • JonB
      JonB @JKSH last edited by JonB

      @JKSH said in Program doesn't completely quit:

      Anyway, C++ Qt doesn't normally call exit(); we just let main() return naturally.

      My point is --- unless C++ start-up/shut-down is different from C in this respect which I doubt --- if you look at the C/C++ run-time code which calls your main() you will see that when that returns (return or just coming to the end of main()) into the runtime invoking code that code will call _exit(). Doesn't matter whether your code actually calls exit() or not, both ways end up calling _exit().

      1 Reply Last reply Reply Quote 0
      • JKSH
        JKSH Moderators @Crag_Hack last edited by

        @Crag_Hack said in Program doesn't completely quit:

        I only use signals and slots to communicate between the main GUI thread and worker thread, except for the stop function which uses an std::atomic_bool. Also all classes I use are reentrant except for QStrorageInfo but that's only used in the main thread. There might be others I'd have to look at the code but I was very careful to only use reentrant guys in the worker thread.

        In Windows 10 the two tabs are joined together in the processes tab in two separate lists. It doesn't show up in either.

        I see. I'm out of ideas at this point, sorry.

        All the best with your hunt!

        It might be worth subscribing to the Interest mailing list and asking there -- Qt engineers are active on that list, and they might have further insight into the internals of your app.

        @JonB said in Program doesn't completely quit:

        My point is --- unless C++ start-up/shut-down is different from C in this respect which I doubt --- if you look at the C/C++ run-time code which calls your main() you will see that when that returns (return or just coming to the end of main()) into the runtime invoking code that code will call _exit(). Doesn't matter whether your code actually calls exit() or not, both ways end up calling _exit().

        You're right, the C++ runtime behaves similarly to the C runtime.

        Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

        1 Reply Last reply Reply Quote 0
        • SGaist
          SGaist Lifetime Qt Champion last edited by

          Hi,

          What does your worker object do ?
          Are you sure it's stopping its work ?
          Any system call in it ?

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply Reply Quote 0
          • C
            Crag_Hack last edited by

            @SGaist said in Program doesn't completely quit:

            Hi,

            What does your worker object do ?

            File copy logic for file replicator based backup.

            Are you sure it's stopping its work ?

            I hadn't even run any backup job work when this error occurred.

            Any system call in it ?

            What do you mean by system call?

            Thanks.

            1 Reply Last reply Reply Quote 0
            • SGaist
              SGaist Lifetime Qt Champion last edited by

              By "System call" I meant native low level function.

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply Reply Quote 0
              • C
                Crag_Hack last edited by

                I've used a small spectrum of win API functions. Some requiring COM.

                1 Reply Last reply Reply Quote 0
                • SGaist
                  SGaist Lifetime Qt Champion last edited by

                  Did you check whether some of them needed to free some resource to properly stop ?

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  1 Reply Last reply Reply Quote 0
                  • C
                    Crag_Hack last edited by

                    I read the documentation thoroughly for all the functions. Weird thing is the intermittent nature of what's occurring and also that is happens after not having done any worker object work.

                    1 Reply Last reply Reply Quote 0
                    • kshegunov
                      kshegunov Moderators @Crag_Hack last edited by kshegunov

                      Get a stack trace from those processes that hang and post it here. (e.g. as described here)
                      That's the best you can do to trace it, at least that is if it doesn't already hang in the debugger ...

                      PS.
                      Show us (parts) of your Worker class, as I see trouble brewing here.

                      This:

                      worker->stop(); //sets boolean cancel to true to let worker finish its work
                      

                      and this

                      workerThread->quit();
                      

                      very rarely go hand in hand.

                      Read and abide by the Qt Code of Conduct

                      1 Reply Last reply Reply Quote 4
                      • C
                        Crag_Hack last edited by

                        Since JKSH said he's out of ideas I opened another thread over at MSDN. See here. We ran process explorer and it showed the process as suspended. Also when trying to kill in process explorer we get access denied. Here is the threads info (no stack trace available). Also the process is not ReplicatorNew.exe it's Buddha Backup x64.exe (I was hesitant to get my name out there but concluded it doesn't' really matter).

                        0_1532290551431_stacktrace.png

                        kshegunov 1 Reply Last reply Reply Quote 0
                        • C
                          Crag_Hack last edited by Crag_Hack

                          Here's the requested code with the previous code as well. Edited for brevity.

                          void ReplicatorMainScreen::closeEvent(QCloseEvent *event)
                          {
                              emit stopWork();
                              event->accept();
                          }
                          
                          void ReplicatorMainScreen::setupBackend(Replicator *rep)
                          {
                              connect(ui->backupSelectedButton,SIGNAL(clicked(bool)),rep,SLOT(selectedBackup()));
                              connect(this,SIGNAL(stopWork()),rep,SLOT(stopWork()));
                              connect(ui->cancelButton,SIGNAL(clicked(bool)),rep,SLOT(cancelBackup()));
                          }
                          
                          void Replicator::cancelBackup()
                          {
                              if (isBusy)
                                  worker->stop();
                          }
                          
                          void Replicator::stopWork()
                          {
                              quitting = true;
                              if (isBusy)
                                  worker->stop(); //sets boolean cancel to true to let worker finish its work
                          }
                          
                          void Worker::stop() { cancel = true; } // cancel is std::atomic_bool
                          
                          void Replicator::selectedBackup()
                          {
                              isBusy = true;
                              emit backup(jobList,simpleJobs);
                          }
                          
                          void Worker::backup(QList<BackupJob> passJobs, QList<BackupJob> passSimpleJobs)
                          {
                              jobs = passJobs;
                              simpleJobs = passSimpleJobs;
                              startJobScans(); //these check for cancel condition and abort if true
                              startJobBackups(); // this too
                              emit backupFinished(JobType::Normal, cancel, errorsFound);
                          }
                          
                          void Replicator::backupDone()
                          {
                              isBusy = false;
                          }
                          
                          Replicator::~Replicator()
                          {
                              workerThread->quit();
                              workerThread->wait();
                          }
                          
                          Replicator::Replicator(QWidget *parent) :
                              QWidget(parent)
                          {
                              workerThread = new QThread(this);
                              workerThread->start();
                              worker = new Worker;
                              worker->moveToThread(workerThread);
                              mainScreen = new ReplicatorMainScreen;
                              setupWorker();
                              mainScreen->setupBackend(this);
                          }
                          
                          void Replicator::setupWorker()
                          {
                              connect(this, SIGNAL(backup(QList<BackupJob>,QList<BackupJob>)), worker, SLOT(backup(QList<BackupJob>,QList<BackupJob>)));
                              connect(worker, SIGNAL(backupFinished(JobType,bool,bool)), this, SLOT(backupDone(JobType,bool,bool)));
                              connect(workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
                          }
                          
                          1 Reply Last reply Reply Quote 0
                          • kshegunov
                            kshegunov Moderators @Crag_Hack last edited by

                            @Crag_Hack said in Program doesn't completely quit:

                            Here is the threads info (no stack trace available).

                            Attach the debugger and do an interrupt after that (in the debug menu). Work with a debug build so you get unoptimized code and you can trace the stack.

                            Read and abide by the Qt Code of Conduct

                            1 Reply Last reply Reply Quote 0
                            • C
                              Crag_Hack last edited by

                              When attaching with Visual Studio I get "Unable to attach to the process. Catastrophic failure." When using Qt Creator I get:

                              0_1532293994392_qc.png

                              The process as it is hung now was run as an exe outside of both IDEs. Not sure if that's relevant.

                              kshegunov 1 Reply Last reply Reply Quote 0
                              • kshegunov
                                kshegunov Moderators @Crag_Hack last edited by

                                Did you stop all the antivirus programs? Antivirus software often interferes with debugging and some of it even run services on top of custom drivers that hook all over the OS in all kinds of nasty ways. Disable automatic antivirus, disable its services reboot and reproduce, then try to attach the debugger.

                                Read and abide by the Qt Code of Conduct

                                1 Reply Last reply Reply Quote 0
                                • C
                                  Crag_Hack last edited by

                                  Update - I ran the program ~196 times total, evenly distributed between running a backup and not running a backup and also between running the original exe, running with my copy protection wrapper, and running with the NSIS installer. It didn't exhibit the erratic behavior not even once. One detail though is I am using QtSingleApplication and also QtLockedFile. I also found this page which attributes similar behavior to buggy drivers not handling IO well. Are QtSingleApplication and QtLockedFile mature enough to be bug free? I show having used version 2.6 according to readme.txt in my local repository, which is the same version as on github according to readme.txt.

                                  Also @kshegunov the worker->stop() just sets the boolean cancel to true so the worker object in the worker thread can read the boolean and halt it's operations, return to the event loop, and in the case that workerThread->quit() is called the event loop picks up the event and quits. Should be safe right?

                                  JKSH 1 Reply Last reply Reply Quote 0
                                  • JKSH
                                    JKSH Moderators @Crag_Hack last edited by

                                    @Crag_Hack said in Program doesn't completely quit:

                                    Are QtSingleApplication and QtLockedFile mature enough to be bug free? I show having used version 2.6 according to readme.txt in my local repository, which is the same version as on github according to readme.txt.

                                    I don't know about their maturity, but those classes have not been maintained for many years.

                                    Qt 5 has a new class called QLockFile (http://doc.qt.io/qt-5/qlockfile.html ) -- its API is not a drop-in replacement for QtLockFile, however. There is no modern equivalent for QtSingleApplication.

                                    Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                                    1 Reply Last reply Reply Quote 1
                                    • First post
                                      Last post