2

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

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

我意识到这会导致带有无意义的内存内容的不确定性错误。

由于我没有编写多线程代码的经验,并且想在不花三周时间学习如何做的情况下离开,我想知道:

是否有一些安全的,可能不优雅的方法来避免这里的问题?(也许比将文件写入磁盘、通过操作系统调用不同的任务并将输出读回更优雅)。

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

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

任何帮助和背景信息表示赞赏。

4

1 回答 1

0

根据我的经验,规则是:

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

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

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

检查此链接,http://wiki.wxwidgets.org/Custom_Events您需要使用 wxEvtHandler::AddPendingEvent(wxEvent& event)

于 2013-04-30T07:37:48.053 回答