Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 递归使用的CFRunLoopRunInMode冻结主窗口_Macos_Runloop - Fatal编程技术网

Macos 递归使用的CFRunLoopRunInMode冻结主窗口

Macos 递归使用的CFRunLoopRunInMode冻结主窗口,macos,runloop,Macos,Runloop,对于一个有很多遗留代码的跨平台项目,my Cocoa应用程序只使用一个NSWindow和一个自定义NSView,该NSView捕获所有鼠标事件并绘制我的应用程序的所有图形细节 我需要实现本地模式行为,因此我在主线程中使用: CFRunLoopRunInMode(kCFRunLoopDefaultMode,0.01,false) 在区域设置循环中。函数按预期在0.01秒后返回,值为kcfrunlopruntimedout。但是,在这段时间内,自定义NSView不再接收鼠标事件,因此我的应用程序看起

对于一个有很多遗留代码的跨平台项目,my Cocoa应用程序只使用一个NSWindow和一个自定义NSView,该NSView捕获所有鼠标事件并绘制我的应用程序的所有图形细节

我需要实现本地模式行为,因此我在主线程中使用:

CFRunLoopRunInMode(kCFRunLoopDefaultMode,0.01,false)

在区域设置循环中。函数按预期在0.01秒后返回,值为kcfrunlopruntimedout。但是,在这段时间内,自定义NSView不再接收鼠标事件,因此我的应用程序看起来像是被冻结了(彩色鼠标光标不停地移动)

计时器事件仍会到达自定义NSView,但不会到达鼠标事件


Apple指定可以递归调用此函数。还有什么我应该做的,以便NSView仍然接收用户鼠标输入吗?

事件循环是建立在运行循环之上的,但不仅仅是这样。仅仅运行run循环不足以接收和处理事件

通过构建一个循环和
-sendEvent:
,您也许可以实现一些您想要实现的目标,但实际上您的目标并不明确。如果你解释一下,可能有更好的方法


例如,如果要显示模式对话框,应使用
-[NSApplication runModalForWindow:

在调用
CFRunLoopRunInMode
的行上放置一个断点。当到达断点时,复制堆栈跟踪。编辑您的问题并粘贴到堆栈跟踪中。谢谢Ken,只需在我的本地循环中使用以下两行代码,它就可以像预期的那样完美地工作:
event=[main window nexteventmachingmask:nsintegermax untldate:[NSDate datewithtimeintervalcessinew:0.010]inMode:NSDefaultRunLoopMode dequeue:YES];if(事件)[主窗口发送事件:事件]我在这个遗留代码中面临的主要问题(C++代码的300000行)是,有很多“模态”循环都包含在它们的函数中。这些函数中的大多数都是特定(但相当复杂)的处理程序,处理一个用户操作,从鼠标按下开始,处理鼠标移动的流程,并且只在鼠标向上事件时退出该函数。重构整个代码以分离对每个鼠标操作的处理将是一项非常大的工作,并且很可能会在代码中工作良好的部分引入bug,因为这些交互非常复杂。但是您的解决方案在这方面非常有效,非常感谢!不客气!如果这些循环用于鼠标跟踪,您应该阅读。例如,一个调整是使用
NSEventTrackingRunLoopMode
而不是
NSDefaultRunLoopMode
。为了安全起见,您可能需要在
event.window
上调用
-sendEvent:
,而不是
main window
。您可能还想指定一个真实的事件掩码。