French est-ce que thread librarie peux m'etre utile dans mon cas

alan1968

Active Member
Licensed User
Longtime User
Bonjour !
Depuis le sdk 14 ,ma libraire pour des raison de stabilité m'a plus accès au réseau je dois faire mes requête dans un autre thread ,soit je dois tout recorder ma libraire ... je suis pas sortie de l'auberge :) ,ou alors je pensai utilisé le libraire "THREAD"

http://www.b4x.com/forum/additional-libraries-classes-official-updates/6775-threading-library.html

Actuellement sans trop entrer dans le détail je l'utilise comme cela

Sub global
Dim myplc as Wagoid
Dim host as string
Dim port as int
Dim id, as int
end sub

sub set_plc
host="myplc.dyndns.org"
port=502
id=1
myplc.ip(id,host,port) <--sous SDK 7 OK ,SDK 14 ERROR MAIN THREAD
end sub

quel serai la maniere pour faire cela dans un autre thread

Merci

Alain
 

Informatix

Expert
Licensed User
Longtime User
Bonjour !
Depuis le sdk 14 ,ma libraire pour des raison de stabilité m'a plus accès au réseau je dois faire mes requête dans un autre thread ,soit je dois tout recorder ma libraire ... je suis pas sortie de l'auberge :) ,ou alors je pensai utilisé le libraire "THREAD"

Je déconseille cette bibliothèque car elle n'utilise pas la boucle de messages de B4A (en cherchant dans les forums, on doit pouvoir retrouver le message d'Erel qui le confirme et où il dit qu'elle devrait être réécrite). Autre défaut: sa gestion des priorités est ... fantaisiste? (ce défaut n'est pas dû à son auteur mais aux routines d'Android auxquelles il fait appel). Il faut coder sa propre bibliothèque pour soumettre des runnables à la boucle de messages. Voici un exemple:
B4X:
Runnable r = new Runnable() {
   @Override
   public void run() {
      try {
         .... ton code .....
         .... suivi d'un raiseEvent pour renvoyer un resultat a ton programme
      }
      catch (Exception e) {
         throw new RuntimeException(e);
      }
   }
};
BA.submitRunnable(r, null, 0);
 

alan1968

Active Member
Licensed User
Longtime User
Merci pour ces précieux conseils ;)

Où trouves-tu ce type d'info ?
 
Last edited:

alan1968

Active Member
Licensed User
Longtime User
ah ok !

est ce que cette maniere peu fonctionné ?

B4X:
public static void Ip(int id_plc,String my_ip,int port) throws IOException   {
Thread t = new Thread(); //ajout
t.start(); // ajout
addr=InetAddress.getByName(my_ip);
con = new TCPMasterConnection(addr);
id=id_plc;
con.setPort(port);
}
 

Informatix

Expert
Licensed User
Longtime User
ah ok !

est ce que cette maniere peu fonctionné ?

B4X:
public static void Ip(int id_plc,String my_ip,int port) throws IOException   {
Thread t = new Thread(); //ajout
t.start(); // ajout
addr=InetAddress.getByName(my_ip);
con = new TCPMasterConnection(addr);
id=id_plc;
con.setPort(port);
}

Je ne saisis pas l'intérêt de faire ça alors que je t'ai montré un exemple de runnable pour interagir proprement avec B4A. Laisse tomber les threads, les asynctasks et autres, sauf si tu as un besoin vraiment spécifique. Si tu lis des blogs de développeurs (avancés) en Java, tu verras que l'utilisation d'un handler+looper est préférée à toutes les autres méthodes. C'est celle que préconise Cyril Mottier par exemple (auteur de GreenDroid, de Prixing et d'un bouquin sur le développement pour Android). Et c'est ce qu'on trouve dans B4A. Donc...
 

Informatix

Expert
Licensed User
Longtime User
Bien chef !
... et tu me feras 10 pompes ! Non mais ! :D

Je t'avoue que j'ai galéré quelques temps avec la bibliothèque Thread avant de découvrir la bonne méthode. Et maintenant que du bonheur ! Je fous de l'asynchrone partout ! Je distribue d'ailleurs gratuitement à tous mes clients une bibliothèque qui permet de le faire simplement.

Pour changer la priorité d'un processus:
B4X:
int myTID = android.os.Process.myTid();
android.os.Process.setThreadPriority(myTID, Priority);
 
Last edited:

alan1968

Active Member
Licensed User
Longtime User
Bonjour,est ce que tu pourrai m'expliquer avec ton exemple comment convertir une de mes fonction "clasique" en fonction asynchone car j'ai du mal a comprendre la maniere de faire cela
B4X:
Runnable r = new Runnable() {
@Override
public void run() {
try {
.... ton code .....
.... suivi d'un raiseEvent pour renvoyer un resultat a ton programme
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
};
BA.submitRunnable(r, null, 0);
par exemple avec cette petite fonction qui me converti un hexa et decimal
public class my_lib
{
...
public int HexadecimalToDecimal(String hex ){
String str= hex;
int i= Integer.parseInt(str,16);
return i;
}
..
}

merci d'avance pour ton aide

un sujet "générique" sur ce thème serai le bien venu je pense
 
Last edited:

Informatix

Expert
Licensed User
Longtime User
Tu mets le code que je t'ai donné dans une fonction, tu remplaces "... ton code ..." par ce que tu veux et tu appelles la fonction. Difficile de faire plus simple. Pour récupérer le résultat, il faut utiliser la fonction ba.raiseEvent.
 

alan1968

Active Member
Licensed User
Longtime User
ok
quelle est la syntaxe pour le ba.raiseevent dans mon cas ?
c'est la première fois que j'utilise cette fonction je ne la connais pas ,et dans les exemple sur le forum ,je ne pige pas ou l'on va chercher les paramètre a inclure entre les parenthèses

dons si j'ai bien compris c'est comme cela que je dois coder ma fonction

B4X:
public int HexadecimalToDecimal(String hex ){
Runnable r = new Runnable() {
@Override
public void run() {
try {
String str= hex;
int i= Integer.parseInt(str,16);
//.... suivi d'un raiseEvent pour renvoyer un resultat a ton programme
ba.raseevent(HexadecimalToDecimal.this, ????,?????,????);
return i; }
catch (Exception e) {
throw new RuntimeException(e);
}
}
};
BA.submitRunnable(r, null, 0);
}
 

Informatix

Expert
Licensed User
Longtime User
ok
quelle est la syntaxe pour le ba.raiseevent dans mon cas ?

Il manque "BA ba" comme premier paramètre de la fonction HexadecimalToDecimal (le paramètre est automatiquement passé par B4A, donc tu ne t'en soucies pas).
Pour raiseEvent, le tooltip dans Eclipse devrait te donner le nom et le type de chaque paramètre. Dans le premier param, tu peux mettre Null, dans le deuxième, tu mets le nom de la sub (en minuscules) qui doit récupérer les valeurs, et en dernier tu mets les valeurs à transmettre à ta sub (c'est un tableau d'objets donc à passer avec new Object[] {...}).
 
Top