wxWidgets CallAfter пробуждение основного потока пользовательского интерфейса на macOS? - PullRequest
0 голосов
/ 04 марта 2020

Я получаю сообщения об ошибках «UI API, вызываемый из фонового потока» в мастере wxWidgets из GitHub под macOS.

UI API called from background thread Group
file:///DeveloperLibs/wxWidgets-3.1.3/src/osx/cocoa/evtloop.mm: runtime: UI API called from background thread: -[NSApplication postEvent:atStart:] must be used from main thread only

#0  0x00000001004e5908 in wxGUIEventLoop::WakeUp() at /DeveloperLibs/wxWidgets-3.1.3/src/osx/cocoa/evtloop.mm:390
#1  0x00000001004651fd in wxApp::WakeUpIdle() at /DeveloperLibs/wxWidgets-3.1.3/src/osx/carbon/app.cpp:439
#2  0x00000001001d0cf7 in wxWakeUpIdle() at /DeveloperLibs/wxWidgets-3.1.3/src/common/appbase.cpp:1108
#3  0x00000001003a6a03 in wxEvtHandler::QueueEvent(wxEvent*) at /DeveloperLibs/wxWidgets-3.1.3/src/common/event.cpp:1318
#4  0x000000010017a09c in void wxEvtHandler::CallAfter<myPanel::Finish()::$_1>(myPanel::Finish()::$_1 const&) at /DeveloperLibs/wxWidgets-3.1.3/include/wx/event.h:3668
#5  0x0000000100179fba in myPanel::Finish() at /Volumes/Macintosh HD04/Users/rich/Projects/thing/myPanel.cpp:88

.... строки ниже - это просто нить / _pthread_start, которые не имеют отношения.

Внутри myPanel::Finish() (которая вызывается потоком, когда он завершается), Я использую:

void myPanel::Finish()
{
  this->GetEventHandler()->CallAfter([this]()
  {
    stopButton->Disable();
    GoToResultsPanel();
  });
}

Проблема не в коде моей лямбды, а в самом вызове CallAfter, так как он вызывает wxWakeUpIdle(), который затем заканчивается на wxApp::WakeUpIdle(), который заканчивается на wxGUIEventLoop::WakeUp() , вызывая [NSApp postEvent:event atStart:FALSE];

Таким образом, мой фоновый поток пробуждает поток пользовательского интерфейса. Документация для wxEvtHandler::CallAfter гласит:

Обратите внимание, что безопасно использовать CallAfter () из других, не GUI потоков, но метод всегда будет вызываться в основном, GUI, контекст потока.

Кажется, это не так? Что я делаю не так?

РЕДАКТИРОВАТЬ: Кстати, это под macOS Catalina. Под macOS Sierra и с wxWidgets 3.1.3 я не получаю предупреждение о том же коде во время выполнения. Код evtl oop .mm идентичен, но не выдает предупреждений под этой старой macOS!

...