2013-04-16 52 views
2

我用C++編寫了一個工具,使用GUI和IBM ILOG Cplex的wxWidgets來解決優化問題。如何避免C++中的多線程問題(wxWidgets和Cplex)?

在由wx事件處理程序調用的其中一個函數中,我調用了本身是多線程代碼的IBM ILOG Cplex Optimizer。

我意識到這會導致非感性內存內容的不確定性錯誤。

因爲我在編寫多線程代碼中沒有的遭遇,想矇混過關,而不度過三週,他學習如何做到這一點,我想知道:

是否有一些安全的,可能是不雅觀的方式在這裏避免問題? (比起寫一個文件到光盤,通過操作系統調用一個不同的任務,並將輸出讀回來更優雅,也許。

從wx線程啓動Cplex線程是不是一個好主意?

使用兩個庫可能在內部使用不同的庫來實現多線程通常是一個壞主意嗎? (我不知道除了pthread和cplex或wx使用的是什麼之外)。

任何幫助和背景信息表示讚賞。

+0

我不知道如何回答你的問題一般,但你可以控制CPLEX通過IntParam線程使用的線程數。 – raoulcousins

回答

0

根據我的經驗,規則是:

每wxWdiget函數調用更改顯示必須在wxWidget線程進行

我不很瞭解的Cplex,但如果你說它是多線程的,你可能會調用異步函數,並在回調中處理結果。回調絕對不是用wxWidget線程調用的。如果您嘗試在回調中顯示結果,則違反上述規則。那時你會得到很好的小錯誤,這在我的情況下通常會成爲堆損壞。

要解決這個問題,您必須將回調的結果傳遞給wxWidget線程並在該線程中顯示它們。有很多方法可以做到,但全局機制是在wxWigdet上觸發一個自定義事件,並將其傳遞給wxWidget線程。

檢查此鏈接,http://wiki.wxwidgets.org/Custom_Events你需要使用 wxEvtHandler::AddPendingEvent(wxEvent& event)