Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Animation avec Timer le faire dans un Thread separe ?

5 réponses
Avatar
claudetom
Pour l'animation de texte sur un afficheur epson (2 lignes 7 segments),
J'ai réalisé un composant pour faire cela.
L'animation des 2 lignes ce fait grace à 2 timers.
Ca fonctionne bien mais un problème se pose !
En effet quand l'animation est en route cela à pour effet de ralentir les
actions sur la form parent.
Donc ma question est :
Est-il possible de réalisé les animations dans un thread séparé ?
J'ai essayé plein de choses mais rien ne marche.

Merci.

5 réponses

Avatar
Stéphane
Bonjour claudetom,

Je ne répondrai qu'à cette question :

Est-il possible de réalisé les animations dans un thread séparé ?

La réponse oui, c'est possible.

Comment, je ne sais pas.
En effet, j'ai déjà essayé de me pencher sur 1 thread pour faire "tourner"
une progressbar, mais hélàs, sans succès, et je n'avais pas cherché à
demander de l'aide ici.
Je vais donc suivre avec intérêt ta demande :).


Stéphane.



"claudetom" a écrit dans le message de
news:
Pour l'animation de texte sur un afficheur epson (2 lignes 7 segments),
J'ai réalisé un composant pour faire cela.
L'animation des 2 lignes ce fait grace à 2 timers.
Ca fonctionne bien mais un problème se pose !
En effet quand l'animation est en route cela à pour effet de ralentir les
actions sur la form parent.
Donc ma question est :
Est-il possible de réalisé les animations dans un thread séparé ?
J'ai essayé plein de choses mais rien ne marche.

Merci.



Avatar
claudetom
Bonjour Sthéphane,

J'ai réussi à créer mon animation de 2 lignes texte sans timer !!
En utilisant des BackgroundWoker donc dans mon cas y'en a 2

Le but de l'animation, est de faire défiler ou clignoter 2 lignes en
fonction d'un critère qui est la longueur du texte à afficher.

Si le texte de la ligne 1 ou 2 est suppérieur à 20 (nombre maxi de lettre),
le texte doit s'afficher jusqu'au 20ème caratères puis ensuite scroller
jusqu'a la fin en décallant le texte vers la gauche.

Si le texte de la ligne 1 ou 2 est egale ou inférieur à 20 celui-ci doit
clignoter.

les 2 cas peuvent être afficher en même temps !!

Pourquoi le faire clignoter ! tout simplement pour éviter de bruler les
(points) si trop longtemps affiché.

Exemple :
Sur ligne 1 j'ai : "Bernard Pivardiere - Badge 00000521"
Sur ligne 2 j'ai : " Solde: 10.00eu"
l'animation doit-être, ligne1 défile, ligne2 clignote (pas trop vite)

Cette animation sert à piloter un afficheur Epson DM-D110 ou équivalent
(port Com)

Mon code avec les BackgroundWorker fonctionne mais c'est pas vraiment ca !!
Par contre le 1er avec les timers est ok mais cause des problèmes pour les
actions de la form parent.

Merci


"Stéphane" a écrit :

Bonjour claudetom,

Je ne répondrai qu'à cette question :

Est-il possible de réalisé les animations dans un thread séparé ?

La réponse oui, c'est possible.

Comment, je ne sais pas.
En effet, j'ai déjà essayé de me pencher sur 1 thread pour faire "tourner"
une progressbar, mais hélàs, sans succès, et je n'avais pas cherché à
demander de l'aide ici.
Je vais donc suivre avec intérêt ta demande :).


Stéphane.



"claudetom" a écrit dans le message de
news:
> Pour l'animation de texte sur un afficheur epson (2 lignes 7 segments),
> J'ai réalisé un composant pour faire cela.
> L'animation des 2 lignes ce fait grace à 2 timers.
> Ca fonctionne bien mais un problème se pose !
> En effet quand l'animation est en route cela à pour effet de ralentir les
> actions sur la form parent.
> Donc ma question est :
> Est-il possible de réalisé les animations dans un thread séparé ?
> J'ai essayé plein de choses mais rien ne marche.
>
> Merci.
>





Avatar
Millox Frédéric
Bonjour,

avec un peu de retard et en esperant que cela te serve à quelque chose, je
t'ai fait une petite Form qui contient deux ProgressBars qui évoluent
différemment dans le temps sans que l'interface en soit affectée :

