Как сделать метод wxWidget, который можно использовать в качестве обратного вызова в библиотеке C?

0

У меня есть общая библиотека C, которая считывает данные из COM-порта в отдельном потоке. И приложение C++ wxWidget, которое ожидает данные из lib и отображает его в пользовательском интерфейсе. Мне нужно сделать функцию обратного вызова, которую lib вызовет, когда соберет правильный пакет данных. Я создал статический var в классе фреймов wxWidget, который содержит указатель на объект этого класса и статический метод, указатель на который я передаю библиотеке в качестве обратного вызова. Это функция обратного вызова, но по этой причине я не могу изменить интерфейс. Программа разбилась с сигналом SIGABRT. Как я вижу, это плохой способ изменить пользовательский интерфейс wxWidgets из не основного потока. Но я не знаю, как это сделать другому. Вы можете мне помочь? Спасибо.

Теги:
callback
pthreads
wxwidgets

1 ответ

1
Лучший ответ

Да, вы можете использовать только функции GUI wxWidgets из одного (обычно называемого "основным", но он не должен быть фактическим основным потоком приложения, только тот, из которого был инициализирован wxWidgets). Единственное, что вы можете сделать из другого потока безопасно, - это отправить событие в поток GUI, попросив его выполнить что-то в этом wxQueueEvent(), см. wxQueueEvent().

Поскольку wxWidgets 3.0 есть удобная оболочка, использующая тот же основной механизм, называемый CallAfter(). Особенно, если вы используете С++ 11, он очень прост в использовании, поскольку вы можете просто передать ему код, который будет выполняться в основном потоке напрямую, например

void MyThreadCallback(void* data)
{
    wxTheApp->CallAfter([=]() {
        wxMessageBox("This is safe because we're in the main thread now");
        // Do whatever you need to do with "data"
    });
}
  • 0
    Большое спасибо. Отлично работает с событиями.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню