2011-11-21 16 views
1

如果我有一個類FunctionsClass,它繼承QObject並且其中的QTcpServerQTcpClient作爲成員變量。在我的主UI類我成立了一個名爲FunctionClassThreadQthreadFunctionsClass成員變量做:在分離線程上刪除我的qt類後,ASSERT失敗

FunctionsClass *classObj = new FunctionsClass // (classObj is a class member) 
classObj->moveToThread(&FunctionClassThread); 
FunctionClassThread.start(); 

// connected some signal/slots.. 
// do some stuff... 

然後我做解構包含我的FunctionsClass實例的對象:只

FunctionClassThread.quit(); 
FunctionClassThread.wait(); 
delete classObj; // problem line........... 

此錯誤當classObj'sQTcpServer當前正在偵聽或其QTcpSocket正試圖連接到服務器,並刪除classObj時發生。錯誤是:在QCoreApplication ::的SendEvent ASSERT失敗:?「無法發送事件由不同的線程擁有的對象 任何想法

回答

2

的情況下移動classObj到另一個線程後,可以不再允許您在創建它的線程刪除它。你要麼必須在您FunctionsClassThread或刪除通過在FunctionsClassThread內處理的代碼將其移回主線程。

閱讀moveToThread() Qt的文檔:

此功能只能「推」從當前線程的對象 另一個線程,它不能從任何任意線程 「拉」的對象到當前的線。

所以之前你FunctionsClassThread即將停止,它必須調用

classObj->moveToThread(QApplication::thread()); 

當然你FunctionsClassThread需要注意的對象,無論是直接或通過信號&插槽

0

一個的QObject具有線程關聯,只喜歡被從線程操縱它。在已創建。使用QMetaObject::invokeMethod調用方法在另一個線程

+0

我不會將父項傳遞給FunctionsClass,因此如何知道它是在主UI線程中創建的? – TheFuzz