Méthode utilisées par 2 Threads
Bonsoir a tous,
Je commence a peine a me lancer dans le multithread et je rencontre un problème d’accès a une méthode a partir de plusieurs Threads, je m'explique :
Actuellement j'utilise une méthode pour Désactiver des événements le temps de faire de gros traitements sur des DataTable, puis pour réactiver ces événements dés que les traitements sont terminés. cette méthode est appelée ponctuellement a divers endroit de mon code mais toujours depuis le Thread principale (Thread A) ce qui ne pose aucun problème.
Aujourd'hui j'ai besoin de faire la même action mais depuis un Thread secondaire (Thread B) seulement les Threads risquent de se faire concurrences aux niveaux des Activation/Désactivation. Il faudrait que si Thread A désactive les Events, alors Thread B n'a pas le droit les réactiver tant que Thread A n'a pas terminé et réactivé ces Events, (il doit attendre sont tour). Idem depuis Thread B. (Le fonctionnement normal de l'application veux que ces événements soit toujours activés en temps normal). Je ne sais pas du tout comment faire cela.
Cela donne un truc du style :
Code:
1 2 3
| ActiveControlesHandler(False)
' ici on lance des opérations sur un DataTable
ActiveControlesHandler(True) |
Le code pour Désactiver/Activer les évenements :
Code:
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
| Dim ControleHanddlerIsActive As Boolean
Public Sub ActiveControlesHandler(ByVal State As Boolean)
If State = True And ControleHanddlerIsActive = False Then
AddHandler DataGridView1.CurrentCellDirtyStateChanged, AddressOf EventCurrentCellDirtyChanged
AddHandler MainBindingSourcePaths.CurrentItemChanged, AddressOf EventbsCurrentItemChanged
AddHandler MainBindingSourcePaths.CurrentChanged, AddressOf EventbsCurrentChanged
AddHandler MainBindingSourcePaths.PositionChanged, AddressOf EventbsPositionChanged
AddHandler dtTablePaths.ColumnChanging, AddressOf EventTableColumnChanging
AddHandler dtTablePaths.ColumnChanged, AddressOf EventTableColumnChanged
AddHandler dtTablePaths.TableNewRow, AddressOf EventTableNewRow
ControleHanddlerIsActive = True
ElseIf State = False And ControleHanddlerIsActive = True Then
RemoveHandler DataGridView1.CurrentCellDirtyStateChanged, AddressOf EventCurrentCellDirtyChanged
RemoveHandler MainBindingSourcePaths.CurrentItemChanged, AddressOf EventbsCurrentItemChanged
RemoveHandler MainBindingSourcePaths.CurrentChanged, AddressOf EventbsCurrentChanged
RemoveHandler MainBindingSourcePaths.PositionChanged, AddressOf EventbsPositionChanged
RemoveHandler dtTablePaths.ColumnChanging, AddressOf EventTableColumnChanging
RemoveHandler dtTablePaths.ColumnChanged, AddressOf EventTableColumnChanged
RemoveHandler dtTablePaths.TableNewRow, AddressOf EventTableNewRow
ControleHanddlerIsActive = False
End If
End Sub |
Je vous remercie beaucoup pour votre aide.