2015-06-12 36 views
1

我正在開發一個用Vala和GTK +編寫的項目,我需要實現一個異步函數,因此我着手做一個測試的例子......並且出於某種原因,我出現以下錯誤:Vala中的異步函數 - Yield&Callback

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

回答

0

解決的辦法是:

首先聲明一個回調全局變量如下:

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

當您處於回調中時,您可以作爲名爲asyncProc.callback的代表訪問您自己的狀態。當您退出該功能時,除非將其放在某處,否則無法跟蹤該狀態。請記住,Vala中的代表是閉包:它們具有函數和狀態信息。

如果你看一下examples,在Generator使用feed方法來存儲值和狀態的地方(在字段),這樣以後,它可以重新調用回調函數。它沒有調用generate.callback,它調用callback字段,它只是一個代表。

+0

非常感謝你的回答。這並不能幫助我解決我嘗試做的事情。在示例中,使用「Yield」來調用現有類的異步方法。而我想要做的是回到我的異步函數的流程(用「Yield」)。但是這幫助我調查了一下,但我仍然無法解決它! – lozanotux

+0

您需要創建一個對象來保存該狀態,然後調用代碼管理該對象的實例。你也可以把這個狀態放在全球某個地方,但這可能很難管理。 – apmasell