Public Class Form1
Inherits System.Windows.Forms.Form

Private Thread1 As System.Threading.Thread
Private Thread2 As System.Threading.Thread

#Region " Windows Form Designer generated code "

Public Sub New()
MyBase.New()

'This call is required by the Windows Form Designer.
InitializeComponent()

'Add any initialization after the InitializeComponent() call

End Sub

'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer

'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents ProgressBar1 As System.Windows.Forms.ProgressBar
Friend WithEvents ProgressBar2 As System.Windows.Forms.ProgressBar
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
Me.ProgressBar1 = New System.Windows.Forms.ProgressBar
Me.ProgressBar2 = New System.Windows.Forms.ProgressBar
Me.SuspendLayout()
'
'ProgressBar1
'
Me.ProgressBar1.Location = New System.Drawing.Point(16, 24)
Me.ProgressBar1.Name = "ProgressBar1"
Me.ProgressBar1.Size = New System.Drawing.Size(312, 23)
Me.ProgressBar1.Step = 1
Me.ProgressBar1.TabIndex = 0
'
'ProgressBar2
'
Me.ProgressBar2.Location = New System.Drawing.Point(16, 88)
Me.ProgressBar2.Name = "ProgressBar2"
Me.ProgressBar2.Size = New System.Drawing.Size(312, 23)
Me.ProgressBar2.Step = 1
Me.ProgressBar2.TabIndex = 1
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(344, 149)
Me.Controls.Add(Me.ProgressBar2)
Me.Controls.Add(Me.ProgressBar1)
Me.MaximumSize = New System.Drawing.Size(352, 176)
Me.MinimumSize = New System.Drawing.Size(352, 176)
Me.Name = "Form1"
Me.Text = "Test"
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub Form1_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim MyProgressBar1, MyProgressBar2 As MyProgressBar

MyProgressBar1 = New MyProgressBar(Me, Me.ProgressBar1, 50)
Thread1 = New System.Threading.Thread(AddressOf
MyProgressBar1.BeginProgress)
MyProgressBar2 = New MyProgressBar(Me, Me.ProgressBar2, 150)
Thread2 = New System.Threading.Thread(AddressOf
MyProgressBar2.BeginProgress)

Thread1.Start()
Thread2.Start()
End Sub
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
Try
Thread1.Abort()
Catch ex As Exception
'
End Try
Try
Thread2.Abort()
Catch ex As Exception
'
End Try
End Sub

End Class

Public Class MyProgressBar

Private Delegate Sub ProgressBarDelegate()

Private _Timer As Timers.Timer
Private _Form As System.Windows.Forms.Form
Private _ProgressBar As ProgressBar
Private _ProgressBarDelegateObj As ProgressBarDelegate

Public Sub New(ByRef FormObj As System.Windows.Forms.Form, ByRef
ProgressBarObj As ProgressBar, ByVal TimerInterval As Double)
_Form = FormObj
_ProgressBar = ProgressBarObj
_Timer = New Timers.Timer
_Timer.Interval = TimerInterval
AddHandler _Timer.Elapsed, AddressOf TimerElapsed
_ProgressBarDelegateObj = New ProgressBarDelegate(AddressOf
ShowResult)
End Sub

Public Sub BeginProgress()
_Timer.Enabled = True
End Sub
Private Sub TimerElapsed(ByVal sender As Object, ByVal e As
System.Timers.ElapsedEventArgs)
_Timer.Enabled = False
_Form.Invoke(_ProgressBarDelegateObj)
If _ProgressBar.Value <= _ProgressBar.Maximum Then _Timer.Enabled =
True
End Sub
Private Sub ShowResult()
_ProgressBar.Increment(1)
End Sub

End Class

Bonne journée.

--
fmillox


"claudetom" a écrit :

Pour l'animation de texte sur un afficheur epson (2 lignes 7 segments),
J'ai réalisé un composant pour faire cela.
L'animation des 2 lignes ce fait grace à 2 timers.
Ca fonctionne bien mais un problème se pose !
En effet quand l'animation est en route cela à pour effet de ralentir les
actions sur la form parent.
Donc ma question est :
Est-il possible de réalisé les animations dans un thread séparé ?
J'ai essayé plein de choses mais rien ne marche.

Merci.



Avatar
Millox Frédéric
Rebonjour,

je précise que cet exemple ne gère que partiellement les exceptions. En
aucun cas, ce code est parfait :-)
Etant donné que ton exemple qui fontionne le mieux utilise les Timers, je
les ai utilisés aussi. Bien sûr, d'autre possibilités existent...

