Vala 中的异步函数 - 收益和回调
Async Function in Vala - Yield & Callback
我正在开发一个用 Vala 和 GTK+ 编写的项目,我需要实现一个异步函数,因此我着手制作一个测试示例......由于某种原因我得到以下错误:
async.vala:31.3-31.20: error: Access to async callback
`asyncProc.callback' not allowed in this context 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
当您在回调中时,您可以作为名为 asyncProc.callback
的委托访问您自己的状态。当你退出那个函数时,除非你把它放在某个地方,否则你无法跟踪那个状态。请记住,Vala 中的委托是闭包:它们具有函数和状态信息。
如果您查看 examples,Generator
使用 feed
方法将值和状态存储在某处(在字段中),以便稍后可以重新-调用回调。它不是在调用 generate.callback
,而是在调用 callback
字段,它只是一个委托。
解决方法是:
首先我们声明一个回调全局变量如下:
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;
}
我正在开发一个用 Vala 和 GTK+ 编写的项目,我需要实现一个异步函数,因此我着手制作一个测试示例......由于某种原因我得到以下错误:
async.vala:31.3-31.20: error: Access to async callback `asyncProc.callback' not allowed in this context 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
当您在回调中时,您可以作为名为 asyncProc.callback
的委托访问您自己的状态。当你退出那个函数时,除非你把它放在某个地方,否则你无法跟踪那个状态。请记住,Vala 中的委托是闭包:它们具有函数和状态信息。
如果您查看 examples,Generator
使用 feed
方法将值和状态存储在某处(在字段中),以便稍后可以重新-调用回调。它不是在调用 generate.callback
,而是在调用 callback
字段,它只是一个委托。
解决方法是:
首先我们声明一个回调全局变量如下:
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;
}