2014-02-25 60 views
1

我有一個多線程的Qt/C++應用程序,它在前臺工作得很好,但是當它不能正常關閉時會出現問題。該過程仍然活躍,但掛在等待看到的 - 看到等待程序的回溯:分叉(背景)Qt應用程序將無法正常退出

(gdb) bt 
#0 0x000000372460b575 in [email protected]@GLIBC_2.3.2() from /lib64/libpthread.so.0 
#1 0x00007f8990fb454b in QWaitCondition::wait(QMutex*, unsigned long)() 
    from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5 
#2 0x00007f8990fb3b3e in QThread::wait(unsigned long)() from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5 
#3 0x00007f8990fb0402 in QThreadPoolPrivate::reset()() from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5 
#4 0x00007f8990fb0561 in QThreadPool::waitForDone(int)() from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5 
#5 0x00007f89911a4261 in QMetaObject::activate(QObject*, int, int, void**)() 
    from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5 
#6 0x00007f89911a4d5f in QObject::destroyed(QObject*)() from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5 
#7 0x00007f89911aa3ee in QObject::~QObject()() from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5 
#8 0x0000000000409d8b in main (argc=1, argv=0x7fffba44c8f8) at ../../src/main.cpp:27 
(gdb) 

我現在意識到,我的代碼首先創建一個線程,然後叉,如果這一問題。前臺進程正常退出(確認PID已消失),但後臺pid永遠不會結束。這可能與我在父項中創建我的QThread的事實有關嗎?如果是這樣,我該如何讓這個等待線程死亡?

如果不是,有沒有特別的方法可以退出已被守護進程的控制檯應用程序? (Qt中)

回答

0

Qt是沒有經過測試與fork()進行互操作,所以不要期望它可以支持。這是不可移動的,並且在大多數情況下是不必要的。

你應該使用超脫QProcess,然後迅速退出產卵自己。如果您需要在衍生過程中進行初始化,您可以將相關數據傳遞給孩子。

My other answer說明了這種技術的基本知識,並可以移植到Qt所運行在所有的平臺上。在這種情況下,您將使用QProcess::startDetached在其自己的會話中啓動子進程,以像守護進程一樣工作。

你也可能想看看QtService解決方案。它可以在Unix和Windows之間移植,前者使用守護進程,後者則使用本地服務API。

+0

我還沒有意識到這一點!你能指出一個關於不使用fork的鏈接,還有一個關於如何實現與QProcess相同的鏈接? (我也會檢查諾基亞文檔)謝謝 – TSG

+1

這是一個相關的問題:http://stackoverflow.com/questions/21514446/get-pid-of-process-after-fork-in-qt – phyatt

+0

@Michelle「鏈接「只是一個Qt源代碼。 'fork'不在測試用例的任何位置(perl測試執行程序代碼之外)。它沒有經過測試,因此期待它的可靠工作幾乎沒有問題。 –