Vala线程:不允许调用void方法作为表达式

时间:2017-02-27 15:35:04

标签: multithreading gtk vala elementary

嘿,我一直在编写一个应用程序,我需要在加载GUI时创建线程来执行后台任务。但无论如何,我都可以找到解决此错误的方法:

error: invocation of void method not allowed as expression
            Thread<void> thread = new Thread<void>.try("Conntections Thread.", devices_online(listmodel));

有问题的行是创建一个调用“devices_online”方法的新线程。

正在实施的完整代码是:

try {

            Thread<void> thread = new Thread<void>.try("Conntections Thread.", devices_online(listmodel));

        }catch(Error thread_error){

            //console print thread error message
            stdout.printf("%s", thread_error.message);
        }   

方法是:

private void devices_online(Gtk.ListStore listmodel){
    //clear the listview
    listmodel.clear();

    //list of devices returned after connection check
    string[] devices = list_devices();


    //loop through the devices getting the data and adding the device
    //to the listview GUI
    foreach (var device in devices) {    

        string name = get_data("name", device);
        string ping = get_data("ping", device);


        listmodel.append (out iter);
        listmodel.set (iter, 0, name, 1, device, 2, ping);
    }

}

我做了很多Google,但Vala并不是最受欢迎的语言。有什么帮助吗?

1 个答案:

答案 0 :(得分:3)

就像编译器错误所说的那样,通过调用方法可以获得空白。然后,您尝试将void值传递给线程构造函数。

Thread<void> thread = new Thread<void>
    .try ("Conntections Thread.", devices_online (listmodel));

Thread<T>.try ()的第二个cunstructor参数需要一个类型为ThreadFunc<T>的delagate,你不满意。

您将方法调用与方法委托混淆。

您可以传递一个匿名函数来修复它:

Thread<void> thread = new Thread<void>
    .try ("Conntections Thread.", () => { devices_online (listmodel); });