Application qui se bloque avec System.IO.File

Tempus01 Messages postés 81 Date d'inscription mercredi 6 janvier 2021 Statut Membre Dernière intervention 27 septembre 2022 - 8 août 2021 à 15:08
Tempus01 Messages postés 81 Date d'inscription mercredi 6 janvier 2021 Statut Membre Dernière intervention 27 septembre 2022 - 9 août 2021 à 16:09
Bonjour le Forum,

Avec le code ci dessous l'utilisateur peut sauvegarder un fichier PDF, je souhaiterais faire apparaitre le formulaire Wait2 "Gif please Wait" pendant les quelques secondes que l'application à besoin pour réaliser cette opération, mais cela ne fonctionne pas car l'application est bloquée pendant la récupération et la création du fichier, et une fois qu'elle se débloque les deux formulaires Wait2 et Message s'affichent en même temps et ceux malgré le Wait2.Close() qui est dans le formulaire Message.


 Destination = FolderBrowserDialog1.SelectedPath.ToString
                               Wait2.Show()
                              If System.IO.File.Exists(Destination & "\" & "essai.pdf") Then
                    Message.Show() ' Un formulaire qui affiche un POPUP "Sauvegarde déjà effectuée" 
 
                                 Else
                    IO.File.Copy(Chemdoss)
                    Message2.Show()' 'Un formulaire qui affiche un POPUP "Sauvegarde ok"
 
                    Process.Start(Destination & "\" & "essai.pdf") 
                End If


Les formulaires Wait2, Message et Message2 sont sous un Timer avec un affichage de 4 secondes.

Le System.Threading.Tasks pourrait être la solution en mettant dans une procédure le code du System.IO.File pour créer un PDF, mais le code m'échappe.

Un petite vidéo "en fr" y fait référence.
https://www.youtube.com/watch?v=77xt-Et_xgY

Merci pour votre aide.

7 réponses

Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
8 août 2021 à 15:51
Bonjour

99,99999% des tutos vidéo pour la programmation sont entre nuls et archi nuls.
Je ne vais donc pas perdre de temps à regarder le tien.

Si un thread est encore trop compliqué pour toi, tu peux utiliser un backgroundworker.
Un exemple ici https://codes-sources.commentcamarche.net/forum/affich-10102660-thread-et-maj-de-control-dans-un-form#5
0
Tempus01 Messages postés 81 Date d'inscription mercredi 6 janvier 2021 Statut Membre Dernière intervention 27 septembre 2022 2
Modifié le 8 août 2021 à 17:57
Bonjour Whismeril,

Merci pour l'info du backgroundworker c'est intéressant et similaire à Tasks.

J'ai un peu avancer avec Task, maintenant le form n'est plus bloquée, et les formulaires Wait2 ou Message s'affichent bien, seulement il sont blanc sans rien dedans.

Voici le code que j'utilise.

Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        Dim context As TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext()
        Task.Run(Sub() Copier(context))
    End Sub

 Private Sub Copier(context As TaskScheduler)
 Destination = FolderBrowserDialog1.SelectedPath.ToString
                               Wait2.Show()
                              If System.IO.File.Exists(Destination & "\" & "essai.pdf") Then
                    Message.Show() ' Un formulaire qui affiche un POPUP "Sauvegarde déjà effectuée" 
 
                                 Else
                    IO.File.Copy(Chemdoss)
                    Message2.Show()' 'Un formulaire qui affiche un POPUP "Sauvegarde ok"
 
                    Process.Start(Destination & "\" & "essai.pdf") 
                End If

End Sub

0
Tempus01 Messages postés 81 Date d'inscription mercredi 6 janvier 2021 Statut Membre Dernière intervention 27 septembre 2022 2
8 août 2021 à 18:15
Je pense qu'il faut ajouter dans "Private Sub Copier" le code ci dessous.

Task.Factory.StartNew(Sub() ,

Pour le moment je n'arrive pas l'incorporer.
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
8 août 2021 à 20:23
A priori en vb (je code en c#…) c’est
Task.Run(AddressOf NomDeLaMéthodeAExécuterDansLeThread) 

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Tempus01 Messages postés 81 Date d'inscription mercredi 6 janvier 2021 Statut Membre Dernière intervention 27 septembre 2022 2
8 août 2021 à 21:24
Je viens de tester avec Task.Factory.StartNew(Sub() Copier(context), CancellationToken.None, TaskCreationOptions.LongRunning) cela génère une boucle sans fin....
et avec Task.Run(Sub() Copier(context)) je l'utilise sous un bouton mais le form reste vide lorsqu'il s'affiche.

Je continue de chercher.
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
8 août 2021 à 23:15
Et avec la syntaxe que je t’ai proposée?
0
Tempus01 Messages postés 81 Date d'inscription mercredi 6 janvier 2021 Statut Membre Dernière intervention 27 septembre 2022 2
Modifié le 9 août 2021 à 16:10
Bonjour Whismeril,

La syntaxe Task.Run(AddressOf NomDeLaMéthodeAExécuterDansLeThread) pose problème de mon côté, je dois chercher encore pourquoi.

J'ai en parti résolu mon problème, le code ci dessous me permet de lancer un de mes formulaire qui a un accès sur une base ACCESS sans aucun ralentissement, et en ce qui concerne File.Copy ou File.Exists je laisse tomber pour le moment, je suis déjà très content d'avoir le code pour le DATAGRID qui fonctionne, Merci pour vos précieux conseils.
  Task.Run(Sub() Data1(Context))


        Task.Factory.StartNew(Sub() DataGridShow(), CancellationToken.None, TaskCreationOptions.LongRunning, Context)
0
Rejoignez-nous