【问题标题】:Async Function in Vala - Yield & CallbackVala 中的异步函数 - Yield & Callback
【发布时间】:2015-06-12 18:01:26
【问题描述】:

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

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

代码如下:

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;
}

并使用以下命令编译:

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

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

【问题讨论】:

    标签: function asynchronous gtk vala


    【解决方案1】:

    解决办法是:

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

    public SourceFunc callback;
    

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

    callback = asyncProc.callback;
    

    最后,我们使用以下代码从主函数中进行异步回调:

    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;
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 非常感谢您的回答。这无助于我解决我试图做的事情。在示例中使用Yield 调用现有类的异步方法。我想要做的是回到切断我的异步函数流程的地方(使用 Yield )。但这帮助我调查了更多,但我仍然无法解决它!
      • 您需要创建一个对象来保存该状态,然后您的调用代码管理该对象的实例。您也可以将该状态放在全局某个地方,但这可能很难管理。
      猜你喜欢
      • 2019-01-06
      • 2016-09-29
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 2023-03-31
      相关资源
      最近更新 更多