Gestion events problème

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Gestion events problème

Message par Marc56 »

(mon dernier raisonnement était faux, désolé)
Dernière modification par Marc56 le ven. 09/sept./2016 12:23, modifié 9 fois.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Gestion events problème

Message par falsam »

dans l'absolu rien n'empeche le passage de plusieurs parametres a un Thread , mais faut alors ruser
Pas besoin de ruser : Tu passes un pointeur de structure.
:arrow: https://www.purebasic.com/french/docume ... hread.html
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Gestion events problème

Message par Zorro »

falsam a écrit :
dans l'absolu rien n'empeche le passage de plusieurs parametres a un Thread , mais faut alors ruser
Pas besoin de ruser : Tu passes un pointeur de structure.
on va pas jouer sur la sémantique
par ruser j'entends "utiliser une methode non conventionnelle" , puisque par convention
une Procedure peut contenir plusieurs parametres

Procedure Toto (par1,par2,par3,par4 )

alors que le fait d'en faire un thread bloque cette façon de faire appel a la procedure de façon traditionnel , et oblige une utilisation
non "standard" , en passant par Structures, écriture sur disque, ou agglomération dans un bluffer ou chaine$ comme je le montre
cela reviens donc bien a "ruser" ..

je voulais aussi montrer que l'emploi des pointeurs n'est absolument pas une obligation

[reedit]
tu as toutefois bien fait de rappeler la Doc ;)
apres tout l'emploi d'une structure est quand meme plus souple que l'emploi d'une Chaine :lol:
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Gestion events problème

Message par Ollivier »

Ici, on choisit l'IP, on starte le ping-test, on le stoppe et peut remettre à 0 l'affichage (EditorGdt).
On peut s'emmêler les pinceaux, ça marchera encore.

Code : Tout sélectionner

Global Prog

