V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
krytor
V2EX  ›  程序员

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

  •  
  •   krytor · 2015-02-01 23:43:31 +08:00 · 2196 次点击
    这是一个创建于 3582 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码不是执行流吗 像 android ios 浏览器 这些图形界面 还有 java console等待输入 这些时候程序都是在什么状态啊
    6 条回复    2015-02-03 08:12:51 +08:00
    billlee
        1
    billlee  
       2015-02-01 23:56:32 +08:00
    阻塞在事件循环中
    zgxltxz
        2
    zgxltxz  
       2015-02-02 08:04:02 +08:00 via Android
    主循环,MainLoop
    shutupATnight
        3
    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
        4
    shutupATnight  
       2015-02-02 20:32:34 +08:00
    我是不是写的太多了?
    krytor
        5
    krytor  
    OP
       2015-02-02 22:18:19 +08:00
    其实我想问的就是 “简单来说 Init 函数被调用后,操作系统不会再给你的程序分配时间片” 不给分配时间片,程序是怎么做到的那,程序不是执行流吗,如果程序等待的话 就是mainloop 谢了 各位 @billlee @zgxltxz @shutupATnight
    zgxltxz
        6
    zgxltxz  
       2015-02-03 08:12:51 +08:00 via Android
    程序运行,在底层除了快速按顺序执行CPU指令外,有两种方式触发事件,一个是轮询,一个是中断。 这个MainLoop就是不断轮询直到有新消息到达,去处理新消息后接着轮询。轮询是阻塞的,所以包含主循环的程序不会立刻退出,而是可以等待新事件。
    会分配时间片,不分配的话是特殊的程序。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1030 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:54 · PVG 06:54 · LAX 14:54 · JFK 17:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.