【问题标题】:How to avoid multi-threading problems (wxWidgets and Cplex) in C++?如何避免 C++ 中的多线程问题(wxWidgets 和 Cplex)?
【发布时间】:2013-04-16 01:41:28
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • 我一般不知道如何回答您的问题,但您可以通过 IntParam Threads 控制 CPLEX 使用的线程数。

标签: c++ multithreading wxwidgets cplex


【解决方案1】:

根据我的经验,规则是:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多