Procedure Start()
        If Prog = 0
                Prog = RunProgram("Ping", IPString(GetGadgetState(100) ) + " -n 100", "", #PB_Program_Hide | #PB_Program_Open | #PB_Program_Read)
        EndIf
EndProcedure

Procedure Stop()
        If Prog
                KillProgram(Prog)
                Prog = 0
        EndIf
EndProcedure

Procedure Reset()
        ClearGadgetItems(2)
EndProcedure

Macro Button(bn, bx, by, bw, bh, bproc, btext, bwind = 1)
        ButtonGadget(bn, bx, by, bw, bh, btext)
        BindEvent(#PB_Event_Gadget, bproc, bwind, bn)
EndMacro

OpenWindow(1, 128, 128, 640, 480, "Ping test")
IPAddressGadget(100, 20, 20, 160, 20)
SetGadgetState(100, MakeIPAddress(127, 0, 0, 1) )
EditorGadget(2, 20, 60, 600, 240, #PB_Editor_ReadOnly)
Button(3, 20, 400, 64, 24, @Start(), "Start")
Button(4, 120, 400, 64, 24, @Stop(), "Stop")
Button(5, 220, 400, 64, 24, @Reset(), "RàZ")
Repeat
        If Prog
                Size = AvailableProgramOutput(Prog)
                If Size
                        *Buff = ReAllocateMemory(*Buff, Size + 1)
                        Size = ReadProgramData(Prog, *Buff, Size)
                        AddGadgetItem(2, -1, PeekS(*Buff, Size - 2, Mode) )
                EndIf
        EndIf
Until WaitWindowEvent(16) = #PB_Event_CloseWindow
Stop()
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Gestion events problème

Message par Marc56 »

PB 5.50 x64 / Win 10 x64:

F5
Start

Code : Tout sélectionner

Attente du démarrage du programme...
Type d'exécutable: Windows - x64  (64bit, Unicode)
Exécutable démarré.
[ERREUR] Ligne: 5
[ERREUR] InitNetwork() doit être appelée avec succès avant l'utilisation des commandes Network.
Débogeur > Arrêter le programme :roll:
InitNetwork() ajouté

F5
Start

Code : Tout sélectionner

Attente du démarrage du programme...
Type d'exécutable: Windows - x64  (64bit, Unicode)
Exécutable démarré.
[ERREUR] Ligne: 40
[ERREUR] PeekS(): valeur non valide pour le paramètre 'Flags'
Débogeur > Arrêter le programme :roll:

CTRL + W
N
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Gestion events problème

Message par Zorro »

:lol: :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Gestion events problème

Message par Ollivier »

@Marc56

A part les discours hilarants, ça marche?!?
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Gestion events problème

Message par Ollivier »

Je voudrais bien t'y voir pondre un code comme à partir d'un SmartPhone! Ça ira malgré les accents?

Code : Tout sélectionner

CompilerIf #PB_Compiler_Version > 522
      InitNetwork()
CompilerEndIf 
Global Prog
Procedure Start()
      If Prog = 0
           Prog = RunProgram("Ping", IPString(GetGadgetState(100) ) + " -n 100", "", #PB_Program_Hide | #PB_Program_Open | #PB_Program_Read)
      EndIf
EndProcedure
Procedure Stop()
      If Prog
           KillProgram(Prog)
           Prog = 0
      EndIf
EndProcedure
Procedure Reset()
      ClearGadgetItems(2)
EndProcedure
Macro Button(bn, bx, by, bw, bh, bproc, btext, bwind = 1)
      ButtonGadget(bn, bx, by, bw, bh, btext)
      BindEvent(#PB_Event_Gadget, bproc, bwind, bn)
EndMacro
OpenWindow(1, 128, 128, 640, 480, "Ping test")
IPAddressGadget(100, 20, 20, 160, 20)
SetGadgetState(100, MakeIPAddress(127, 0, 0, 1) )
EditorGadget(2, 20, 60, 600, 240, #PB_Editor_ReadOnly)
Button(3, 20, 400, 64, 24, @Start(), "Start")
Button(4, 120, 400, 64, 24, @Stop(), "Stop")
Button(5, 220, 400, 64, 24, @Reset(), "RàZ")
Repeat
      If Prog
           Size = AvailableProgramOutput(Prog)
           If Size
                *Buff = ReAllocateMemory(*Buff, Size + 1)
                Size = ReadProgramData(Prog, *Buff, Size)
                AddGadgetItem(2, -1, PeekS(*Buff, Size - 2) )
           EndIf
      EndIf
Until WaitWindowEvent(16) = #PB_Event_CloseWindow
Stop()
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Gestion events problème

Message par Marc56 »

Ollivier a écrit : A part les discours hilarants, ça marche?!?
NON (C'est bien pour ça que j'avais pris la peine de copier les messages d'erreur.)

Par contre le dernier que tu viens de mettre fonctionne :)
(mis à par les caractères retournés qui n'ont pas de problème d'accents mais semblent en chinois) (PB 5.50)
Ollivier a écrit :Je voudrais bien t'y voir pondre un code comme à partir d'un SmartPhone!
Mais quelle drôle d'idée ????

Merci (à tous) de tester complètement les codes avant de poster :roll:

Le Stop() à la fin qui renvoie vers KillProgram ne sert à rien puisque dixit la doc, tous les threads sont killés à la fin du programme.

PS. Il y a par contre un concept intéressant avec la macro :idea:
:arrow: (mais ça ne rends pas plus clair l'utilisation et le debug)
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Gestion events problème

Message par Ollivier »

Pour le Stop(), il est très bien là où il est, ce serait une grave erreur de le sauter là.

Prière de m'indiquer ton nouveau problème et d'émettre éventuellement une suggestion.
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Gestion events problème

Message par Marc56 »

Ollivier a écrit :Pour le Stop(), il est très bien là où il est, ce serait une grave erreur de le sauter là.

Prière de m'indiquer ton nouveau problème et d'émettre éventuellement une suggestion.
Erreur: PB 5.50 est unicode par défaut et la commande ping retourne une chaine ansi.
Image

Suggestion: Ajouter #PB_Ascii:

Code : Tout sélectionner

AddGadgetItem(2, -1, PeekS(*Buff, Size - 2, #PB_Ascii))
C'est moins pire, car on ne perd alors que les accents.
Image

Suggestion 2: Remplacer les accents ou n'afficher que la partie de la chaine sans accents (après tout on se fiche du "réponse de") seuls les chiffres sont intéressants.

Code : Tout sélectionner

Repeat
    If Prog
        Size = AvailableProgramOutput(Prog)
        If Size
            *Buff = ReAllocateMemory(*Buff, Size + 1)
            Size = ReadProgramData(Prog, *Buff, Size)
            PingString$ = PeekS(*Buff, Size - 2, #PB_Ascii)
            Ping$       = StringField(PingString$, 4 , " ") + " - " +
                          StringField(PingString$, 5 , " ") + " - " +
                          StringField(PingString$, 6 , " ")               
            AddGadgetItem(2, -1, Ping$)
        EndIf
    EndIf
Until WaitWindowEvent(16) = #PB_Event_CloseWindow
Image
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Gestion events problème

Message par Ollivier »

Marc56 a écrit :Suggestion 2: Remplacer les accents ou n'afficher que la partie de la chaine sans accents (après tout on se fiche du "réponse de") seuls les
chiffres sont intéressants.
(Je pense a fortiori que la problème 1er de jmg49 est
résolu.)

Si tu remplaces PeekS() par PeekANSI() dispo ici, tu auras les accents avec ton programme en mode Unicode.

Aussi, voici une fonction Digit() qui t'extrait le Nième nombre entier de base décimale (puisque tu dis que seuls les chiffres sont intéressants). Dispo ici.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Gestion events problème

Message par falsam »

Ollivier a écrit :Je voudrais bien t'y voir pondre un code comme à partir d'un SmartPhone! Ça ira malgré les accents?
Configure ton téléphone en point d’accès Wifi et tu pourras accéder au forum depuis ton pc (Si Wifi disponible sur ton pc) :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Gestion events problème

Message par Marc56 »

Sur la base de la version d'Ollivier, une version avec découpe à l'aide d'une expression régulière, dépose en colonnes et possibilité de changer l'IP

Code : Tout sélectionner

EnableExplicit

CompilerIf #PB_Compiler_Version > 522
    InitNetwork()
CompilerEndIf

Global Prog

Procedure Start()
    If Prog = 0
        Prog = RunProgram("Ping", IPString(GetGadgetState(100) ) + " -n 100", "", 
                          #PB_Program_Hide | #PB_Program_Open | #PB_Program_Read)
    EndIf
EndProcedure

Procedure Stop()
    If Prog
        KillProgram(Prog)
        Prog = 0
    EndIf
EndProcedure

Procedure Reset()
    ClearGadgetItems(2)
EndProcedure

Macro Button(bn, bx, by, bw, bh, bproc, btext, bwind = 1)
    ButtonGadget(bn, bx, by, bw, bh, btext)
    BindEvent(#PB_Event_Gadget, bproc, bwind, bn)
EndMacro

OpenWindow(1, 128, 128, 640, 480, "Ping test")
IPAddressGadget(100, 20, 20, 160, 20)

SetGadgetState(100, MakeIPAddress(127, 0, 0, 1)) ; (test)
SetGadgetState(100, MakeIPAddress(IPAddressField(GetGadgetState(100), 0),
                                  IPAddressField(GetGadgetState(100), 1),
                                  IPAddressField(GetGadgetState(100), 2),
                                  IPAddressField(GetGadgetState(100), 3)))

ListIconGadget(2, 20, 60, 600, 240, "Destination", 146) 
AddGadgetColumn(2, 1, "Octets", 150)
AddGadgetColumn(2, 2, "Temps", 150)
AddGadgetColumn(2, 3, "TTL",   150)

Button(3,  20, 400, 64, 24, @Start(), "Start")
Button(4, 120, 400, 64, 24, @Stop(),  "Stop")
Button(5, 220, 400, 64, 24, @Reset(), "RàZ")

Enumeration 
    #RegEx
EndEnumeration

If CreateRegularExpression(#RegEx, "((?:\d{1,3}\.){1,3}\d{1,3}).+s=(\d+).+(\d+)[ ]?ms.+TTL=(\d+)")
    ; Debug "RegEx OK"
Else
    Debug "RegEx KO"
    End
EndIf

Define Size
Define Ping$
Define *Buff
Define PingString$

Repeat
    If Prog
        Size = AvailableProgramOutput(Prog)
        If Size
            Ping$ = ""
            *Buff = ReAllocateMemory(*Buff, Size + 1)
            Size = ReadProgramData(Prog, *Buff, Size)
            PingString$ = PeekS(*Buff, Size - 2, #PB_Ascii)
            
            If MatchRegularExpression(#RegEx, PingString$)
                ExamineRegularExpression(#RegEx, PingString$)
                While NextRegularExpressionMatch(#RegEx)
                    AddGadgetItem(2, -1, RegularExpressionGroup(#RegEx, 1) + Chr(10) +
                                         RegularExpressionGroup(#RegEx, 2) + Chr(10) +
                                         RegularExpressionGroup(#RegEx, 3) + Chr(10) +
                                         RegularExpressionGroup(#RegEx, 4) + Chr(10) )
                Wend    
            Else
                AddGadgetItem(2, -1, "-")
            EndIf
        EndIf
    EndIf
Until WaitWindowEvent(16) = #PB_Event_CloseWindow

FreeRegularExpression(#RegEx) 
End
L'expression régulière est faite à l'arrache, sans utiliser l'un des nombreux exemples existants.
À améliorer, notamment en cas d'absence de réponse serveur.
8)
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

Re: Gestion events problème

Message par jmg49 »

et bien merci beaucoup pour toutes vos explication et exemples !
Répondre