Console.ReadLine : durée limitée

Résolu
Maelhia Messages postés 21 Date d'inscription vendredi 25 mars 2022 Statut Membre Dernière intervention 15 février 2023 - Modifié le 30 août 2022 à 11:34
Whismeril Messages postés 19102 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 25 juillet 2024 - 31 août 2022 à 08:24

Bonjour,

J'ai fais un peu le tour d'internet et je ne trouve pas vraiment de solution me satisfaisant alors je viens vers vous. 

Mon problème est simple : je créé une application console en VB via Visual Studio. 

L'utilisateur doit saisir du texte via la console. J'aimerais que si l'utilisateur n'a toujours rien écrit au bout de 5 secondes, la suite de mon code s'exécute normalement. 

Hors, pour l'instant le programme attend jusqu'à ce que l'utilisateur est appuyé sur "entrée" pour exécuter la suite du code. 

Voici ce que j'ai fais pour le moment avec, en commentaires, ce que j'aimerai ajouter. 

Dim trame as string 


trame = Console.ReadLine() 
'on compte 5 sec et au bout des 5 secondes on passe à la suite 

MsgBox(trame)

Je ne souhaite pas obligatoirement passer par Console.ReadLine(), l'objectif est d'attendre pendant 5 secondes que l'utilisateur ait saisi une phrase. Si l'utilisateur n'appuie sur aucune touche, à la fin des 5 secondes le code continue de s'exécuter. 

Merci d'avance pour vos réponses

3 réponses

Whismeril Messages postés 19102 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 25 juillet 2024 661
30 août 2022 à 12:12

Bonjour

Afin d'apprendre, il faut notamment savoir faire des recherches, sur internet, et pour cibler correctement ses recherches, il faut savoir dans quel langage on code.

application console en VB via Visual Studio

Donc, tu codes, en VB.Net, pas en VB Script. Et c'est important, car ces 2 langages sont très différents.

D'ailleurs, y'a pas de mode console en VB Script. Je vais donc déplacer ta question dans le bon forum


VBScript est proche de VB6 et VBA, donc des solutions trouvées dans ses 1 de ses 3 langages est souvent réutilisable dans un autre.


VB.Net, contrairement à ce que son nom laisse croire, ce n'est pas du VB, c'est du C# déguisé en VB.

Du coup, afin de bien coder en VB.Net, la première chose à faire est de supprimer la référence à Visual Basic et d'activer Option Strict et Option Explicit comme décrit à la fin de ce tutoriel https://codes-sources.commentcamarche.net/faq/11151-pourquoi-mon-code-vb6-vba-ne-marche-pas-en-vb-net#conclusion

Et tu verras que MsgBox sera souligné en rouge, car ce n'est pas du .Net, mais du VB6.

Concernant ta question à proprement, c'est assez compliqué pour un débutant, parce que ReadLine est une méthode bloquante, c'est-à-dire que le thread qui va poser la question est arrêté jusqu'à ce qu'il y ait une réponse.

Il faut utiliser 2 threads (en plus du thread principal), un qui pose la question et attends indéfiniment une réponse et l'autre qui tue le premier au bout de 5 secondes.

Et le multithreading, ce n'est pas à la portée d'un débutant.

Du coup, je ne sais pas si ça t'es déjà accessible ou pas.


1
Maelhia Messages postés 21 Date d'inscription vendredi 25 mars 2022 Statut Membre Dernière intervention 15 février 2023 1
30 août 2022 à 14:45

Salut ! Merci pour ta réponse 

Je ne sais pas pourquoi j'ai mis mon sujet dans VB.Script... Une erreur d'inattention surement ^^' Désolée et merci de l'avoir replacé dans le bon topic. 

Je me suis renseignée un peu sur les threads et j'ai réussi à faire ce que je voulais, ce n'est probablement pas la solution la plus "propre" mais ça le mérite de fonctionner. 

Merci pour ton aide et bonne continuations

0
Maelhia Messages postés 21 Date d'inscription vendredi 25 mars 2022 Statut Membre Dernière intervention 15 février 2023 1
30 août 2022 à 14:53

Voici la solution que j'ai trouvé pour répondre à mon problème, ce n'est peut-être pas très beau, mais ça marche. 

Si vous avez des conseils / améliorations à proposer n'hésitez pas :) 

Public ThreadLecture As New Threading.Thread(AddressOf Lecture)
Public trame As String

Sub Main()

  Dim path As String = "C:\Text.txt"
    
  ThreadLecture.Start() ' on lance la lecture
  ThreadLecture.Join(5000) 'on exécute la lecture pendant 5 secondes
  ThreadLecture.Abort() 'on arrête le thread 

  If trame <> Nothing Then ' si l'utilisateur a écrit quelque chose durant les 5 secondes on l'enregistre dans un fichier texte


    ' Add text to the file.
    Dim info As Byte() = New UTF8Encoding(True).GetBytes(Now() & ErrorToString())
    My.Computer.FileSystem.WriteAllText(path, trame, True)

  Else 'sinon on quitte le programme

     Environment.Exit(0)'on arrête tout le programme et ces threads

  End If

End Sub

Sub Lecture()

  trame = Console.ReadLine()

End Sub
1
NHenry Messages postés 15144 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 24 juillet 2024 159
Modifié le 31 août 2022 à 08:25

Juste, le

 
Environment.Exit(0)

Est inutile, car le fait de sortir de la fonction Main fait quitter le programme (si aucun thread n'est en cours, ce qui est le cas ici).

0
Whismeril Messages postés 19102 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 25 juillet 2024 661 > NHenry Messages postés 15144 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 24 juillet 2024
31 août 2022 à 08:24

Hello,

en effet, j'ai raté ça ;).

PS pour la,coloration, il faut choisir Basic, VBScript ne marche pas.

0
Whismeril Messages postés 19102 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 25 juillet 2024 661
30 août 2022 à 15:08

ce n'est probablement pas la solution la plus "propre" mais ça le mérite de fonctionner. 

Au contraire, c'est plutôt bien.

Quand je t'ai répondu, je n'ai pas pensé au timeOut de la méthode Join, c'est exactement ce qu'il te fallait.

Par contre, à tester, mais le timeOut doit générer un Abort, donc refaire Abort derrière me paraît inutile.

Il y a un moment que je n'ai plus utilisé les "thread de bases", je me sers des pool de thread à la place.

Il y a une excellente suite de tuto qui là https://fdorin.developpez.com/tutoriels/csharp/threadpool/part1/ sur le sujet


0
Rejoignez-nous