gpt4 book ai didi

nsview - NSMenu 动画阻塞主线程

转载 作者:行者123 更新时间:2023-12-04 12:59:18 26 4
gpt4 key购买 nike

我有:

  • NSStatusItem 带有自定义 View (在辅助线程中滚动文本),辅助线程更新内部状态并使用 setNeedsDisplay 通知主线程。
  • 在 mouseDown 上,会弹出一个 NSMenu。
  • 但是,如果选择了 NSMenu 中的任何 NSMenuItem,或者如果检测到第二个 mouseDown 并且 NSMenu 消失,滚动文本动画就会断断续续。

  • 似乎 NSMenu 默认 View 在执行动画时阻止了主线程。我已经通过将辅助线程输出 time_since_last_loop 与 View 的 drawRect: 进行了测试(这是主线程),并且只有 drawRect 显示了口吃。自定义 View 的 drawRect 从 ~30 fps 下降到 5 几帧。

    有什么方法可以让 NSMenu 动画非阻塞,或者与自定义 View 的 drawRect 并发?

    最佳答案

    我使用 NSTimer 和 NSEventTrackingRunLoopMode 来解决类似的问题。

    在您的主线程中,创建一个计时器:

        updateTimer = [[NSTimer scheduledTimerWithTimeInterval:kSecondsPerFrame target:self selector:@selector(update:) userInfo:nil repeats:YES] retain];

    // kpk important: this allows UI to draw while dragging the mouse.
    // Adding NSModalPanelRunLoopMode is too risky.
    [[NSRunLoop mainRunLoop] addTimer:updateTimer forMode:NSEventTrackingRunLoopMode];

    然后在您的更新:例程中,检查 NSEventTrackingRunLoopMode:
       // only allow status updates and drawing (NO show data changes) if App is in
    // a Modal loop, such as NSEventTrackingRunLoopMode
    NSString *runLoopMode = [[NSRunLoop currentRunLoop] currentMode];
    if ( runLoopMode == NSEventTrackingRunLoopMode )
    {
    ... do periodic update tasks that are safe to do while
    ... in this mode
    ... I *think* NSMenu is just a window
    for ( NSWindow *win in [NSApp windows] )
    {
    [win displayIfNeeded];
    }

    return;
    }

    // do all other updates
    ...

    关于nsview - NSMenu 动画阻塞主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12696466/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com