Bonjour à tous,
J'ai un petit souci lors d'un portage d'un code VB6 vers VB.net
Mon logiciel commence à bien tourner, mais j'ai des gros ralentissement, surtout remarqué lorsque j'essaye de déplacer le formulaire. Je le déplace puis il s’arrête avant de repartir.
Le blocage se fait lorsque le soft rafraîchi les informations que j'ai sur le formulaire.
Pas facile à expliquer mais je vais essayer:
Mon logiciel est composer d'un Parent MDI et son menu puis plusieurs enfant possible (Pas afficher en même temps)
Un timer sur le MDI Parent enclenche la mise à jour de ces menus et du formulaire qui est ouvert, par une interface. l’interface comporte une activation, une désactivation et un tick pour la mise à jour
A chaque fois j'ai plusieurs 10ene d’élément à mettre à jour (des mesures qui peuvent évoluées, récupérées par une lecture du port COM sur notre supervision)
Lors du rafraîchissement j'ai donc un blocage de l'IHM pendant 1 a 2 secondes.
J'ai essayé de passer par un autre timer, qui n'est pas lier au formulaire (System.Threading.Timer).
Mais bien-sûr ensuite j'ai des erreurs de manipulation interthread des objets graphique.
Je connais le principe d'invoke et delegate, mais je ne l'ai appliqué que sur des petits projets ou je ne m’était à jour qu'un ou 2 objets, faire un invoque sur chaque objet à mettre à jour me semble pas vraiment optimisé.
J'ai essayé d'appliquer cela directement à ce qu'il y avait dans le tick de mon ancien timer, cela fonctionne puis j'ai de nouveau le crash interthread après quelque secondes.
Code d'origine:
Code que j'ai essayé et qui fonctionne partiellement.
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 'Dans MDIParent Private Sub timerView_Tick(sender As System.Object, e As System.EventArgs) Handles timerView.Tick if Connected then menu1.enabled = true menu2.enabled = true else menu1.enabled = false menu2.enabled = false end if Moninterface_active.tick() etc... End sub -------------------------------------------- 'Dans Interface de la form enfant: Public sub tick() Form1.textbox1.text = ma_mesure1 Form1.textbox2.text = ma_mesure2 Form1.textbox3.text = ma_mesure3 etc... End sub
Le plantage n’apparaît jamais sur le même Objet.
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 Private WithEvents TimerWiew As System.Threading.Timer Private Delegate Sub TickMeView() Private Sub MDIForm_Load() TimerWiew = New System.Threading.Timer(AddressOf TimerViewMeTo, Nothing, 1000, 250) En sub Private Sub TimerViewMeTo(ByVal state As Object) Dim tickm As New TickMeView(AddressOf updateView) tickm.Invoke() End Sub Public Sub updateView() if Conneted then menu1.enabled = true menu2.enabled = true else menu1.enabled = false menu2.enabled = false end if Moninterface_active.tick() 'etc... End Sub
Pour obtenir les mesures et informations, je passe par plusieurs classe et boucle sur des collections qui me ralentissent pas mal, faut que j’optimise sa aussi.
Merci de votre aide.
Partager