Bonjour,
Je viens chercher un peu d'aide, car je ne trouve pas de solution à mon problème. J'espère que vous pourrez m'aider
Alors voilà, j'utilise du code qui me permet de récupérer un fichier (openfiledialog), et ensuite je copie ce dernier vers une destination. Le fichier peut faire quelques Ko comme quelques Go. Donc, pendant cette copie, l'appli se freeze, normal.
Le problème se trouve au niveau d'un form que je souhaite afficher, avec une animation, le temps que le fichier se copie.
Cependant, je ne trouve pas de solution car un backgroundworker s'exécute et se stop, et je n'ai pas trouvé de moyen pour lui dire d'attendre que la copie soit terminée. J'ai cherché sur internet, et j'ai trouvé sur msdn un bout de code permettant de créer un thread séparé, mais là, c'est la galère car je ne sais pas m'en servir, et je ne trouve pas d'explications
J'ai du coup essayé de mettre mon code de copie de fichier dans le backgroundworker, au lieu d'y mettre le form pour patienter ... et là, c'est le drame également car j'ai des erreurs lorsque je tente d'accéder à des textbox ou autre de mon thread principal, et idem, j'ai beau chercher, je ne parviens pas à les résoudre. Une histoire de SingleThreadApartment, un truc du genre ...
Bref voici le code actuel :
Voilà le code complet du bouton, avec la copie de fichier intégrée. Donc dans l'état le form "Patienter" s'affiche mais freeze également, et donc impossible d'y mettre une animation (même thread que la procédure de copie).
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72 Private Sub pic_add_MouseUp(sender As Object, e As MouseEventArgs) Handles pic_add.MouseUp 'Lorsque l'on relâche le clic sur le bouton pic_add.Image = My.Resources.Add_norm My.Computer.Audio.Play(My.Resources.sound_clic, AudioPlayMode.Background) 'On ouvre la openfiles dialogbox si une console est sélectionnée If cmb_console.SelectedIndex <> -1 Then Using _ofd As New OpenFileDialog With _ofd .CheckFileExists = True .CheckPathExists = True .InitialDirectory = "C:\" .Multiselect = True .RestoreDirectory = True If cmb_console.SelectedIndex = 0 Then .DefaultExt = ".a78" .Filter = "Fichier Rom ATARI 7800 (*.a78)|*.a78" .Title = "Ajouter une Rom pour ATARI 7800" cheminconsole = chemin + "\ROMS\ATARI7800\" (...) End If If .ShowDialog() = DialogResult.OK Then 'On affiche la fenêtre patienter Patienter.Show() 'On lit les fichiers Dim fichier As String For Each fichier In .FileNames 'On ajoute les fichiers au répertoire de roms de la console choisie Try File.Copy(fichier, cheminconsole & System.IO.Path.GetFileName(fichier), True) lst_roms.Items.Clear() Dim files = My.Computer.FileSystem.GetFiles(cheminconsole, FileIO.SearchOption.SearchAllSubDirectories, "*.*") For Each rom As String In files resultat = IO.Path.GetFileName(rom) lst_roms.Items.Add(resultat) Next Catch ex As Exception ' On gère un éventuel problème MessageBox.Show("Une erreur est survenue lors de l'ajout. Le message est :" & vbCrLf & vbCrLf & ex.Message) End Try Next fichier End If End With End Using Patienter.Close() ElseIf cmb_console.SelectedIndex = -1 Then MsgBox("Veuillez d'abord sélectionner une console.", vbOKOnly + vbExclamation, "Ajouter un fichier rom") End If End Sub
Donc l'objectif, pour être clair : réussir à trouver un moyen pour que la copie du fichier sélectionné se fasse en arrière-plan, pendant que le form "Patienter" s'affiche avec une animation, et que ce dernier se ferme bien dès la fin de la copie du fichier
Merci d'avance pour ceux qui se pencheront sur ce problème !
--
Shennong
Partager