Application qui se bloque avec System.IO.File

Signaler
Messages postés
51
Date d'inscription
mercredi 6 janvier 2021
Statut
Membre
Dernière intervention
9 août 2021
-
Messages postés
51
Date d'inscription
mercredi 6 janvier 2021
Statut
Membre
Dernière intervention
9 août 2021
-
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

Messages postés
16278
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
17 septembre 2021
562
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
Messages postés
51
Date d'inscription
mercredi 6 janvier 2021
Statut
Membre
Dernière intervention
9 août 2021

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

Messages postés
51
Date d'inscription
mercredi 6 janvier 2021
Statut
Membre
Dernière intervention
9 août 2021

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.
Messages postés
16278
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
17 septembre 2021
562
A priori en vb (je code en c#…) c’est
Task.Run(AddressOf NomDeLaMéthodeAExécuterDansLeThread) 

Messages postés
51
Date d'inscription
mercredi 6 janvier 2021
Statut
Membre
Dernière intervention
9 août 2021

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.
Messages postés
16278
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
17 septembre 2021
562
Et avec la syntaxe que je t’ai proposée?
Messages postés
51
Date d'inscription
mercredi 6 janvier 2021
Statut
Membre
Dernière intervention
9 août 2021

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)