Page 2 sur 2

Re: Gestion events problème

Publié : ven. 09/sept./2016 9:29
par Marc56
(mon dernier raisonnement était faux, désolé)

Re: Gestion events problème

Publié : ven. 09/sept./2016 9:33
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

Re: Gestion events problème

Publié : ven. 09/sept./2016 13:13
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:

Re: Gestion events problème

Publié : dim. 11/sept./2016 17:11
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()

Re: Gestion events problème

Publié : lun. 12/sept./2016 7:23
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

Re: Gestion events problème

Publié : lun. 12/sept./2016 7:36
par Zorro
:lol: :)

Re: Gestion events problème

Publié : lun. 12/sept./2016 11:25
par Ollivier
@Marc56

A part les discours hilarants, ça marche?!?

Re: Gestion events problème

Publié : lun. 12/sept./2016 11:48
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()

Re: Gestion events problème

Publié : lun. 12/sept./2016 11:52
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)

Re: Gestion events problème

Publié : lun. 12/sept./2016 12:12
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.

Re: Gestion events problème

Publié : lun. 12/sept./2016 12:17
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

Re: Gestion events problème

Publié : lun. 12/sept./2016 22:47
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.

Re: Gestion events problème

Publié : mar. 13/sept./2016 9:34
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:

Re: Gestion events problème

Publié : mar. 13/sept./2016 15:18
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)

Re: Gestion events problème

Publié : mer. 14/sept./2016 14:50
par jmg49
et bien merci beaucoup pour toutes vos explication et exemples !