2017-06-17 127 views
0

對於很多遺留代碼跨平臺的項目,我的可可應用程序只使用一個NSWindow與捕獲所有的鼠標事件,並提請我所有的應用程序圖形細節自定義的NSView。CFRunLoopRunInMode凍結主窗口

我需要實現本地模式的行爲,所以我用的主線程中:

CFRunLoopRunInMode(kCFRunLoopDefaultMode,0.01%,FALSE);

在語言環境中。如預期的那樣,函數在0.01秒後返回,其值爲kCFRunLoopRunTimedOut。然而,鼠標事件在那段時間內不再被自定義的NSView接收,所以我的應用程序看起來像被凍結了(顏色鼠標光標四處移動)。

定時器事件仍然到達自定義的NSView,而不是鼠標事件。

蘋果指定該功能可以遞歸調用。還有什麼我應該這樣做,NSView仍然收到用戶鼠標輸入?

+0

在調用'CFRunLoopRunInMode'的行上放置一個斷點。當命中斷點時,複製堆棧跟蹤。編輯您的問題並粘貼到堆棧跟蹤中。 –

回答

1

事件循環是建立在一個運行循環的頂部,但它不止於此。僅僅運行運行循環不足以接收和處理事件。

你可以通過圍繞-[NSWindow nextEventMatchingMask:untilDate:inMode:dequeue:]-sendEvent:建立一個循環來實現你想要做的一些事情,但是真的不清楚你的目標是什麼。如果你解釋一下,可能有更好的方法。

例如,如果你想提出一個模態對話框,你應該使用-[NSApplication runModalForWindow:]

+0

感謝肯,它確實工作完美,只需在我的本地循環內使用以下兩行: – Dominique

+0

'event = [mainWindow nextEventMatchingMask:NSUIntegerMax untilDate:[NSDate dateWithTimeIntervalSinceNow:0.010] inMode:NSDefaultRunLoopMode dequeue:YES]; (事件) [mainWindow sendEvent:event];' – Dominique

+0

我在這個遺留代碼(300,000行C++代碼)中面臨的主要問題是,它們的函數中包含大量「模態」循環。大多數這些功能都是特定的(但非常複雜的)一個用戶操作的處理程序,從鼠標開始,處理鼠標移動的流程,並且只在鼠標移動事件中退出功能。重構整個代碼以分離每個鼠標動作的處理將是一件非常大的工作,並且很可能會在運行良好的代碼的一部分中引入錯誤,因爲這些交互非常複雜。 – Dominique