Bonne journée.

--
fmillox


"Millox Frédéric" a écrit :

Bonjour,

avec un peu de retard et en esperant que cela te serve à quelque chose, je
t'ai fait une petite Form qui contient deux ProgressBars qui évoluent
différemment dans le temps sans que l'interface en soit affectée :

Public Class Form1
Inherits System.Windows.Forms.Form

Private Thread1 As System.Threading.Thread
Private Thread2 As System.Threading.Thread

#Region " Windows Form Designer generated code "

Public Sub New()
MyBase.New()

'This call is required by the Windows Form Designer.
InitializeComponent()

'Add any initialization after the InitializeComponent() call

End Sub

'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer

'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents ProgressBar1 As System.Windows.Forms.ProgressBar
Friend WithEvents ProgressBar2 As System.Windows.Forms.ProgressBar
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
Me.ProgressBar1 = New System.Windows.Forms.ProgressBar
Me.ProgressBar2 = New System.Windows.Forms.ProgressBar
Me.SuspendLayout()
'
'ProgressBar1
'
Me.ProgressBar1.Location = New System.Drawing.Point(16, 24)
Me.ProgressBar1.Name = "ProgressBar1"
Me.ProgressBar1.Size = New System.Drawing.Size(312, 23)
Me.ProgressBar1.Step = 1
Me.ProgressBar1.TabIndex = 0
'
'ProgressBar2
'
Me.ProgressBar2.Location = New System.Drawing.Point(16, 88)
Me.ProgressBar2.Name = "ProgressBar2"
Me.ProgressBar2.Size = New System.Drawing.Size(312, 23)
Me.ProgressBar2.Step = 1
Me.ProgressBar2.TabIndex = 1
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(344, 149)
Me.Controls.Add(Me.ProgressBar2)
Me.Controls.Add(Me.ProgressBar1)
Me.MaximumSize = New System.Drawing.Size(352, 176)
Me.MinimumSize = New System.Drawing.Size(352, 176)
Me.Name = "Form1"
Me.Text = "Test"
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub Form1_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim MyProgressBar1, MyProgressBar2 As MyProgressBar

MyProgressBar1 = New MyProgressBar(Me, Me.ProgressBar1, 50)
Thread1 = New System.Threading.Thread(AddressOf
MyProgressBar1.BeginProgress)
MyProgressBar2 = New MyProgressBar(Me, Me.ProgressBar2, 150)
Thread2 = New System.Threading.Thread(AddressOf
MyProgressBar2.BeginProgress)

Thread1.Start()
Thread2.Start()
End Sub
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
Try
Thread1.Abort()
Catch ex As Exception
'
End Try
Try
Thread2.Abort()
Catch ex As Exception
'
End Try
End Sub

End Class

Public Class MyProgressBar

Private Delegate Sub ProgressBarDelegate()

Private _Timer As Timers.Timer
Private _Form As System.Windows.Forms.Form
Private _ProgressBar As ProgressBar
Private _ProgressBarDelegateObj As ProgressBarDelegate

Public Sub New(ByRef FormObj As System.Windows.Forms.Form, ByRef
ProgressBarObj As ProgressBar, ByVal TimerInterval As Double)
_Form = FormObj
_ProgressBar = ProgressBarObj
_Timer = New Timers.Timer
_Timer.Interval = TimerInterval
AddHandler _Timer.Elapsed, AddressOf TimerElapsed
_ProgressBarDelegateObj = New ProgressBarDelegate(AddressOf
ShowResult)
End Sub

Public Sub BeginProgress()
_Timer.Enabled = True
End Sub
Private Sub TimerElapsed(ByVal sender As Object, ByVal e As
System.Timers.ElapsedEventArgs)
_Timer.Enabled = False
_Form.Invoke(_ProgressBarDelegateObj)
If _ProgressBar.Value <= _ProgressBar.Maximum Then _Timer.Enabled =
True
End Sub
Private Sub ShowResult()
_ProgressBar.Increment(1)
End Sub

End Class

Bonne journée.

--
fmillox


"claudetom" a écrit :

