2013-04-16 53 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)