многопоточность — как избежать многопоточности (wxWidgets и Cplex) в C ++?

Я написал инструмент на C ++, используя wxWidgets для GUI и IBM ILOG Cplex для решения проблемы оптимизации.

В одной из функций, вызываемых обработчиком событий wx, я вызываю IBM ILOG Cplex Optimizer, который сам по себе является многопоточным кодом.

Я понимаю, что это приводит к недобросовестным ошибкам с бессмысленным содержимым памяти.

Поскольку я не имею опыта написания многопоточного кода и хотел бы уйти, не потратив трех недель на изучение того, как это сделать, я хотел бы знать:

Есть ли здесь какой-то безопасный, возможно, не элегантный способ избежать проблем? (Возможно, более элегантно, чем запись файла на диск, вызов другой задачи через ОС и чтение результата обратно).

Это плохая идея для запуска потоков Cplex из потока WX?

Является ли вообще плохой идеей использовать две библиотеки, которые могут использовать разные библиотеки для реализации многопоточности? (Я понятия не имею, что там есть, кроме pthreads и что используется cplex или wx).

Любая помощь и справочная информация приветствуется.

2

Решение

Исходя из моего опыта, правило таково:

каждый вызов функции wxWdiget, который изменяет отображение, должен выполняться в потоке wxWidget

Я не знаю много о Cplex, но если вы скажете, что он многопоточный, скорее всего, вы вызываете асинхронную функцию и обрабатываете результаты в обратном вызове. Обратный вызов, безусловно, не вызывается в потоке wxWidget. Если вы затем попытаетесь отобразить результаты в обратном вызове, вы нарушите указанное выше правило. Вот тогда вы получите хорошие маленькие ошибки, которые в моем случае обычно материализуются как куча коррупции.

Чтобы это исправить, вы должны передать результаты вашего обратного вызова в поток wxWidget и отобразить их в этом потоке. Есть много способов сделать это, но глобальный механизм состоит в том, чтобы вызывать пользовательское событие в wxWigdet, которое передается потоку wxWidget.

Проверьте эту ссылку, http://wiki.wxwidgets.org/Custom_Events вам нужно использовать
wxEvtHandler::AddPendingEvent(wxEvent& event)

0

Другие решения

Других решений пока нет …