【问题标题】:Main Thread Runloop gets blocked on opening nsmenu主线程 Runloop 在打开 nsmenu 时被阻塞
【发布时间】:2012-06-08 12:22:10
【问题描述】:

我有一个应用程序,它的 UI 元素包含一个 NSStatusItem 和一个菜单。在我的应用程序中,我使用NSTask 异步执行一些操作,并使用使用NSFileHandleReadCompletionNotification 获得的输出来更新菜单。但是现在每当我单击并打开菜单时,主运行循环进入NSEventTrackingRunLoopMode,并且通知发布失败。所以基本上在我的菜单打开的情况下,主线程上不会发生任何操作。现在我在this 帖子上发现了一个类似的问题,但那里接受的解决方案似乎没有帮助。我知道对于 NSNotificationCenter ,不得阻止 NSRunloopDefaultMode 。有没有办法改变这种行为???谁能帮忙???

【问题讨论】:

    标签: cocoa nsnotificationcenter nsmenu nsrunloop nsstatusitem


    【解决方案1】:

    我猜你有一个代表NSTaskstdoutNSFileHandle,而你已经向-readInBackgroundAndNotify 提出了请求。

    正如您所发现的,问题在于它仅在运行循环处于默认模式时发出通知。如果 runloop 进入另一种模式(例如打开菜单时),那么您的通知将在主 runloop 上排队并等待直到 runloop 重新进入默认模式。

    您想改用-readInBackgroundAndNotifyForModes: 方法,您可以将包含NSDefaultRunLoopModeNSEventTrackingRunLoopMode 的数组传递给该方法。这将向 runloop 指示您希望在 runloop 处于默认模式或事件跟踪模式时收到任何可用数据的通知。

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 1970-01-01
      • 2023-03-17
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      相关资源
      最近更新 更多