首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vala中的异步函数&产率和回调

Vala中的异步函数&产率和回调
EN

Stack Overflow用户
提问于 2015-06-12 18:01:26
回答 2查看 1.6K关注 0票数 3

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

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

守则如下:

代码语言:javascript
复制
using Gtk;

public async void asyncProc ()
{
    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  ");

    //public delegate void AsyncReadyCallback (Object? source_object, AsyncResult res) callback_finalizacion;

    boton.clicked.connect (()=> { 
        asyncProc.begin ();
        //--> Return of YIELD
        stdout.printf ("STEEP -- B --\n");
        asyncProc.callback ();
    });

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

    Gtk.main ();
    return 0;
}

并使用以下命令进行编译:

代码语言:javascript
复制
valac --pkg gtk+-3.0 --pkg gio-2.0 async.vala

有人知道因为它会发生吗?我正在开发的项目如下:https://launchpad.net/gcleaner

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-23 17:00:16

解决办法是:

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

代码语言:javascript
复制
public SourceFunc callback;

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

代码语言:javascript
复制
callback = asyncProc.callback;

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

代码语言:javascript
复制
callback ();

为了说明解决方案,下面是完整的代码:

代码语言:javascript
复制
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;
}
票数 2
EN

Stack Overflow用户

发布于 2015-06-12 20:16:24

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

如果您查看示例Generator将使用feed方法在某个地方(在字段中)存储值和状态,以便以后可以重新调用回调。它不是调用generate.callback,而是调用callback字段,它只是一个委托。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30809483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档