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
SELON Dialogue("Attention, votre scan de port est en cours. Souhaitez-vous quitter la fenêtre ?")
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)
CAS 2
FIN
SINON
SELON Dialogue("Attention, votre scan de port est en cours. Souhaitez-vous quitter la fenêtre ?")
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)
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
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)
ThreadExecute("THREAD_ScanGroupe_" + groupeDébut, threadNormal, ScanGroupe, groupeDébut, groupeFin)
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
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)
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"
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.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.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
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