在阅读关于多线程的苹果文档时,他们谈论了很多关于Run Loops的内容。创建Run Loop有什么意义?这是多次重用用户线程吗?在哪种示例性情况下,Run Loop是一个好主意?
此Run Loop如何与线程相关?让我们以iPhone OS应用程序的主要运行循环为例。当用户触摸屏幕时,它会触发事件。运行循环是否重用主线程以便使用某些代码处理事件?或者每次发生事件时运行循环都会创建一个新线程吗?
答案 0 :(得分:7)
如果您希望自己的应用在基于事件的现代用户界面上运行,那么运行循环是一个好主意。即,自DOS以来的任何事情。
从Cocoa到.NET到REALbasic的所有桌面操作系统运行时都可以免费为您提供主要的运行循环。运行循环四处转动,检查事件并将它们传送到需要的位置。没有它,您将无法获得鼠标,键盘或其他系统事件。当主运行循环终止时,您的应用程序也将自动终止。
通常,您不需要对主运行循环执行任何操作,也不需要创建新的循环。在Cocoa中显示模态面板有时会在内部为面板创建一个运行循环,具体取决于行为。这会停止主运行循环,因此只有面板才能获取事件。
iPhone或Cocoa应用程序中的主线程运行主运行循环,所有事件都在主线程上传递。您创建的任何额外线程都没有自己的运行循环,除非您自己创建一个。
答案 1 :(得分:3)
运行循环是使应用程序保持运行的主要构造。
应用程序循环运行循环管理事件,定时器等等,直到应用程序退出。
运行循环在概念上是一个无限循环:
while( !quit ) { // Handle events // Listen for input // Manage timers // ... }
除非您创建aditional线程,否则不需要显式创建运行循环对象。一个线程可以拥有它自己的运行循环,它可以独立地管理它自己的事件,定时器和处理输入。
想象一下您的应用程序与慢速远程服务通信。可以设置线程来处理与远程服务的通信。线程运行循环将负责读取数据,因为它可以从远程服务获得,并且可能在从远程服务完全读取数据之前将数据传递到上游之前对其进行处理。
查看devworld上的Apple文档。
答案 2 :(得分:1)
我对Runloops也非常困惑。它们更像是事件队列或通知中心,而不是任何与循环相关的事物。因为它们被称为循环,所以我倾向于考虑循环中的线程或线程。有一个线程执行添加到运行循环的工作,并且与实际循环不同。就像iKenndac所说,如果你想为任何比DOS更先进的现代UI编写代码,你需要理解这个概念。从Swing到SWT到J2ME再到Blackberry再到iPhone都包含了这个概念。他们的名字不同。这是令人困惑的事情。您可以创建新的RunLoops并向其添加内容。添加的东西将很高兴闲置,从未实际运行,因为你必须创建实际的线程来抽取RunLoop。我会在这里闭嘴,因为我还在学习CocoaTouch和SDK,我不想进一步混淆。