PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2025 → Ecran noir Android Windev Mobile 27
Ecran noir Android Windev Mobile 27
Débuté par K.T, 25 mar. 2025 17:22 - 2 réponses
Posté le 25 mars 2025 - 17:22
Bonjour à tous

Je lance aujourd'hui cette bouteille à la mer car même après avoir passé des heures à chercher une réponse sur Internet, je n'arrive toujours pas à trouver de solution à mon problème. Je travaille par ailleurs sous Windev Mobile version 27.

Voici le contexte :

J'ai créer une petite application de scan de ports ouverts qui les affichent ensuite dans une liste. Si un utilisateur tente de quitter la fenêtre alors que le scan est en cours, le scan sera fermé proprement. Il est aussi possible de mettre en pause le processus et de le relancer si nécessaire. Jusque là, aucun problème, les ports sont bien scannés puis afficher dans une liste et l'arrêt en cours de scan est bien géré aussi.
Mon problème survient seulement une fois que le scan est terminé et seulement lorsque je teste sur téléphone (un Android dans mon cas). Une fois le scan terminé, si l'utilisateur clique sur le bouton retour pour revenir à la page précédente, un écran noir s'affiche. L'application est toujours en cours mais impossible d'interagir avec et il faut relancer l'application pour que ça marche de nouveau.

Impossible de comprendre d'où vient ce bug puisque il ne se produit que lors des tests sur téléphones mais pas lors des test sur PC. J'ai essayé d'enlever de mon code tout ce qui pourrait être manipulation de l'UI puisque j'avais l'impression que le problème pouvait possiblement venir de là, mais le bug persiste.

Vous trouverez le code plus bas de mon application tel qu'il était lors du premier test. Je remercie d'avance quiconque saurait m'aider à résoudre mon problème et je vous souhaite à tous une bonne journée.


Code de l'Action Bar qui permet de fermer la fenêtre :

SI ThreadEtat("CréationThread") = threadEnCours
//1 : Quitter
//2 : Ne pas quitter
SELON Dialogue("Attention, votre scan de port est en cours. Souhaitez-vous quitter la fenêtre ?")
// Quitter
CAS 1
gbFinPort = Vrai
gbFinPort2 = Faux
MoiMême.Visible = Faux
BTN_Sélectionner.Etat = Grisé

SI BTN_Quitter.Etat = Grisé ALORS
//
SINON
BTN_Quitter.Etat = Grisé
FIN

SI COMBO_NomPorts.Etat = Grisé ALORS
//
SINON
COMBO_NomPorts.Etat = Grisé
FIN

TANTQUE ThreadEtat("CréationThread") = threadEnCours

Multitâche(2s)

FIN

Ferme(FEN_Scan_Ports)

// Ne pas quitter
CAS 2
//
FIN
SINON
SELON Dialogue("Attention, votre scan de port est en cours. Souhaitez-vous quitter la fenêtre ?")
// Quitter
CAS 1
gbFinPort = Vrai
gbFinPort2 = Faux
ACTB_ActionBar.Visible = Faux
BTN_Sélectionner.Etat = Grisé

SI BTN_Quitter.Etat = Grisé ALORS
//
SINON
BTN_Quitter.Etat = Grisé
FIN

SI COMBO_NomPorts.Etat = Grisé ALORS
//
SINON
COMBO_NomPorts.Etat = Grisé
FIN


TANTQUE CompteurThread <> 0
Multitâche(2s)
FIN

Ferme(FEN_Scan_Ports)

// Ne pas quitter
CAS 2
//
FIN
FIN



Voici la procédure Globale qui lance mes threads nommé Création1 :

Procedure Création1()

SI ThreadEtat("CréationThread") = threadInexistant ALORS
ThreadExecute("CréationThread", threadNormal, BatchScanning)

FIN



Voici la procédure Globale BatchScanning :

Procedure BatchScanning()


nbPortsParGroupe est un numérique
groupeDébut est un numérique
groupeFin est un numérique




nbPortsParGroupe = 10 // Taille du groupe de ports à tester
groupeDébut = 4000
groupeFin = 4009
CompteurThread = 0
ThreadsEnPause = Faux

TANTQUE FenEtat(FEN_Scan_Ports) <> Invisible ET groupeDébut < 12000

