IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

[VB6] Timer.interval limité à 1


Sujet :

VB 6 et antérieur

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 36
    Par défaut [VB6] Timer.interval limité à 1
    Bonjour à tous, et avant tout autre chose merci à toute l'équipe et aux forumeurs présents. Je travaille depuis un mois sur quelques projets et j'ai trouvé énormément d'aide sur le site et sur le forum, copié (mais aussi compris) beaucoup de morceau de code qui m'ont été très utiles. Merci pour tout ça

    J'ai aussi rencontré une masse de problèmes assez importante, parmi lesquels l'intervalle d'un timer. j'aurais souhaité le descendre afin d'avoir accès aux unités 10 fois plus petites que la miliseconde. c'est donc ma question, est-ce possible?

    à ceux qui se contenteront de répondre à cette question, je leur dis déjà un grand merci. je ne souhaite pas abuser de votre temps et vous pouvez arrêter votre lecture ici





    Pour ceux qui pourraient être interessés à connaître et essayer de résoudre d'autres problèmes que j'ai pu avoir sur mes projets, je me dois d'en faire une brève description. et aussi ma brêve présentation.

    Je suis en fac de psychologie, je m'y connais peu en informatique et j'ai choisis VB pour cette raison. j'ai tenté le C++ mais je suis définitivement perdu je crois et j'avais besoin d'applications rapidement de manière à faire passer des expériences sans faire trop attendre les personnes qui se sont proposées pour m'aider.

    Mon travail, c'est important pour comprendre les raisons d'être de mes applications, a pour sujet la synesthésie, un trouble neurologique peu connu mais paradoxalement pas forcément rare. La synesthésie est l'association de plusieurs modalités sensorielles dans le cerveau, c'est à dire, que les yeux vont par exemple percevoir les images mais les sons également - ou alors, écouter telle musiques va donner l'impression que l'on mange du sucré. De grandes figures historiques comme Rimbaud ou Baudelaire étaient synesthètes. c'est en fait une sorte de "mélange" des sens.

    un type particulier de synesthésie est la synesthésie Graphème couleur, c'est l'objet de mon travail : les synesthètes Graphèmes-couleur voient les symboles en différentes couleurs. par exemple, ce "A" que nous voyons tous en noir, les synesthètes le verront en vert foncé, ou rouge (cela dépend des synesthètes eux même). certains diraont même qu'il ressente la même sensation en voyant ce "A" qu'en mangeant un abricot.

    A propos, si vous vous reconnaissez dans cette description, je vous supplie de ne pas en lire d'avantage, de fermer cette page et de prendre contact en mp, avec moi, le plus tôt possible. j'ai beaucoup de difficultés à trouver des sujets synesthètes et si vous en êtes un, il ne faut pas que vous sachiez comment fonctionnent mes expériences, avant de les passer (auquel cas votre aide ne me serait d'aucune utilité :/ )

    Passons aux expériences et aux applications VB proprement dites.

    ma première application veut afficher un caractère et lancer une palette de couleur, afin que le synesthète puisse choisir la correspondance de couleur et ainsi me dire quelle "couleur" a ce caractère (je rappelle que les caractères sont affichés en noir, toujours, mais que les synesthètes les voient en couleur). tout ceci se fait sur un écran totalement blanc et prenant tout l'écran, pour éviter que d'autres perceptions ne parasitent l'expérience.

    j'ai le code à disposition pour ceux qui le souhaiteraient (cela risque de faire long ici :/) et des problèmes que j'ai rencontrés sont les suivants, hélas, pas les seuls, mais les plus importants :

    1/ je souhaite inscrire dans une variable chaîne l'ensemble des symboles à afficher (Chainesymboles = "abscdefghijklmnopqrstuvwxyz&é"'(-....etc"), puis choisir au hasard un de ces symboles, le mettre dans une variable et l'utiliser, mais après, l'enlever de la chaîne pour qu'il ne soit pas réutilisé par la suite ! j'ai beau eu cherché, je n'ai pas trouvé de moyen d'enlever une lettre, l'une après l'autre, jusqu'à épuiser la chaîne entière.
    Du coup, j'ai créé une série de chaîne et une série d'exécutable correspondant, pour que mon expérience n'affiche pseudo aléatoirement jamais la même suite de lettre (d'abord l "e", puis le ":", puis le "y" ... sur un des exécutables, et sur un autre, d'abord le "y", puis le "e", puis le ";", ...). j'ai peine avec ce problème là. prendre une suite aléatoires de données prédéfinies est chose courante en expérience de psycho, j'aurais aimé apprendre à le faire.

    2/ je vais envoyer mes expériences à d'autres personnes sur le net. malheureusement, plusieurs fois, on m'a assuré que windows considère mes programmes comme "malveillants" et ne veut pas les ouvrir; j'ai pensé qu'il y'avait une problème d'authentification. windows ne connaît pas mes programmes, lesquels ne sont pas certifiés, alors, les considèrent comme potentiellement dangereux :/ cela le fait également avec un fichier installer. bat que je créé pour l'occasion, afin de copier les dll manquantes sur l'ordinateur distant (j'envoie les dll dans un dossier et le fichier installer.bat à côté dont les lignes de codes sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    copy dll-manquantes\VB6FR.DLL C:\WINDOWS\system32\VB6FR.DLL
    copy dll-manquantes\commdlg.dll C:\WINDOWS\system32\commdlg.dll
    copy dll-manquantes\COMDLG32.OCX C:\WINDOWS\system32\COMDLG32.OCX
    regsvr32 \windows\system32\COMDLG32.OCX)
    j'aimerais pouvoir envoyer ce petit fichier d'installation et mes programmes de telles sorte qu'ils soient acceptés par les ordinateurs distants et ouverts comme sur le mien. il n y a absolument rien de dangereux dedans!

    3/ mes programmes copient les résultats d'expériences dans un fichier texte (que je colle sur le c: est-ce qu'il peut y avoir un rapport avec le problème numero2/?) j'ai trouvé plusieurs exemple d'envois d'email sur le forum, mais ne doit pas être assez doué pour comprendre leur fonctionnement. j'aimerais effectivement m'envoyer ce fichier résultat pour éviter que les résultats ne soient changés. ou alors, faire en sorte que ce fichier texte ne puisse être ouvert que par moi (spa que j'ai pas confiance, c'est juste que l'expérience et les résultats sont très importants, je veux éviter tout risque)

    j'avais trouvé sur le forum le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Cmdmail_Click()
    MAPISession1.SignOn
    MAPIMessages1.MsgIndex = -1
    MAPIMessages1.SessionID = MAPISession1.SessionID
    MAPIMessages1.RecipDisplayName = "mon.adresse@voila.fr"  'Destinataire
    MAPIMessages1.MsgSubject = "Un petit bonjour"       'Objet
    MAPIMessages1.MsgNoteText = "Salut."                'Texte
    MAPIMessages1.Send
    MAPISession1.SignOff
    End Sub
    en collant les deux contrôles MAPIsession et MAPImessages, j'ai tenté de m'envoyer des messages, mais n'y arrive pas. Auriez-vous une idée de ce qui cloche? je suis sûr que ça doit être simple, mais quand on ne connaît pas, on peut rester 3 ou 4 semaines à chercher de site en site cette chose qui nous manque :/

    Bien voilà, j'espère que cela n'était pas trop indigeste pour un début. J'ai passé beaucoup de temps à essayer de trouver solution à tout ça, j'ai peut etre mal cherché. S'il existe des parties qui en traient et que j'aurais manqué, je ne vous en voudrai pas de seulement copier les liens sans explication. Si certains d'entre vous sont interessés par cette étude, je peux envoyer tout code que j'ai fait ou tout renseignement. je vous remercie d'avoir lu jusque là

  2. #2
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Cher Monsieur,

    Mon premier réflexe était de vous répondre que, sur ce forum de développement sous VB, les explications médicales que vous avez bien voulu nous donner n'avaient pas vraiment lieu d'être exposées.
    Une deuxième lecture m'a fait changer d'avis, car ces explications laissent entrevoir votre but et se posent alors de nombreuses questions.
    Je devine en effet que vous souhaitez, entre autres, pouvoir afficher à des fréquences différentes et devine que cet affichage va être complété par d'autres appareils sans lien direct avec l'ordinnateur qui affiche, pour analyser certaines réactions.
    Se posent alors plusieurs questions :
    - provoquer des exécutions à un intervalle infime est possible avec une Api (gettickcount, je crois), mais encore faut-il que la durée de l'exécution soit inférieure ou égale à l'intervalle défini. Question donc : quel type d'exécution ?
    - la fréquence de rafraichissement de l'écran ne doit pas être perdue de vue si, comme je le devine, les réactions (analysées par ailleurs) du patient dépendent de cet affichage

    Je crois qu'il est important de vous poser ces questions avant même de poursuivre ici. Si, après réflexion, vous décidez qu'il est bon de continuer, vous recevrez toute notre aide pour y parvenir.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 36
    Par défaut
    Bien je m'excuse pour le précédent post, peut etre aurais-je dû négliger certaines explications. Grand merci pour ta réponse, jmfmarques. cla m'a fait prendre conscience de mes mauvais questionnement.

    concernant le problème du timer, je compte effectivement analyser des temps de réaction. pour donner un exemple, j'affiche une image contenant des "1" et un seul "L" et propose à l'utilisateur de taper sur une touche à droite du clavier, si le L se trouve à dans la partie droite, une touche à gauche si L se trouve dans la partie gauche.

    mes résultats sont de l'ordre de 60 ms, j'aurais aimé que l'image s'affiche, le timer débute en même temps. l'utilisateur répond. le timer s'arrête dès que l'utilisateur a appuyé sur la touche et inscrit le temps qu'il s'est écoulé entre l'affichage de l'image et l'événement "taper touche". seulement, l'intervalle en milliseconde me paraît trop faible. j'aimerais un degré de précision de plus, donc. étant donné que le timer et son exécution ne consiste en fait qu'à comptabiliser les unités de temps, l'instruction est fort simple :

    Compteur = Compteur + 1

    Il est vrai cependant que j'y ai ajouté d'autres instructions, négligeant ainsi la portée sur le temps d'exécution. merci de me le rappeler.

    bon pour le moment, je me contenterai de demander s'il y'a un moyen d'éxécuter cette instruction tous les dixièmes de miliseconde plutôt que toutes les milisecondes.

    Merci également de m'avoir remis en mémoire le problème du rafraîchissement de l'image. oh là là, tout cela est beaucoup plus compliqué que je ne l'imaginais je crois me souvenir d'un post sur le site permettant de calculer le temps d'éxécution de code, je m'y atelle de suite, ainsi qu'à cette API (ne sais pas encore ce qu'est exactement une API, mais je me débrouillerai ^^) Gettickcount.

  4. #4
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Bien !
    Tu as choisi le tutoiement et je t'en remercie, car cela facilite les choses.
    Fais déjà une recherche sur ce forum avec le mot Gettickcount, mais il me semble d'ores et déjà que cette api pourra être utilisée hors timer, ce qui facilite les choses, puisque tu nous dis vouloir mesurer le temps de réaction.
    Ou encore à l'intérieur du timer. On pourra ainsi déterminer la durée écoulée entre le moment de l'affichage d'un symbole et celui de la pression d'une touche.
    Je te propose de scinder ton problème en plusieurs sujets, un après l'autre.
    Le 1er sujet pourrait donc être :
    Comment afficher un symbole quelconque à l'écran, l'affichage étant provoqué par un timer, et mesurer le temps écoulé entre son affichage et une pression sur le clavier ?
    Pourquoi un timer ? par ce que tu nous as expliqué que tu voulais des affichages successifs et aléatoires.
    Considérons-nous donc ce sujet comme limité à cette 1ère question, les autres questions faisant ensuite l'objet d'un sujet séparé par question ? Es-tu d'accord ?

    Edit :
    en attendant ta réponse, lis celà :
    http://www.developpez.net/forums/sho...t=gettickcount

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 36
    Par défaut
    Absolument, tout ceci me parait très clair et très réfléchis. je lis et je reviens éditer ce message pour apporter une réponse plus constructive que celle-ci.

  6. #6
    Membre expérimenté Avatar de AdHoc
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 245
    Par défaut
    Pour info,
    l'utilisation du timer pour des intervals de moins de 100 ms devient aléatoire (évidement,cela dépend du code dans le timer et du PC sur lequel s'execute le programme), en gros, le code à exécuter prend plus de temps que l'interval => certains événements ne sont pas vus.

  7. #7
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Attends, Ad Hoc, sois patient... et relis tout...
    Qui te dit que nous allons nous servir du Timer pour mesurer le temps de réaction ? (relis bien...)

  8. #8
    Membre expérimenté Avatar de AdHoc
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 245
    Par défaut
    caramba encore raté

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 36
    Par défaut
    AïeAïeAïe, j'ai fait une manip que mon ordi n'a pas apprécié, je pense

    je vous mets l'avancement de mon travail là dessus:

    Ce nouveau "timer" fonctionne ma foi fort bien tout seul ^^ j'ai préféré commencer par lui puisqu'il me permettra visiblement d'obtenir des résultats plus fins qu'à la miliseconde près.
    Prenant le code présenté, j'ai voulu faire un sorte de simuler un événement de fin. le "timer" dans l'exemple, termine lorsque le délai est écoulé, je voulais qu'il se termine lors d'un événement extérieur correspondant, pour reprendre mon expérience plus haut, au moment ou l'utilisateur appuie sur la touche - mais j'ai bien senti en trafiquant le while que je ne devrais pas :/


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Private Declare Function QueryPerformanceFrequency Lib "Kernel32" _
       (lpFrequency As Currency) As Long
    
    Private Declare Function QueryPerformanceCounter Lib "Kernel32" _
       (lpPerformanceCount As Currency) As Long
       
    Const Intervalle As Double = 0.0001 ' Intervalle, en fraction de seconde
    Const Délai As Long = 5 ' Temps total du test, en secondes
    
    Private Sub Command1_Click()
    
       Dim T1 As Currency, T2 As Currency
       Dim Pas As Currency, Freq As Currency
       Dim Chrono As Single, I As Long
       
       If QueryPerformanceFrequency(Freq) = 0 Then
          MsgBox "Compteur de performance non supporté.", vbInformation
          Exit Sub
       End If
       
       Pas = Freq * Intervalle
       Chrono = Timer
       QueryPerformanceCounter T1
       
       Do While evenementfin = false      'code original : I < Délai / Intervalle
          QueryPerformanceCounter T2
          If T2 - T1 > Pas Then
             ' Intervalle écoulée
             T1 = T2
             I = I + 1
          End If
       Loop
       
       MsgBox "Temps écoulé : " & Timer - Chrono & vbLf & vbLf & "Itérations : " & I
       
    End Sub
    
    private sub command2_click
    fin = true
    end sub
    je suppose qu'il s'agit d'une erreur grossière, et qu'il faudrait que le While continne à un moment la condition de son arrêt, et que donc, je dois me débrouiller pour que la condition "taper touche" se trouve à l'intérieur du while. j'y travaille ^^

  10. #10
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Mais... Carnegie... Je trouve que tu te débrouilles fort bien ! Tu n'es pas si débutant que celà, hein ? (ou alors... et c'est bien possible... très doué. et clair dans tes pensées).
    Je te félicite.

    Une chose avant que je ne sorte (je serai absent pendant 2 heures 30) : où est ta variable booléenne evenementfin ? Où et comment l'as-tu déclarée pour que son état puisse être, après modification par touche du clavier, décelé comme modifié dans ta boucle ?
    Quelle est la procédure utilisée pour modifier l'état de evenementfin ? Quel événement Keypress de quel objet as-tu utilisé ?

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 36
    Par défaut
    désolé pour les imprécisions. ma variable booléenne était déclarée en public et initialisée au chargement de la page à la valeur false.

    je me suis contenté de jouer avec le code que tu m'as utilement montré, donc n'ai pas fait d'événement clavier encore. j'ai juste créé le command2 pour simuler l'événement extérieur. je comptais remplacer ensuite le command2 par un événement keypress, dont je copierais pour exemple le code à la fin de ce post.

    alors en faisant, ce code, je me disais que en clickant sur le bouton 1, cela lancerais le compteur. le while continuerais à tourner, incrémentant ainsi la valeur I, tant que la booléenne "evenement fin" serait à "false". au moment de l'événement clavier taper touche (ici, pour des raisons de test, c'est le command2, mais je voulais par la suite le remplacer) la booléenne se met à "true". A noter que la variable étant publique, je pensais que la booléenne, au moment ou elle se met à true, fermerait alors le while qui continue encore à tourner en fond, à l'itération qui suit juste la transformation de la booléenne.

    (euh. j'ai peut etre trouvé une solution, en utilisant deux booléennes.)

    concernant le code de tape à la touche, j'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_KeyPress(keycode As Integer)
     
    If keycode = 97 Then
      ' enregistrement de la valeur I dans le fichier résultat 
      ' et suite d'instruction diverses utile au programme
    Endif
    End sub
    Taper la touche est donc un événement de la Form

  12. #12
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    juste 2 choses rapides avant de sortir (pour que tu gagnes du temps) :
    1) attention ! dans l'événement click de command2 tu as mis fin et pas evenementfin
    2) pense à mettre à True la propriété Keyprevview de la Form
    3) l'événement Keypress ne relève pas des Keycode mais des Keyascii (c'est l'événement Keydown ou Keyup qui relèvent des Keycode)
    Je t'abandonne pour un peu plus de 2 heures ... A +

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 36
    Par défaut
    Encore merci pour ces réponses et le temps que tu m'accordes, Jmfmarques.

    du nouveau.

    Dans un premier temps, après vérification, keyascii est bien ce que relève keypress, comme tu l'as dit (keyascii est mis par défaut par visual basic). Pourtant, cela marche aussi avec les keycode . pour preuve, j'engage à essayer le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_KeyPress(KeyCode As Integer)
    
    If KeyCode = 97 Then  'si on appuie sur la touche "a" (97 est le code ascii de a)
    label1.Caption = "ça marche quand j'appuie sur 'a'"
    End If
    End Sub
    il semble qu'on puisse utiliser les deux, mais je prendrais pour la suite le keyascii pour ne pas prendre de risques, j'essaierais également de saisir la nuance entre le keycode et le keyasci

    j'ai songé, afin d'ajouter à l'intérieur de la boucle while la cndition d'arrêt, à créer deux variables booléennes : une qui passe en valeur vraie lorsque le 'a' est tapé, l'autre, qui prend la valeur de la première à chaque itération du while. ainsi, la valeur de la booléenne qui sert de condition est explicitement "recalculée" à l'intérieur du while ce qui donne le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Option Explicit
    Public evenementfin As Boolean
    Public tapetouche As Boolean
    
    
    Private Declare Function QueryPerformanceFrequency Lib "Kernel32" _
       (lpFrequency As Currency) As Long
    
    Private Declare Function QueryPerformanceCounter Lib "Kernel32" _
       (lpPerformanceCount As Currency) As Long
       
    Const Intervalle As Double = 0.0001 ' Intervalle, en fraction de seconde
    'Const Délai As Long = 5 ' Temps total du test, en secondes (inutile ici)
    
    Private Sub Form_Load()
    'initialisation des deux booléennes lors du chargement
    tapetouche = False
    evenementfin = False
    End Sub
    
    Private Sub Command1_Click()
    
      Dim T1 As Currency, T2 As Currency
      Dim Pas As Currency, Freq As Currency
      Dim Chrono As Single, I As Long
       
      If QueryPerformanceFrequency(Freq) = 0 Then
        MsgBox "Compteur de performance non supporté.", vbInformation
        Exit Sub
      End If
       
      Pas = Freq * Intervalle
      Chrono = Timer
      QueryPerformanceCounter T1
       
      Do While evenementfin = False      'code original : I < Délai / Intervalle
        QueryPerformanceCounter T2
        evenementfin = tapetouche ' ici la valeur qui sert de condition est "comparée" 
                                 ' à la valeur publique tapetouche à chaque itération : 
                                 ' elle devient true si tapetouche = true
        If T2 - T1 > Pas Then
          ' Intervalle écoulée
          T1 = T2
          I = I + 1
        End If
      Loop
       
      MsgBox "Temps écoulé : " & Timer - Chrono & vbLf & vbLf & "Itérations : " & I
       
    End Sub
    
    
    Private Sub Form_KeyPress(Keyascii As Integer)
    
    If Keyascii = 97 Then
       tapetouche = True
    End If
    End Sub

    en théorie, cela devrait fonctionner. hélas.... on dirait que ce timer est un rien gourmand et pompe le processeur à lui tout seul oO (mon pc se bloque complètement, pas possible d'arrêter le timer, ni de faire quoi que ce soit en fait, à part invoquer le dominateur Alt+Ctrl+Suppr). mais c'est l'explication que je trouve parce que je n'en aie pas encore trouvé d'autres :/. je suppose que ma boucle ne s'arrête pas. peut être est-ce le while en lui même qui pose problème. j'y réfléchis davantage, mais j'atteins mes limites, je crois :'(

  14. #14
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Me revoilà ..
    Alors : pas de tapetouche inutile.
    Ton mécanisme ne peut pas marcher sur un form_keypress alors que ton curseur est encore sur le contrôle command1...
    Regardes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Option Explicit
    Private evenementfin As Boolean
     
    Private Declare Function QueryPerformanceFrequency Lib "Kernel32" _
       (lpFrequency As Currency) As Long
     
    Private Declare Function QueryPerformanceCounter Lib "Kernel32" _
       (lpPerformanceCount As Currency) As Long
     
    Const Intervalle As Double = 0.0001 ' Intervalle, en fraction de seconde
    'Const Délai As Long = 5 ' Temps total du test, en secondes (inutile ici)
     
    Private Sub Form_Load()
    'initialisation des deux booléennes lors du chargement
    evenementfin = False
    Me.KeyPreview = True
    End Sub
     
    Private Sub Command1_Click()
     
      Dim T1 As Currency, T2 As Currency
      Dim Pas As Currency, Freq As Currency
      Dim Chrono As Single, I As Long
     
      If QueryPerformanceFrequency(Freq) = 0 Then
        MsgBox "Compteur de performance non supporté.", vbInformation
        Exit Sub
      End If
     
      Pas = Freq * Intervalle
      Chrono = Timer
      QueryPerformanceCounter T1
      Command1.Enabled = False
      Do While Not evenementfin      'code original : I < Délai / Intervalle
        QueryPerformanceCounter T2
        If T2 - T1 > Pas Then
          ' Intervalle écoulée
          T1 = T2
          I = I + 1
        End If
        DoEvents
      Loop
       Command1.Enabled = True
      MsgBox "Temps écoulé : " & Timer - Chrono & vbLf & vbLf & "Itérations : " & I
     
    End Sub
     
     
    Private Sub Form_KeyPress(Keyascii As Integer)
    If Keyascii = 97 Then
       evenementfin = True
    End If
    End Sub
    Je lui force tout simplement la main (sans violence )
    Quand tu auras essayé et vu : reviens car je dois te dire certaines choses importantes pour la suite

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 36
    Par défaut
    Stupide carnégie ^^. ok, je suis bluffé. Je remercie vivement.

    une question, que j'avais reporté à plus tard, me taraude maintenant que tu as réglé le problème qui n'en était visiblement un que pour moi ^^. le nombre d'itération est en fait différent, lors d'essais, du temps réel affiché. je suis encore confus quant aux termes chrono, timer et iteration. Grand merci, pour tout ceci, c'est-à-dire, j'ai vraiment essayer de trouver solutions :/ mais en tant qu'étudiant psy, je n'ai pu avoir accès qu'à une option informatique en première année et j'arrête de raconter ma vie, ok.

  16. #16
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Attends attends (jamais de précipitation ...!)
    Tu peux enlever ta variable chrono (elle ne te sert à rien ici !)

    Avant de parler d'autres choses :
    1) il ne me parait pas astucieux d'utiliser le Keypress sur la Form...
    Tu risques, en ajoutant d'autres contrôles, de voir le curseur aller se "promener" sur l'un d'entre eux et ainsi de tout compromettre !
    Je préfèrerais de loin une TextBox sur laquelle tu forces le focus avant d'entrer dans la boucle
    Text1.setfocus
    et utiliser alors l'évènement keypress de cette textbox plutôt que celui de la Form (ou mieux : également, en plus)
    2) Le patient doit-il frapper sur la lettre A spécifiquement ou sur n'importe quelle touche... ou encore : frapper sur une touche correspondant à un affichage (cela me parait important d'en parler maintenant si l'on veut éviter la construction, par la suite, d'une usine à gaz)
    tu dis...

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 36
    Par défaut
    De fait, le programme tourne déjà. mal, mais il est disponible, si une vision directe de ce qu'il fait peut etre utile, je peux l'envoyer, ou alors afficher son code ici, mais il est long :/ il me semble utile de préciser son fonctionnement global, peut etre

    je n'ai pas trop de temps ce soir, mais dès demain, je donne une description générale de ce que j'aimerais faire

    edit : merci pour le 1/, à postériori, ça paraît effectivement plus avisé. pour le 2/ le A si un symbole se trouve dans la partie gauche de l'image, le P s'il se trouve à doite

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 36
    Par défaut
    Bonjour à tous. je vous fais part du fonctionnement global du programme, comme je l'avais annoncé.

    S'il m'est permis d'afficher des liens, je peux donner les liens de téléchargement des sources ou des exécutables. éventuellement, si des personnes veulent en savoir davantage sur l'expérience proprement dite, je peux leur donner le lien de mon site, en construction, mais quelques informations sont déjà disponibles.


    du point de vue de l'utilisateur : le programme démarre, l'ensemble de l'écran devient blanc et un bouton "commencer" permet de commencer le test. Lorsqu'il appuie sur le bouton, celui-ci s'efface ; un inputbox lui permet de donner son pseudo, puis une consigne verbale est donnée dans le label. à chaque phrase, l'utilisateur appuie sur un second bouton "ok" pour signifier qu'il a bien compris (c'est nécessaire, en psycho :/ ). l'expérience démarre ensuite :
    1/au milieu de l'écran s'affiche une étoile* au bout de 100 ms et pendant 200 ms, après quoi, la première image est chargée. l'utilisateur répond en appuyant sur une des deux touches, l'image s'efface ors de l'appui et 'on revient au début de 1/, ceci, pour toutes les images présentes.
    2/ le test est terminé, la text box devient visible ainsi qu'un bouton "terminer" l'utilisateur inscrit ces remarques dans la textbox puis termine le programme.

    du point de vue du programme
    le programme débute en chargeant 43 images se trouvant dans un dossier connexe à l'application. la feuille contient 4 boutons de commande, un label et un picture pour afficher les images, ainsi qu'une zone de texte. le programme attend l'événement cmdclick pour afficher une input box. recueille le pseudo et la date system pour creer un fichier texte au nom "pseudo_heure_date.txt".
    il affiche ensuite la consigne et attend l'accord de l'utilisateur avant de passer à l'expérience.

    lorsque la dernière consigne est affichée, un délai de 10 secondes est donné à l'utilisateur afin que celui-ci positionne un doigt de la main droite au dessus de la touche "p", et un doigt de la main gauche au dessus de la touche "a". l'étoile s'affiche, puis l'image. au moment de l'affichage de l'image, les touches a et p deviennent réactives, dès que l'une est appuyée, elle retournent à un état inactif. selon la touche, le résultat "droite" ou "gauche" suivi du numéro de l'image et du temps de réaction (le temp entre l'affichage de l'image et la pression d'une des deux touches) est inscrit dans le fichier résultat. un petit délai d'attente, puis l'étoile s'affiche à nouveau pendant 200 milisecondes, puis l'image, ainsi de suite.

    lorsque l'ensemble des images est passé seul la texte box et le bouton "terminer" deviennent visible le rest disparaît. l'utilisateur inscrit ses remarques éventuelles, qui sont copiées dans le fichier résultat lorsqu'il appuie sur le bouton "terminer". en théorie (en pratique, je n y arrive pas encore) le fichier texte devrait m'être adressé en email et effacé selon le désir de l'utilisateur, sur son ordinateur.

    (pour information : les temps de réaction des vrais synesthètes à cette expérience sont très courts en rapport avec ceux de personnes normales, cette expériences sert à repérer les "vrais" synesthètes)

    j'espère que je n'en ai pas encore trop mis :/ c'est ma mauvaise habitude. Cela devrait donner une bonne idée du fonctionnement du programme

    en aparté : le problème de random que j'avais exposé dans le premier post s'est posé dans une seconde expérience, mais de fait, il serait bon également dans celle-ci que je puisse charger les images aléatoirement au fur et à mesure de l'expérience, sans qu'une seule ne soit affichée deux fois au cours de l'expérience.

    Bon bah je me mets au boulot ^^

  19. #19
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Bonjour,
    Quels sont les points déjà réalisés avec succès ?
    Afin que l'on passe directement à l'étape utile maintenant .

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 36
    Par défaut
    Pratiquement tout point. je n'ai pas eu le temps d'insérer le nouveau timer hier, donc, me reste à voir si je peux gérer ça correctement - je peux peut être mettre ce topic en sommeil pendant quelques temps et le déterrer une fois que mon travail aura bien avancé.
    l'envoi d'email me pose problème, je suis en train de travailler à d'autres fonctionnements (je cherche si je ne pourrais pas envoyer sur mon serveur directement le fichier résultat) à défaut. bref seulement un moyen de récupérer les résultats sans qu'ils puissent être modifiés (je regarde aussi du coté de l'encryption ou d'un encodage relativement simple mais incompréhensible pour quelqu'un qui lirait le fichier. ceci dit, je serais plus à l'aise si les utilisateurs conservaient l'accès aux résultats, histoire de vérifier qu'il n y a rien de louche dans les informations que je leur soutire)

    le problème de random est aussi en attente, mais là aussi, j'ai une piste, je pense que l'utilisation de tableaux dynamiques pourrait m'aider ; d'après ce que j'ai pu en deviner, je pourrais coller les 43 premiers chiffres dans un tableau, puis les sortir un par un en effaçant du tableau celui que je viens de sortir, de manière à ce qu'il ne soit pas choisit aléatoirement de nouveau.

    (rapide ce, Jmfmarques, même pas eu le temps de vérifier tous les sujets ^^ pour voir si je pouvais répondre à certains :/ ). je peux mettre en attente et travailler dessus seul ce matin. ça me permettrait de ne pas attendre bêtement que la solution me tombe du Jmf

Discussions similaires

  1. Evenement asynchrone VB6 (Timer)
    Par laurent1 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/07/2006, 19h27
  2. [VB6] Timer et Form ......
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 27/04/2006, 18h37
  3. [VB6] Timer et Groupe indexé
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 27/04/2006, 15h48
  4. [VB6][fichier texte]limite des 32 ko
    Par hawk14 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 20/02/2006, 23h45
  5. [VB6] timer plus rapide que 1 d'interval
    Par windob dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 24/02/2004, 00h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo