2017-02-27 4 views
0

Hey, j'ai écrit une application dans laquelle j'ai besoin de créer un thread pour effectuer des tâches en arrière-plan pendant le chargement de l'interface graphique. Cependant, peu importe que je ne je peux trouver un moyen de contourner cette erreur:Vala Threading: l'invocation de la méthode void n'est pas autorisée en tant qu'expression

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

La ligne en question est la création d'un nouveau thread qui appelle la méthode « devices_online ».

Le code complet qui est effectué est:

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

Et méthode est:

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

} 

Ive fait tellement googleing mais Vala est pas exactement la langue la plus populaire. De l'aide?

Répondre

2

Comme l'indique l'erreur du compilateur, vous obtenez un void en appelant une méthode. Ensuite, vous essayez de transmettre la valeur void dans le constructeur du thread.

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

Le deuxième argument de cunstructor Thread<T>.try() attend à une delagate de type ThreadFunc<T> que vous n'êtes pas satisfaisant.

Vous confondez un appel de méthode avec un délégué de méthode.

Vous pouvez passer une fonction anonyme pour résoudre ce problème:

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

Merci pour la réponse. J'ai essayé votre correctif et bien qu'il ait vomi quelques erreurs, j'ai pu contourner ces erreurs en procédant comme suit: Erreur: 'void 'n'est pas un argument de type générique pris en charge, utilisez?' à des types de valeur de boîte Correction: 'Thread thread = new Thread .try (" Conntections Thread. ",() => {devices_online (listmodel); return null;});' –