SI groupeFin >= 12000 ALORS
SORTIR
FIN

CompteurThread++
Trace("Threads actifs : " + CompteurThread)
// Lancer un thread pour tester un groupe de ports
ThreadExecute("THREAD_ScanGroupe_" + groupeDébut, threadNormal, ScanGroupe, groupeDébut, groupeFin)



// Passer au groupe suivant
groupeDébut += nbPortsParGroupe
groupeFin += nbPortsParGroupe

ThreadPause(100ms)




SI gbFinPort = Vrai ALORS
TANTQUE CompteurThread <> 0
Multitâche(100ms)
FIN
Trace("Thread terminé, threads actifs restants : " + CompteurThread)
ThreadFin()
SORTIR

FIN


SI gbFinPort2 = Vrai ALORS
// Attendre que tous les threads marquent la pause
TANTQUE ThreadsEnPause = Faux
Multitâche(100ms)
FIN

ExécuteThreadPrincipal(ScanEtatPause)

FIN

SI gbFinPort2 = Faux ET ThreadsEnPause = Vrai ALORS
ThreadsEnPause = Faux
ExécuteThreadPrincipal(ScanEtatDépause)
FIN


FIN

TANTQUE CompteurThread > 0
Multitâche(100ms) // Attente active pour vérifier l'état des threads
FIN


ExécuteThreadPrincipal(Affichage_Message_Interne)

Info("Yes c'est arrêté")

ThreadFin()






PROCEDURE INTERNE PausePorts()
SI FenEtat(FEN_Scan_Ports) <> Invisible ALORS
SI gbFinPort2 = Vrai ALORS ThreadAttendSignal(Infini)
FIN
FIN

PROCEDURE INTERNE ScanEtatPause()
SI FenEtat(FEN_Scan_Ports) <> Invisible ALORS
FEN_Scan_Ports.LIB_EtatScan = "Scan en Pause"
//FEN_Scan_Ports.IMG_Attente.Animation = Faux
SI FEN_Scan_Ports.LISTE_ListeTest.Vide = Vrai ALORS
FEN_Scan_Ports.LISTE_ListeTest.Etat = Grisé
FEN_Scan_Ports.COMBO_NomPorts.Etat = Grisé
SINON
FEN_Scan_Ports.LISTE_ListeTest.Etat = Actif
FEN_Scan_Ports.COMBO_NomPorts.Etat = Actif
FEN_Scan_Ports.BTN_Sélectionner.Etat = Actif
FIN
FIN
FIN

PROCEDURE INTERNE ScanEtatDépause()
SI FenEtat(FEN_Scan_Ports) <> Invisible ALORS
FEN_Scan_Ports.LIB_EtatScan = "Scan en cours"
//FEN_Scan_Ports.IMG_Attente.Animation = Vrai
FEN_Scan_Ports.LISTE_ListeTest.Etat = Grisé
FEN_Scan_Ports.COMBO_NomPorts.Etat = Grisé
FEN_Scan_Ports.BTN_Sélectionner.Etat = Grisé
FIN
FIN

PROCEDURE INTERNE Affichage_Message_Interne()
SI FenEtat(FEN_Scan_Ports) <> Invisible ALORS
Info("Scan terminé")
FEN_Scan_Ports.LIB_EtatScan = "Scan Terminé"
//FEN_Scan_Ports.IMG_Attente.Animation = Faux
FEN_Scan_Ports.LISTE_ListeTest.Etat = Actif
SI FEN_Scan_Ports.LISTE_ListeTest.Vide = Faux ALORS
FEN_Scan_Ports.BTN_Sélectionner.Etat = Actif
FEN_Scan_Ports.COMBO_NomPorts.Etat = Actif
FEN_Scan_Ports.BTN_Quitter.Etat = Grisé
SINON
Info("Aucun port ouvert n'a été trouvé")
FEN_Scan_Ports.BTN_Quitter.Etat = Grisé
FIN
SINON
//
FIN
FIN




Voici la procédure Globale ScanGroupe qui va donc vérifier si un port est ouvert et s'il "communique" (SocketLit qui n'est pas vide) :

ROCÉDURE ScanGroupe(groupeDébut, groupeFin)


