请教个问题像 图形界面等待事件时 程序是什么状态

2015-02-01 23:43:31 +08:00
 krytor
代码不是执行流吗 像 android ios 浏览器 这些图形界面 还有 java console等待输入 这些时候程序都是在什么状态啊
2070 次点击
所在节点    程序员
6 条回复
billlee
2015-02-01 23:56:32 +08:00
阻塞在事件循环中
zgxltxz
2015-02-02 08:04:02 +08:00
主循环,MainLoop
shutupATnight
2015-02-02 20:32:15 +08:00
我理解的2种:

第一种:

:死循环开始
键盘有输入么?
有:do_something()
回到循环开始

在这时候你的程序是死锁状态(根据操作系统的不同,会出现是你的程序完全使用CPU资源 or 会有部分 CPU 时间片被分配到其它任务上)

第二种:

我的程序.Init开始()
call 操作系统.IO处理.如果有键盘输入时怎么办( 请调用下面的 on_keyboard_event )
我的程序.Init结束

我的程序.on_keyboard_event开始()
do_something()
我的程序.on_keyboard_event结束

简单来说 Init 函数被调用后,操作系统不会再给你的程序分配时间片。直到有键盘输入了,操作系统会调用 on_keyboard_event 函数通知你。你的程序没有被挂起,只是操作系统没有分配 CPU 去执行你的程序了。

当然实际情况会更复杂,因为可能你的图形界面上有需要定时刷新的东西,背后需要接受网络消息,你有一个一直在死循环的线程等。
shutupATnight
2015-02-02 20:32:34 +08:00
我是不是写的太多了?
krytor
2015-02-02 22:18:19 +08:00
其实我想问的就是 “简单来说 Init 函数被调用后,操作系统不会再给你的程序分配时间片” 不给分配时间片,程序是怎么做到的那,程序不是执行流吗,如果程序等待的话 就是mainloop 谢了 各位 @billlee @zgxltxz @shutupATnight
zgxltxz
2015-02-03 08:12:51 +08:00
程序运行,在底层除了快速按顺序执行CPU指令外,有两种方式触发事件,一个是轮询,一个是中断。 这个MainLoop就是不断轮询直到有新消息到达,去处理新消息后接着轮询。轮询是阻塞的,所以包含主循环的程序不会立刻退出,而是可以等待新事件。
会分配时间片,不分配的话是特殊的程序。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/167422

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX