2015-09-04 71 views
3

我正在使用c++測量軟件,它使用a 3rd party API作爲所有傳感器連接的接口。這個API不是開源的,沒有調試庫可用。凍結第三方庫中的應用程序

在某些情況下,當開始從接口讀取值時,軟件會凍結。雖然我無法確定哪些標準會導致問題,爲什麼它只是有時會發生,我想攔截凍結並實施一些錯誤處理,這也可以讓我更好地調試問題。

在我的代碼,我只是有一個電話

BOOL result = false; 
result = pciadioAIStartConversion(board_index, channel_nr, range); 

的地方,如果發生錯誤,pciadioAIStartConversion永遠不會返回。我正在尋找一些簡單的功能來保持軟件運行,並在通話時間很長時返回。

我使用Qt框架(4.8.6),所以一個可能的解決辦法是使用事件系統和QTimer,但因此,如果我沒有記錯的通話將需要它自己的線程和這似乎是矯枉過正我。

+2

我不認爲有什麼辦法可以實現超時,而不是產生一個單獨的線程。 – piezol

+0

您可以創建一個單獨的'QProcess'來完成第三方庫的調用,並使用'QLocalSocket'或'std :: cin/std :: cout'進行通信。如果你沒有得到迴應,你可以安全地殺死進程。它比終止線程更安全。 –

+0

如果您的外部軟件組件凍結,它可能仍然保留資源,即使它會被殺死。也許外部設備處於未定義狀態,只需重新啓動線程將無濟於事。根據我的經驗,依靠破碎的庫不是一個好主意。重啓軟件的解決方法聽起來很糟糕。 – Klaus

回答

1

piezol是正確的你需要一個單獨的線程,可以是一個相當混亂,但好消息是Qt線程框架(這稱爲QtConcurrent)真的很有幫助。

以下是在單獨的線程中運行標準函數以保持對其的控制的示例。

#include <QDebug> 
#include <QThread> 
#include <QString> 
#include <qtconcurrentrun.h> 
#include <QApplication> 

using namespace QtConcurrent; 

void hello(QString name) 
{ 
    qDebug() << "Hello" << name << "from" << QThread::currentThread(); 
} 

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 
    QFuture<void> f1 = run(hello, QString("Alice")); 
    QFuture<void> f2 = run(hello, QString("Bob")); 
    f1.waitForFinished();  
    f2.waitForFinished();  
} 
+0

這看起來很有前途,至今未使用併發模塊。但是我在'QFuture'的文檔中找不到'waitForFinished()'方法,我想知道我失明瞭嗎? – Bowdzone

+0

不,你是不是盲目的,我是,我從QProcess waitforFinshed,而不是QFuture的文件,看起來像你將不得不使用計時器 – Marco

+2

'QFutureWatcher'是你應該使用的。 'waitForXxx'方法阻止GUI。 –