> Pour l'animation de texte sur un afficheur epson (2 lignes 7 segments),
> J'ai réalisé un composant pour faire cela.
> L'animation des 2 lignes ce fait grace à 2 timers.
> Ca fonctionne bien mais un problème se pose !
> En effet quand l'animation est en route cela à pour effet de ralentir les
> actions sur la form parent.
> Donc ma question est :
> Est-il possible de réalisé les animations dans un thread séparé ?
> J'ai essayé plein de choses mais rien ne marche.
>
> Merci.
>


Avatar
claudetom
Merci Frédéric

J'ai un peut amélioré la Class, car sinon à la fermeture de la form ça
plantait sur l'Invoke
et j'ai ajouté l'aller/Retour pour le fun ;)

Sinon j'avais déjà résolu mon problème en utilisant 2 BackgroundWorker avec
paramètrage de la vitesse de défilement, clignotement et effacement des
messages

Donc plus un seul timer présent dans mon compo, et marche à la perfection
mon afficheur Alphanumérique tourne en permanence sans gène pour
l'application.

Sinon voici ta Class modifiée :

Et surtout MERCI BEAUCOUP !!

Public Class MyProgressBar
Private Delegate Sub ProgressBarDelegate()
Private _Timer As Timers.Timer
Private WithEvents _Form As System.Windows.Forms.Form
Private _ProgressBar As ProgressBar
Private _ProgressBarDelegateObj As ProgressBarDelegate

Private bArriere As Boolean = False

Public Sub New(ByRef FormObj As System.Windows.Forms.Form, ByRef
ProgressBarObj As ProgressBar, ByVal TimerInterval As Double)
_Form = FormObj
_ProgressBar = ProgressBarObj
_Timer = New Timers.Timer
_Timer.Interval = TimerInterval
AddHandler _Timer.Elapsed, AddressOf TimerElapsed
_ProgressBarDelegateObj = New ProgressBarDelegate(AddressOf
ShowResult)
End Sub

Public Sub BeginProgress()
_Timer.Enabled = True
End Sub

Private Sub TimerElapsed(ByVal sender As Object, ByVal e As
System.Timers.ElapsedEventArgs)
If _Form.InvokeRequired Then
_Form.BeginInvoke(_ProgressBarDelegateObj)
If Not _ProgressBar.Value = _ProgressBar.Maximum And Not
bArriere Then
bArriere = False
Else
If Not _ProgressBar.Value = _ProgressBar.Minimum Then
bArriere = True
Else
bArriere = False
End If
End If
End If
End Sub

Private Sub ShowResult()
If Not bArriere Then
_ProgressBar.Increment(1)
Else
_ProgressBar.Increment(-1)
End If
End Sub

Private Sub ShowResultDEC()
_ProgressBar.Increment(-1)
End Sub
End Class

"Millox Frédéric" a écrit :

Rebonjour,

je précise que cet exemple ne gère que partiellement les exceptions. En
aucun cas, ce code est parfait :-)
Etant donné que ton exemple qui fontionne le mieux utilise les Timers, je
les ai utilisés aussi. Bien sûr, d'autre possibilités existent...

Bonne journée.

--
fmillox


"Millox Frédéric" a écrit :

