0

我从文件中读取每一行。添加到菜单。想要执行那些命令。但是当我单击时,出现空命令错误。

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 回答