Macos Cocoa事件循环在跟踪菜单时阻塞

Macos Cocoa事件循环在跟踪菜单时阻塞,macos,cocoa,macos-carbon,core-foundation,Macos,Cocoa,Macos Carbon,Core Foundation,我维护了一个遗留OSX应用程序,该应用程序不调用NSApplicationMain()来处理事件,而是在主线程上运行一个事件循环,如下所示: ... do { event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:distantPast inMode: NSDefaultRunLoopMode dequeue:YES]; [self handle

我维护了一个遗留OSX应用程序,该应用程序不调用NSApplicationMain()来处理事件,而是在主线程上运行一个事件循环,如下所示:

...
do {

        event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:distantPast
                        inMode: NSDefaultRunLoopMode dequeue:YES];
        [self handleEvent:event];
        }
    } while(event != nil);
...
在我激活应用程序菜单之前,一切正常。菜单激活后,NextEventMachingMask将永远阻塞。我可以在lldb中看到osx启动了另一个模式事件循环(carbon?),导致cococa的循环阻塞:

frame #2: 0x00007fff92748eb4 CoreFoundation`__CFRunLoopServiceMachPort + 212
frame #3: 0x00007fff9274837b CoreFoundation`__CFRunLoopRun + 1371
frame #4: 0x00007fff92747bd8 CoreFoundation`CFRunLoopRunSpecific + 296
frame #5: 0x00007fff8c11c56f HIToolbox`RunCurrentEventLoopInMode + 235
frame #6: 0x00007fff8c11c2ea HIToolbox`ReceiveNextEventCommon + 431
frame #7: 0x00007fff8c17568a HIToolbox`AcquireNextEventInMode + 54
frame #8: 0x00007fff8c172e2b HIToolbox`IsUserStillTracking(MenuSelectData*, unsigned char*) + 173
frame #9: 0x00007fff8c172a41 HIToolbox`TrackMenuCommon(MenuSelectData&, unsigned char*) + 1661
frame #10: 0x00007fff8c1803c1 HIToolbox`MenuSelectCore(MenuData*, Point, double, unsigned int, OpaqueMenuRef**, unsigned short*) + 510
frame #11: 0x00007fff8c1800fe HIToolbox`_HandleMenuSelection2 + 446
frame #12: 0x00007fff8a9a8de0 AppKit`_NSHandleCarbonMenuEvent + 277
frame #13: 0x00007fff8a8dfd0d AppKit`_DPSNextEvent + 1828
frame #14: 0x00007fff8a8def68 AppKit`-[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 346
我能做些什么来防止这种行为?
不幸的是,我无法重写应用程序,因此我需要一个快速而肮脏的解决方案,以便在菜单处于活动状态时运行主线程。

您是否能够将其移动到较新的型号,或者从新创建的Cocoa应用程序中获取代码?在进行菜单跟踪时,您预计会发生什么情况?什么事件会返回给您?您将如何处理该事件以允许用户使用菜单?理想情况下,我希望NextEventMachingMask也将carbon菜单事件出列,并将它们发回指定的处理程序,这样cocoa和carbon都会很高兴这就是它所做的。它无法返回Carbon菜单事件,因为它返回一个
NSEvent
,而这些事件不能用
NSEvent
表示。我明白,所以我的下一个问题是,是否可以像我对cocoa事件进行投票一样,对Carbon事件进行投票?