PortLocal est un numérique

POUR PortLocal = groupeDébut À groupeFin

SI gbFinPort = Vrai ALORS
SI SocketExiste("SocketThreadTest" + PortLocal) ALORS
SocketFerme("SocketThreadTest" + PortLocal)
FIN
SORTIR
FIN

TANTQUE gbFinPort2 = Vrai

Multitâche(100ms)
ThreadsEnPause = Vrai
FIN


SI PortLocal = 4500 ALORS
CONTINUER
FIN

SI PortLocal = 5060 ALORS
CONTINUER
FIN

SI PortLocal = 7275 ALORS
CONTINUER
FIN

SI SocketExiste("SocketThreadTest" + PortLocal) = Faux ALORS
SocketCréeUDP("SocketThreadTest" + PortLocal, PortLocal)
FIN

sMsgTest3 = SocketLit("SocketThreadTest" + PortLocal, Faux, 3s)

SI sMsgTest3 <> "" ALORS
BD.PortsOuverts = PortLocal + " est ouvert"
BD.NuméroPorts = PortLocal
HAjoute(BD)
Trace("Port " + PortLocal + " ouvert, message reçu : " + sMsgTest3)
ExécuteThreadPrincipal(Affichage)

FIN

// Fermer le socket après le test

SocketFerme("SocketThreadTest" + PortLocal)
Trace(PortLocal)


FIN

CompteurThread--
Trace("Thread terminé, threads actifs restants : " + CompteurThread)




Voici la procédure Globale nommée Affichage :

Procedure Affichage()


ListeAffiche(FEN_Scan_Ports.LISTE_ListeTest)
ListeAffiche(FEN_Scan_Ports.COMBO_NomPorts)




Je rajoute par ailleurs le code complet de la fenêtre de scan, nommée Fen_Scan_Ports :


Fin d'initialisation de Fen_Scan_Ports :

Création1()



Fermeture de Fen_Scan_Ports :

gbFinPort = Vrai
gbFinPort2 = Faux
ACTB_ActionBar.Visible = Faux
BTN_Sélectionner.Etat = Grisé

SI BTN_Quitter.Etat = Grisé ALORS
//
SINON
BTN_Quitter.Etat = Grisé
FIN

SI COMBO_NomPorts.Etat = Grisé ALORS
//
SINON
COMBO_NomPorts.Etat = Grisé
FIN

TANTQUE ThreadEtat("CréationThread") = threadEnCours

Multitâche(2s)

FIN
Membre enregistré
237 messages
Posté le 25 mars 2025 - 18:48
Bonsoir,
Comme indiqué dans la doc : il est conseillé d'utiliser la fonction ThreadPause à la place de Multitâche lorsque plusieurs threads sont utilisés :
https://doc.pcsoft.fr/fr-FR/?3077029&name=threadpause_fonction

Je n'ai pas analysé tout votre code (pas assez de temps) mais vérifiez que les threads secondaires n'interagissent pas avec l'utilisateur ou mettent à jour l'UI... c'est fortement déconseillé.
Notamment ceci : Info("Yes c'est arrêté")

Cdt
Message modifié, 25 mars 2025 - 18:50
Posté le 26 mars 2025 - 11:47
Fabrice N a écrit :
Bonsoir,
Comme indiqué dans la doc : il est conseillé d'utiliser la fonction ThreadPause à la place de Multitâche lorsque plusieurs threads sont utilisés :
https://doc.pcsoft.fr/fr-FR/?3077029&name=threadpause_fonction

Je n'ai pas analysé tout votre code (pas assez de temps) mais vérifiez que les threads secondaires n'interagissent pas avec l'utilisateur ou mettent à jour l'UI... c'est fortement déconseillé.
Notamment ceci : Info("Yes c'est arrêté")

Cdt


Bonjour Fabrice

Je vous remercie pour vos conseils. Il semble que mon bug venait de là car après avoir modifié les Multitâches par des ThreadsPause et effectuer de nouveaux tests, mon programme n'a pas rencontré la moindre erreur. Je ferais plus attention la prochaine fois lorsque j'utiliserais Multitâche.
Je vous remercie pour vos précieux conseils et je vous souhaite une bonne journée