> Bonjour,
>
> avec un peu de retard et en esperant que cela te serve à quelque chose, je
> t'ai fait une petite Form qui contient deux ProgressBars qui évoluent
> différemment dans le temps sans que l'interface en soit affectée :
>
> Public Class Form1
> Inherits System.Windows.Forms.Form
>
> Private Thread1 As System.Threading.Thread
> Private Thread2 As System.Threading.Thread
>
> #Region " Windows Form Designer generated code "
>
> Public Sub New()
> MyBase.New()
>
> 'This call is required by the Windows Form Designer.
> InitializeComponent()
>
> 'Add any initialization after the InitializeComponent() call
>
> End Sub
>
> 'Form overrides dispose to clean up the component list.
> Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
> If disposing Then
> If Not (components Is Nothing) Then
> components.Dispose()
> End If
> End If
> MyBase.Dispose(disposing)
> End Sub
>
> 'Required by the Windows Form Designer
> Private components As System.ComponentModel.IContainer
>
> 'NOTE: The following procedure is required by the Windows Form Designer
> 'It can be modified using the Windows Form Designer.
> 'Do not modify it using the code editor.
> Friend WithEvents ProgressBar1 As System.Windows.Forms.ProgressBar
> Friend WithEvents ProgressBar2 As System.Windows.Forms.ProgressBar
> <System.Diagnostics.DebuggerStepThrough()> Private Sub
> InitializeComponent()
> Me.ProgressBar1 = New System.Windows.Forms.ProgressBar
> Me.ProgressBar2 = New System.Windows.Forms.ProgressBar
> Me.SuspendLayout()
> '
> 'ProgressBar1
> '
> Me.ProgressBar1.Location = New System.Drawing.Point(16, 24)
> Me.ProgressBar1.Name = "ProgressBar1"
> Me.ProgressBar1.Size = New System.Drawing.Size(312, 23)
> Me.ProgressBar1.Step = 1
> Me.ProgressBar1.TabIndex = 0
> '
> 'ProgressBar2
> '
> Me.ProgressBar2.Location = New System.Drawing.Point(16, 88)
> Me.ProgressBar2.Name = "ProgressBar2"
> Me.ProgressBar2.Size = New System.Drawing.Size(312, 23)
> Me.ProgressBar2.Step = 1
> Me.ProgressBar2.TabIndex = 1
> '
> 'Form1
> '
> Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
> Me.ClientSize = New System.Drawing.Size(344, 149)
> Me.Controls.Add(Me.ProgressBar2)
> Me.Controls.Add(Me.ProgressBar1)
> Me.MaximumSize = New System.Drawing.Size(352, 176)
> Me.MinimumSize = New System.Drawing.Size(352, 176)
> Me.Name = "Form1"
> Me.Text = "Test"
> Me.ResumeLayout(False)
>
> End Sub
>
> #End Region
>
> Private Sub Form1_Load(ByVal sender As Object, ByVal e As
> System.EventArgs) Handles MyBase.Load
> Dim MyProgressBar1, MyProgressBar2 As MyProgressBar
>
> MyProgressBar1 = New MyProgressBar(Me, Me.ProgressBar1, 50)
> Thread1 = New System.Threading.Thread(AddressOf
> MyProgressBar1.BeginProgress)
> MyProgressBar2 = New MyProgressBar(Me, Me.ProgressBar2, 150)
> Thread2 = New System.Threading.Thread(AddressOf
> MyProgressBar2.BeginProgress)
>
> Thread1.Start()
> Thread2.Start()
> End Sub
> Private Sub Form1_Closing(ByVal sender As Object, ByVal e As
> System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
> Try
> Thread1.Abort()
> Catch ex As Exception
> '
> End Try
> Try
> Thread2.Abort()
> Catch ex As Exception
> '
> End Try
> End Sub
>
> End Class
>
> Public Class MyProgressBar
>
> Private Delegate Sub ProgressBarDelegate()
>
> Private _Timer As Timers.Timer
> Private _Form As System.Windows.Forms.Form
> Private _ProgressBar As ProgressBar
> Private _ProgressBarDelegateObj As ProgressBarDelegate
>
> Public Sub New(ByRef FormObj As System.Windows.Forms.Form, ByRef
> ProgressBarObj As ProgressBar, ByVal TimerInterval As Double)
> _Form = FormObj
> _ProgressBar = ProgressBarObj
> _Timer = New Timers.Timer
> _Timer.Interval = TimerInterval
> AddHandler _Timer.Elapsed, AddressOf TimerElapsed
> _ProgressBarDelegateObj = New ProgressBarDelegate(AddressOf
> ShowResult)
> End Sub
>
> Public Sub BeginProgress()
> _Timer.Enabled = True
> End Sub
> Private Sub TimerElapsed(ByVal sender As Object, ByVal e As
> System.Timers.ElapsedEventArgs)
> _Timer.Enabled = False
> _Form.Invoke(_ProgressBarDelegateObj)
> If _ProgressBar.Value <= _ProgressBar.Maximum Then _Timer.Enabled =
> True
> End Sub
> Private Sub ShowResult()
> _ProgressBar.Increment(1)
> End Sub
>
> End Class
>
> Bonne journée.
>
> --
> fmillox
>
>
> "claudetom" a écrit :
>
> > Pour l'animation de texte sur un afficheur epson (2 lignes 7 segments),
> > J'ai réalisé un composant pour faire cela.
> > L'animation des 2 lignes ce fait grace à 2 timers.
> > Ca fonctionne bien mais un problème se pose !
> > En effet quand l'animation est en route cela à pour effet de ralentir les
> > actions sur la form parent.
> > Donc ma question est :
> > Est-il possible de réalisé les animations dans un thread séparé ?
> > J'ai essayé plein de choses mais rien ne marche.
> >
> > Merci.
> >