【问题标题】:How to make NSWindow's toggleFullscreen behave synchronously (blocking)如何使 NSWindow 的 toggleFullscreen 同步运行(阻塞)
【发布时间】:2015-08-12 16:09:40
【问题描述】:

大多数 NSWindow 的东西都是阻塞的,除了 toggleFullScreen(以及其他一些)是异步的,更糟糕​​的是,它也可能失败。这一点,再加上在全屏窗口上调用 close() 是错误的 [1] 的事实,让我想在窗口上等待进入/退出全屏,然后再做任何其他事情(例如,我想等待窗口在调用 close()) 之前退出全屏。

有什么好的方法可以做到这一点(无需轮询计时器,这将是显而易见的答案)?

[1] 它不会退出全屏模式,让您盯着空的灰色屏幕,并且,如果您在第一个窗口关闭后创建另一个窗口,它将设置全屏标志 - 这表明了这样一个事实实际上是引擎盖下的全局标志。

【问题讨论】:

  • 为什么投反对票?

标签: objective-c macos cocoa


【解决方案1】:

虽然我不确定实际问题是什么,但我想我可以提供一些建议。

如果您想防止在全屏和窗口模式之间关闭窗口,您可以简单地检查 NSWindow 的委托方法。 NSWindowDelegate 提供了诸如-windowDidExitFullScreen:-windowWillExitFullScreen: 之类的方法,当窗口在状态之间切换时应该通知您。最后,您可以使用-windowShouldClose: 阻止关闭窗口。

【讨论】:

  • 我不想阻止关闭,我需要一种方法来等待直到窗口关闭,并且由于它可能处于全屏模式,这意味着一种方法等到窗口存在全屏。我已经在使用所有这些事件了。
  • 例如。 Windows API 让您可以在 ShowWindow() 与 ShowWindowAsync() 的同步和异步之间进行选择——我想模拟 toggleFullscreen() 的同步(即阻止,在操作完成之前不要从调用返回)版本。希望这更清楚。
  • 耶。看看我的答案 - 这可以让它像 Windows 一样“工作”
【解决方案2】:

怎么样:

  1. 开始进入全屏

  2. 完成后调用windowDidEnterFullScreen

现在你想等待。

1b。有一个保持状态的布尔值。 (_windowIsInFullscreen)。之前设置为 NO,在委托消息中设置为 YES

1c。等待:

 while(!_windowIsInFullscreen) {
                    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:.5]];
            NSLog(@"Polling...");
 }

这也是模态的工作方式(恕我直言,这很糟糕;)异步规则——但这是个人喜好)

【讨论】:

  • async 引入了竞争条件,即使在最微不足道的情况下(即,如果 bar() 异步测试由 foo() 更改的条件,则序列 foo(); bar() 变得不可预测。使 foo() 阻塞将解决这个问题。);无论如何,我的问题很具体——请不要对计时器进行投票。
  • 在这里看不到任何竞争条件,这就是模态东西的工作原理;)无论如何 - 祝你好运!
  • 只是为了清楚 - 异步!=不同的线程。使用不同的线程,这将是一个竞争条件,但我们这里只有 1 个线程
猜你喜欢
  • 2018-04-06
  • 2020-09-01
  • 2015-05-04
  • 2022-12-21
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
  • 2023-03-14
  • 2013-07-20
相关资源
最近更新 更多