gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:57:34 26 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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

最佳答案

根据我的经验,规则是:

every wxWdiget function call that change the display must be made in the wxWidget thread

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

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

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

关于c++ - 如何避免 C++ 中的多线程问题(wxWidgets 和 Cplex)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16027407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com