Bonjour à tous,
Pour mettre à jour des cours, mon programme lit des pages web pour en extraire les données qui m’intéressent, puis faire la mise à jour d’une base historique des cotations. L’inconvénient de ma solution utilisant un WebBrowser est le blocage de l’interface Form pendant toute la durée de l’opération. J’aurai aimé que celle-ci se fasse en background sans déranger l’utilisateur .
J’ai donc réalisé une sub serveur dans le programme principal, quatre thread clients communiquant par pipes avec ce serveur, pour obtenir les références des données à chercher, puis demander les pages correspondantes et enfin renvoyer les données téléchargées.
Je pensais ainsi résoudre ce blocage de l’interface utilisateur ! et bien NON
Existe il une solution pour que l’asynchronisme des processus client et serveur garantisse le non blocage de l’interface ?
La consommation cpu est inférieure à 5%, merci de vos conseils.
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 la fonction serveur : Dim pipeServer_1 As New NamedPipeServerStream("pipe_isin_url_1", PipeDirection.Out, 4, PipeTransmissionMode.Byte, PipeOptions.Asynchronous) premier_thread() pipeServer_1.WaitForConnection() Dim ecrire_pipe_1 As New StreamWriter(pipeServer_1) ecrire_pipe_1.WriteLine(isin_titre(index_titre) + url_0_titre(index_titre)) ecrire_pipe_1.Close() la définition du thread : Public Sub New(ByVal index_thread As Integer) thread_index = index_thread End Sub Private Sub premier_thread() Dim extraire_1 As New clsThread(1) Dim lire_un_cours As New Thread(AddressOf extraire_1.cotation) lire_un_cours.IsBackground = True lire_un_cours.Start() End Sub la classe client cotation, Public Sub cotation() Dim web_serveur As New System.Net.WebClient(), codeHTML As String, From_code As encoding Dim pipeClient As New NamedPipeClientStream(".", "pipe_isin_url_" + thread_index.ToString, PipeDirection.In, PipeOptions.Asynchronous) pipeClient.Connect() Dim lire_pipe As New StreamReader(pipeClient) url_demande = lire_pipe.ReadLine() Dim page_html As New StreamReader(web_serveur.OpenRead(url_demande), From_code) codeHTML = page_html.ReadToEnd() End Sub
Partager