最近更新: 2011-05-24

GJS/GnomeShell - timeout

GJS/GnomeShell 的運行環境,基本上是以事件為基礎。而它的事件處理迴圈,則是由 mainloop 負責。 mainloop 除了主要事件來源外,還提供了兩種可添加的事件來源,即 timeout 事件與 idle 事件。 本文為這些功能的使用範例。

const GLib = imports.gi.GLib;
var Mainloop = imports.mainloop;
//if (Mainloop == null)

//    Mainloop = imports.seed.mainloop; // a simulate one. 


var event_source1_id = Mainloop.timeout_add(500, function(){
    print("repeat...");
    
    // if return true, it will run again.

    return true;
});

var event_source2_id = Mainloop.timeout_add(500, function(){
    print("run only once...");
    
    // if return false, it will be remove from mainloop.

    return false;
});

var idle_count = 0;
var idle_source_id = Mainloop.idle_add(function() {
        print("idle..." + idle_count);
        idle_count++;
        if (idle_count > 10)
            return false; // remove this source.

        return true;
    },
    GLib.PRIORITY_DEFAULT_IDLE);

Mainloop.timeout_add_seconds(2, function(){
    if (event_source1_id > 0) {
        print("stop repeat");
        Mainloop.source_remove(event_source1_id);
        print("after 2 seconds, this will quit");
        event_source1_id = 0;
    }
    else {
        print("quit");
        Mainloop.quit('');
    }
    return true;
});

Mainloop.run('');

樂多舊網址: http://blog.roodo.com/rocksaying/archives/15700221.html