2014-09-02 3 views
1

Я просто начать с Валом и ударила препятствиеКак запустить функцию в Vala асинхронно, когда нажата кнопка

Когда я пытаюсь запустить большую функцию на нажатие кнопки он блокирует все приложения вверх пока не будет завершено

Как бы вставить что-то вроде следующего в поток или дать ему асинхронный обратный вызов?

var btn = new Gtk.Button(); 

    btn.label = "Run something massive!"; 

    btn.clicked.connect (() => { 
     Process.spawn_command_line_sync("gksudo apt-get update", 
             out ls_stdout, 
             out ls_stderr, 
             out ls_status); 

     btn.set_sensitive (false); 
    }); 

ответ

3

В Gtk + есть только один поток, который обрабатывает события GUI. Если вы хотите сделать фоновый процесс, вы можете либо создать поток, либо разбить задачу и обработать ее в основном цикле. Я рекомендую последнее.

Для запуска процесса рассмотрите GLib.Process.spawn_async. Чтобы узнать, когда процесс завершится, вам нужно будет установить обработчик, используя ChildWatch.

Пример для ChildWatch скорее всего то, что вы хотите.

Смежные вопросы