我有一個在Linux平臺上用C,C++/Qt編寫的商業應用程序。該應用程序收集來自不同傳感器的數據並將其顯示在GUI上。每個用於連接傳感器的協議都是使用單例模式和Qt QThreads類的線程實現的。除一個以外的所有協議都正常工作。每個協議的線程運行函數具有以下結構:作爲單例實現的線程
void <ProtocolClassName>::run()
{
while(!mStop) //check whether screen is closed or not
{
mutex.lock()
while(!waitcondition.wait(&mutex,5))
{
if(mStop)
return;
}
//Code for receiving and processing incoming data
mutex.unlock();
} //end while
}
GUI的層次結構。
1.登錄畫面。 2.行動屏幕。
當用戶從登錄屏幕登錄時,我們進入操作屏幕,顯示所有數據並啓動不同傳感器的所有線程。它們在空閒時間等待mStop變量,當數據到達時,它們跳轉到接收和處理數據。問題協議的傳入數據是117個字節。在主GUI線程有計時器,當超時使用
<ProtocolName>::instance() function
檢查單例類如果其真正的更新變量搶協議的運行實例,並顯示該數據。數據顯示完成後,它們將單例類中的更新變量重置爲false。有問題的協議具有1秒的更新時間,這也是協議的幀速率。當我註釋掉顯示功能時,它運行良好。但是當顯示被激活時,應用程序在6-7小時後一直掛起。我曾在很多論壇上提過這個問題,但沒有收到任何有價值的建議。我希望在這裏我會得到一些幫助。另外,我閱讀了很多有關Singleton,多線程的文獻,並發現人們總是不鼓勵使用單例,特別是在C++中。但在我的應用程序中,我可以不考慮其他設計的實現。
在此先感謝
一個不幸的程序員
你需要澄清:是什麼在單獨的線程中實現?線程在哪裏生活?在GUI上?在傳感器上?在中央服務器上?誰訪問線程?這些線程是否在訪問它們的同一個應用程序上運行? – jrharshath 2009-06-22 05:19:22
這是一個單一的應用程序。每個傳感器都有一個連接它的協議和一個幀速率。因此,每個協議都是以單例線程的形式實現的。當用戶通過認證並進入操作屏幕時,線程開始。每個協議線程都是主GUI THREAD類的成員。根據幀速率,我們在GUI線程中設置了一個等價的定時器,當GUI THREAD超時時抓取協議實例並根據協議類的更新變量顯示數據。在更新GUI上的數據後,將此變量重置爲false。這個更新變量是eachprotoc的成員 – rocknroll 2009-06-22 05:25:31