如何避免C ++中的多线程问题(wxWidgets和Cplex)?

时间:2013-04-16 01:41:29

标签: c++ multithreading wxwidgets cplex

我使用wxWidgets为GUI和IBM ILOG Cplex编写了一个C ++工具来解决优化问题。

在wx事件处理程序调用的一个函数中,我调用了IBM ILOG Cplex Optimizer,它本身就是多线程代码。

我意识到这会导致具有非感性内存内容的不确定性错误。

由于我没有编写多线程代码的经验,并希望在没有花费三周学习如何实现的情况下离开,我想知道:

是否有一些安全的,可能不优雅的方法可以避免问题? (或许比将文件写入光盘更优雅,通过操作系统调用不同的任务并重新读取输出。)

从wx线程启动Cplex线程是一个坏主意吗?

使用两个可能在内部使用不同库来实现多线程的库通常是一个坏主意吗? (我不知道除了pthreads之外还有什么,以及cplex或wx使用的内容)。

感谢任何帮助和背景信息。

1 个答案:

答案 0 :(得分:0)

根据我的经验,规则是:

  

每次更改显示的wxWdiget函数调用都必须在wxWidget线程中进行

我对Cplex知之甚少,但如果你说它是多线程的,你可能正在调用异步函数并在回调中处理结果。绝对不会使用wxWidget线程调用回调。如果您尝试在回调中显示结果,则表明您违反了上述规则。那时你会得到漂亮的小错误,在我的情况下通常会表现为堆损坏。

要解决此问题,您必须将回调结果传递给wxWidget线程并在该线程中显示它们。有很多方法可以做到,但全局机制是在wxWigdet上触发一个传递给wxWidget线程的自定义事件。

选中您需要使用的此链接http://wiki.wxwidgets.org/Custom_Events wxEvtHandler::AddPendingEvent(wxEvent& event)