2012-10-26 23 views
0

我從文件中讀取每一行。添加到菜單。想要執行這些命令。但是當我點擊時,得到空命令錯誤。創建組菜單並執行。 vala

的GLib-CRITICAL **:g_spawn_command_line_async:斷言`COMMAND_LINE = NULL」失敗

ImageMenuItem menuApp; 

void create_menuSystem() { 
    menuSystem = new Menu(); 
    var menuSep = new SeparatorMenuItem(); 
    //read ~/.config/traytool/app 
    var file = File.new_for_path(GLib.Environment.get_variable("HOME") + "/.config/traytool/app"); 
    if(file.query_exists()) { 
     try { 
      var dis = new DataInputStream(file.read()); 
      string line; 
      while((line = dis.read_line(null)) != null) { 
       menuApp = new ImageMenuItem.with_label(line); 
       menuApp.activate.connect(() => { 
        spawn_command_line_async(line); // <----- here 
        stdout.printf("..%s\n", line); 
       }); 
       menuSystem.append(menuApp); 
      } 
     } catch(Error e) { 
      error("%s", e.message); 
     } 
     menuSystem.append(menuSep); 
    } 
} 

回答

1

我創建了一個簡單的測試案例:

extern void foo(F c); 
delegate void F(); 
void main() { 
    string? line; 
    while ((line = stdin.read_line())!=null) { 
    foo(() => { stdout.puts(line);}); 
    } 
} 

而且line是僅供參考:

_data1_->line = _tmp1_; 
_tmp2_ = _data1_->line; 
if (!(_tmp2_ != NULL)) { 
    break; 
} 
foo (____lambda2__f, _data1_); 

要解決這個問題,封閉需要所有權,您不能這樣做,或者您需要保留這些值。您可以將它們放入Gee.ArrayList中,您可以使用閉包中的索引繼續引用它們。或者,您可以擴展ImageMenuItem以具有額外的字段/屬性。