0

ファイルから各行を読み取ります。メニューに追加。それらのコマンドを実行したい。しかし、クリックするとnullコマンドエラーが発生しました。

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

1 に答える 1

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て追加のフィールド/プロパティを持たせることもできます。

于 2012-10-26T14:20:16.970 に答える