Bonjour à tous !
La question parait simple mais la solution ne l'est pas !
Le problème :
Depuis le programme en VB démarrer un Task asynchrone (le Task est un .exe tiers)
puis le programme VB reviens à la ligne suivante qu'il exécute. Situation normal mais à ce niveau il faut créer un stand-by à l'exécution du code ci-dessous ! Et je ne trouve pas la solution !
A la question : Pourquoi lancer un thread asynchrone et vouloir attendre la fin du thread ? Ma réponse :
1/ Faire autre chose pendant l'exécution qui dure de 1s à plusieurs jours...
2/ Pouvoir arrêter le Task3 avec un bouton sur le form ou ToolStrip. Et donc ce bouton doit pouvoir être opérationel.
Divers solutions essayées sans trouver la solutions :
3/ Mettre un thread.sleep n’est pas la solution, car l’exécution suivant le cas peut prendre une seconde jusqu’à 3 jours avec un processeur I 9900!
4/ Mettre une boucle (do loop ou while wend) ne me permet plus d'arrêter le thread avec STOP le bouton n'est plus opérationel !
5/ Mettre un MsgBox ne va pas non plus car MsgBox est modale !
6/ Le programme ci-dessous en test. Le call FinModuleResolution() ci-dessous s’exécute sans attendre la fin de Task3 et rend la main sans les résultats escomptés. Si j’enlève le Call FinModuleResolution() ci-dessous je n’ai pas l’affichage des solutions trouvées !
Le but final de l’opération est d'utiliser FinModuleResolution() une fois que Task3 à donné ses résultats sur un fichier .txt puis l'afficher (donc Task3 à fini )
Le programme qui pose problème :
Sur le form il y a deux boutons un qu'on appel Résoudre et l'autre Stop
Il faut donc un point d’attente qui n’empêche pas de faire autre chose dans le programme ni d’arrêter le Task3 avec la touche STOP. Une fois le Task3 fini ce point d’attente est supprimé et le programme continu avec la lecture de FinModuleResolution()
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 Public Async Sub Resoudre_Click(sender As Object, e As EventArgs) Handles Solve.Click Try 'Lit les datas servi à Task 3 dans le fichier .txt Dim monStreamReader4 As New StreamReader(Disk + "\datainput.txt") Do Until monStreamReader4.Peek = -1 'si = -1 => jusqu'à la dernière ligne du fichier LecturemonStreamReader3 = monStreamReader4.ReadLine() + vbNewLine EnoncePopeyeBrut += LecturemonStreamReader3 Loop monStreamReader4.Close() Thread.Sleep(150) 'résoud le problème ici, appel function task3() : Call New List(Of Task)().Add(Task.Run(AddressOf Task3)) Await Task.WhenAll(New List(Of Task)()) Thread.Sleep(150) 'attend la fin de Task3 Call New List(Of Task)().Add(Task.Run(AddressOf Task4)) Await Task.WhenAll(New List(Of Task)()) Thread.Sleep(150) !!!!!! Il faut créer ici une instruction d'attente non modale vérifiant si buton stop est appuyé qui arrête Task3. !!!!!!! Call FinModuleResolutionPopeye() Catch ex As Exception End Try End Sub Public Sub StopSolving_Click(sender As Object, e As EventArgs) Handles StopSolving.Click 'Stop solving button in toolstrip head line. This sub work with the Sub StopSolving_MouseEnter ! Try Dim qqq As Process = Process.GetProcessById(LeProcess1) qqq.Kill() Stop_solving.Visible = False Catch ex As Exception End Try End Sub Private Async Function Task3() As Task 'démarre pywin64.exe Using myProcess1 As New Process Try myProcess1.StartInfo.Arguments = vbNormalFocus myProcess1.StartInfo.FileName = Disk + "\pywin64.exe" myProcess1.StartInfo.Arguments = Disk + "\datainp.txt" 'démarre l'exe LeProcess1 = Process.Start(myProcess1.StartInfo).Id Thread.Sleep(300) Catch ex As Exception MessageBox.Show(ex.Message & "Stack Trace: " & vbCrLf & ex.StackTrace) End Try End Using Await Task.WhenAll()
Comment mettre un point d’attente? Point d’attente qui ne doit pas être 'modale' comme un MsgBox !
Il semble d'après la littérature que cela peut se faire en lançant le thread 3 et 4 et le thread 4 attends que thread 3 finisse mais je n'arrive pas à le mettre en pratique dans mon exemple ! Le lien : https://stackoverflow.com/questions/...ting-next-step
Si vous avez une idée?
Partager