Vala中的异步函数 - Yield&打回来

时间:2015-06-12 18:01:26

标签: function asynchronous gtk vala

我正在开发一个用Vala和GTK +编写的项目,我需要实现一个异步函数,因此我开始做一个测试的例子......由于某种原因我得到以下错误:

  

async.vala:31.3-31.20:错误:访问异步回调   在此上下文中不允许使用`asyncProc.callback'asyncProc.callback   ();

代码如下:

valac --pkg gtk+-3.0 --pkg gio-2.0 async.vala

并使用以下命令编译:

DOCUMENT_ROOT/.htaccess

任何人都有任何想法,因为它可能发生? 我正在开发的项目如下:https://launchpad.net/gcleaner

2 个答案:

答案 0 :(得分:1)

解决方案是:

首先我们声明一个回调全局变量,如下所示:

public SourceFunc callback;

然后,在异步函数asyncProc中添加以下行:

callback = asyncProc.callback;

最后,我们使用以下行从main函数进行异步回调:

callback ();

为了说明解决方案,请在完整代码下面填写:

using Gtk;

public SourceFunc callback;

public async void asyncProc ()
{
    callback = asyncProc.callback;

    stdout.printf ("STEEP -- 1 --\n");

    yield;//Return to Main after the *1

    stdout.printf ("STEEP -- 2 --\n");
}

public static int main (string[] args)
{
    Gtk.init (ref args);

    var win = new Window ();
    win.set_title ("Async Functions Test");
    win.set_default_size (512,100);
    win.set_border_width (12);

    win.destroy.connect (Gtk.main_quit);

    var boton = new Button.with_label ("  Print in Terminal  ");

    boton.clicked.connect (()=> { 
        asyncProc.begin ();

        //--> Return of YIELD

        stdout.printf ("STEEP -- B --\n");
        callback ();//--> Return just after the last executed yield (... *1)
    });

    win.add (boton);
    win.show_all ();

    Gtk.main ();
    return 0;
}

答案 1 :(得分:0)

当您在回调中时,您可以作为名为asyncProc.callback的委托访问您自己的州。当您退出该功能时,除非将其放在某处,否则无法跟踪该状态。请记住,Vala中的委托是闭包:它们具有功能和状态信息。

如果查看examplesGenerator使用feed方法将值存储在某处(在字段中),以便以后可以重新调用回调。它没有调用generate.callback,而是调用callback字段,这只是一个代表。