PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → ExécuteThreadPrincipal en Java
ExécuteThreadPrincipal en Java
Iniciado por Jean, 04,nov. 2017 11:14 - 4 respuestas
Miembro registrado
10 mensajes
Publicado el 04,noviembre 2017 - 11:14
Bonjour à tous,

J'ai une application qui cible deux plateformes (Windows 64 et Java). Dans cette application, j'ai un traitement relativement long qui freeze l'interface s'il n'est pas exécuté dans un thread secondaire.

La procédure qui s'exécute dans ce thread secondaire doit accéder aux éléments de l'interface pour actualiser certains contrôles et remplir une table. Lorsque je cible Windows, je peux utiliser la fonction ExécuteThreadPrincipal pour effectuer ces mise à jour d'interface en utilisant le le thread principal.

En Java, la fonction ExécuteThreadPrincipal n'est pas disponible et je suis donc obligé de lancer mon traitement secondaire dans le thread principal puisque ensuite je n'ai pas la possibilité de mettre à jour mon interface. Je me retrouve donc à jouer avec les codes cibles conditionnels pour exécuter dans le thread principal si en Windows ou exécuter simplement la procédure en Java (avec des appels à Multitâche() ensuite) pour chaque procédure permettant de mettre à jour l'interface.

Avez-vous une idée de solution plus élégante et/ou moins contraignante à me proposer ?

C'est vraiment dommage que cette fonction ExécuteThreadPrincipal ne soit pas disponible en Java (elle est disponible en Android ... et Android, c'est du Java ... mais bon :()

Merci d'avance pour votre aide :)
Miembro registrado
954 mensajes
Publicado el 08,noviembre 2017 - 20:48
Coucou,

Tu pourrais essayer de passer via DemandeMiseAJourIHM ?

https://doc.pcsoft.fr/?1000021378

--
Charly CanDo - In üs we trust - #92i
Do. Or do not. There is no try - #y0d4

(#Compétence & #rapidité & #implication & #references) > #PasDeCV
Je suis disponible pour du consulting Windev (#debug #Optimization #System #Etc)
Miembro registrado
10 mensajes
Publicado el 08,noviembre 2017 - 22:05
Hello,

Merci pour la suggestion mais malheureusement, la fonction DemandeMiseAJourIHM n'est pas non plus disponible en Java.
Miembro registrado
954 mensajes
Publicado el 08,noviembre 2017 - 23:26
Coucou,

Au temps pour moi :p

Tient finalement cétait interessant comme question, et oui j'ai decouvert qui a deux trois qui a pas en java c dommage, mais sa viendras :p

Alors j'ai peut etre une idée c de passé via les Signal qui sont dispo eux en java ^^

Donc l'idée c de crée une procedure differere a la creation de la fenetre :





De la dans cette procedure :

// Procédure automatique :
// La procédure est exécutée automatiquement, après le code d'initialisation de la fenêtre, avec un différé de 1 seconde
//
Procedure PRIVÉE DemandeMiseAjour()
BOUCLE
SI SignalAttend(MaFenêtre..NomComplet, 1) = 1 ALORS
_nIndex est un entier = TableAjouteLigne(TABLE_SansNom1)
TABLE_SansNom1[_nIndex].COL_SansNom1 = DonneGUID(guidBrut)
SignalModifie(MaFenêtre..NomComplet, SignalFerme)
FIN
Multitâche(-10)
FIN
FIN:
SignalDétruit(MaFenêtre..NomComplet)


Ensuite ton thread de traitement va "Ouvrir" le signal quant des données sont dispo (protégé via des sections critique ^^)
Procedure Thread_Premier(_sNomDelaFenereARafraichier est une chaîne)
BOUCLE
SignalModifie(_sNomDelaFenereARafraichier, signalOuvert)
ThreadPause(5)
FIN


// Sa c pour un test dans un bouton de fenetre
_sTreadname est une chaîne = DonneGUID(guidBrut)
// Exécution d'un premier thread
ThreadExecute(_sTreadname, threadNormal, "Thread_Premier", MaFenêtre..NomComplet)


// Déclaration Global
gSignalName est une chaîne = DonneGUID(guidBrut)
// Création d'un signal
SignalCrée(MaFenêtre..NomComplet, SignalAutomatique, SignalFerme)


Et tu coup en nom de Signal j'ai prit e nom de la fenetre, mais c mieux que dans ton project tu passe par un guidbrut ^^

Voila je pense que sa peut te filer des idées ;)

Et bien sur si sa te plait pas, ou autre, repost et on en reparle ;)

--
Charly CanDo - In üs we trust - #92i
Do. Or do not. There is no try - #y0d4

(#Compétence & #rapidité & #implication & #references) > #PasDeCV
Je suis disponible pour du consulting Windev (#debug #Optimization #System #Etc)
Mensaje modificado, 08,noviembre 2017 - 23:27
Miembro registrado
10 mensajes
Publicado el 30,diciembre 2018 - 21:13
Je sais que je suis très très en retard Charly mais je voulais tout de même te remercier pour ta réponse.
Je n'étais pas arrivé à faire quelque chose de satisfaisant avec les signaux.

Cependant, depuis la version 23, les tâches parallèles sont disponibles en Java et il est possible de lancer une procédure dans le Thread principal en utilisant la constante tpoThreadPrincipal en 3ème argument de la fonction TâcheParallèleExécute, ce qui revient exactement à la même chose que la fonction ExécuteThreadPrincipal ... Bref, je ne comprends pas pourquoi ils n'ont pas rendu disponible cette fonction en Java dans Windev 23 (c'est sans doute un oubli, mais ce n'est pas grave puisque il est possible de faire avec TâcheParallèleExécute) .

Depuis la v.23, il est également possible de lancer une procédure dans le Thread principal en utilisant les automatismes de procédure dans une configuration Java (ce qui n'était pas possible auparavant).

Exemple d'utilisation :

TâcheParallèleExécute(ProcédureA, (), tpoThreadPrincipal)


Documentation de TâcheParralèleExécute (Fonction) : https://doc.pcsoft.fr/?1000021211&verdisp=230
Documentation des automatismes de procédure : https://doc.pcsoft.fr/fr-FR/?9000072&name=Procedures_automatiques
Mensaje modificado, 30,diciembre 2018 - 21:17