OVH Cloud OVH Cloud

VB6 et Thread

5 réponses
Avatar
Claude
Bonjour à tous,

Je désire créer une classe qui est appelé au démarrage
de mon application (initialiser dans le "FORM_LOAD" de ma
"form" principale) puis détruite lors de la fermeture de
mon application (destruction dans le "FORM_UNLOAD" de ma "form" principale).

J'ai besoin que cette classe s'exécute en "background", donc dans un autre
"thread" que celui de ma "form" principale. En d'autres termes, je voudrais
que ma classe exécute des tâches "live" pendant que l'utilisateur lui utilise
mon application... et ce sans qu'il s'en aperçoive.

De toutes les recherches que j'ai effectuées, il est clair qu'on oublie la
fonction de l'API de Windows "CreateThread". D'ailleurs je l'ai essayé... et
effectivement c'est le "crash" monumental ! J'ai donc essayé de me déclarer
un Timer... mais je ne sais pas comment l'initialiser. Voici un "sample" de
mon code :

'Liste des propriétés :
Private WithEvents m_tmrResync As Timer
Private m_Minutes As Long

Private Sub Class_Initialize()

'/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
'ICI EST MON PROBLÈME... COMMENT EST-CE QUE JE CRÉE
'MON TIMER ? J'AI ESSAYÉ CECI :
'a) Set m_tmrResync = New Timer
'b) Set m_tmrResync = CreateObject("Timer")
'RIEN NE FONCTIONNE... QUE FAIRE ALORS ?????
'/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
m_tmrResync .Enabled = True
m_tmrResync .Interval = 1000 '1 minute

End Sub

Private Sub Class_Terminate()

m_tmrResync.Enabled = False

End Sub

Private Sub tmrResync_Timer()

'On incrémente le temps
IncrementeMinutes

'À toutes les 5 minutes, on resynchronise
If m_lMinutes = 5 Then

'Traitement exécuté à toutes les 5 minutes

End If

'On réinitialise le compteur de minutes
m_lMinutes = 0

End Sub

Private Sub IncrementeMinutes()

m_lMinutes = m_lMinutes + 1

End Sub

Merci,
Claude :)

5 réponses

Avatar
ng
Salut,

fonction de l'API de Windows "CreateThread


Pas forcément, ca fonctionne hors IDE même très bien mais plus de
débogage...

Sinon la solution facile et d'utiliser un exe activex qui s'execute ds un
autre thread (contrairement à une dll activex).

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Claude wrote:
Bonjour à tous,

Je désire créer une classe qui est appelé au démarrage
de mon application (initialiser dans le "FORM_LOAD" de ma
"form" principale) puis détruite lors de la fermeture de
mon application (destruction dans le "FORM_UNLOAD" de ma "form"
principale).

J'ai besoin que cette classe s'exécute en "background", donc dans un
autre "thread" que celui de ma "form" principale. En d'autres termes,
je voudrais que ma classe exécute des tâches "live" pendant que
l'utilisateur lui utilise mon application... et ce sans qu'il s'en
aperçoive.

De toutes les recherches que j'ai effectuées, il est clair qu'on
oublie la fonction de l'API de Windows "CreateThread". D'ailleurs je
l'ai essayé... et effectivement c'est le "crash" monumental ! J'ai
donc essayé de me déclarer un Timer... mais je ne sais pas comment
l'initialiser. Voici un "sample" de mon code :

'Liste des propriétés :
Private WithEvents m_tmrResync As Timer
Private m_Minutes As Long

Private Sub Class_Initialize()

'/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
'ICI EST MON PROBLÈME... COMMENT EST-CE QUE JE CRÉE
'MON TIMER ? J'AI ESSAYÉ CECI :
'a) Set m_tmrResync = New Timer
'b) Set m_tmrResync = CreateObject("Timer")
'RIEN NE FONCTIONNE... QUE FAIRE ALORS ?????
'/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
m_tmrResync .Enabled = True
m_tmrResync .Interval = 1000 '1 minute

End Sub

Private Sub Class_Terminate()

m_tmrResync.Enabled = False

End Sub

Private Sub tmrResync_Timer()

'On incrémente le temps
IncrementeMinutes

'À toutes les 5 minutes, on resynchronise
If m_lMinutes = 5 Then

'Traitement exécuté à toutes les 5 minutes

End If

'On réinitialise le compteur de minutes
m_lMinutes = 0

End Sub

Private Sub IncrementeMinutes()

m_lMinutes = m_lMinutes + 1

End Sub

Merci,
Claude :)


Avatar
Patrick Philippot
Claude wrote:
De toutes les recherches que j'ai effectuées, il est clair qu'on
oublie la fonction de l'API de Windows "CreateThread". D'ailleurs je
l'ai essayé... et effectivement c'est le "crash" monumental ! J'ai
donc essayé de me déclarer un Timer... mais je ne sais pas comment
l'initialiser. Voici un "sample" de mon code :



Bonjour,

L'utilisation directe du multithreading sous VB6 est efffectivement
vouée, AMHA, à l'échec systématique. Le produit n'a pas été conçu pour
cela. Toute opération "multithreadée" devrait être déléguée à un
composant ActiveX, développé dans un autre langage supportant le
multithreading. On trouve ici et là des articles sur l'utilisation des
APIs de multithreading sous VB mais ce sont, je pense, des bricolages.

Ceci étant, la fonction DoEvents permet en général de résoudre les cas
les plus simples. Tout dépend de la complexité du code que vous voulez
faire tourner en tâche de fond.

Si vos besoins de multithreading (et donc, c'est un point crucial, de
mécanismes de synchronisation) sont importants, VB6 n'est peut-être pas
le langage adapté à votre projet. Envisagez plutôt un passage à VB .Net.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Kiriasse
Bonjour Claude,

On reçoit vos contributions sous une forme peu lisible parce que vous êtes
en Unicode (UTF8).
Il faut configurer votre logiciel de News en ISO-8859-1 (Europe
occidentale -- Latin 1) ou, mieux en ISO-8859-15 (Europe occidentale --
Latin 9)

Kiriasse
www.kiriasse.fr

== "Claude" a écrit dans le message de news:

Bonjour à tous,

Je désire créer une classe qui est appelé au démarrage
de mon application (initialiser dans le "FORM_LOAD" de ma
"form" principale) puis détruite lors de la fermeture de
mon application (destruction dans le "FORM_UNLOAD" de ma "form"
principale).

J'ai besoin que cette classe s'exécute en "background", donc dans un
autre
"thread" que celui de ma "form" principale. En d'autres termes, je
voudrais
que ma classe exécute des tâches "live" pendant que l'utilisateur lui
utilise
mon application... et ce sans qu'il s'en aperçoive.

De toutes les recherches que j'ai effectuées, il est clair qu'on oublie
la
fonction de l'API de Windows "CreateThread". D'ailleurs je l'ai essayé...
et
effectivement c'est le "crash" monumental ! J'ai donc essayé de me
déclarer
un Timer... mais je ne sais pas comment l'initialiser. Voici un "sample"
de
mon code :

'Liste des propriétés :
Private WithEvents m_tmrResync As Timer
Private m_Minutes As Long

Private Sub Class_Initialize()

'/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
'ICI EST MON PROBLÈME... COMMENT EST-CE QUE JE CRÉE
'MON TIMER ? J'AI ESSAYÉ CECI :
'a) Set m_tmrResync = New Timer
'b) Set m_tmrResync = CreateObject("Timer")
'RIEN NE FONCTIONNE... QUE FAIRE ALORS ?????
'/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
m_tmrResync .Enabled = True
m_tmrResync .Interval = 1000 '1 minute

End Sub

Private Sub Class_Terminate()

m_tmrResync.Enabled = False

End Sub

Private Sub tmrResync_Timer()

'On incrémente le temps
IncrementeMinutes

'À toutes les 5 minutes, on resynchronise
If m_lMinutes = 5 Then

'Traitement exécuté à toutes les 5 minutes

End If

'On réinitialise le compteur de minutes
m_lMinutes = 0

End Sub

Private Sub IncrementeMinutes()

m_lMinutes = m_lMinutes + 1

End Sub

Merci,
Claude :)


Avatar
Guy DETIENNE
Salut ;O)

Puisque VB et le multithreading ne font pas bon ménage, une astuce serait
de créer un second exécutable qui communiquerait avec son parent
(exécutable l'ayant lancé).

Vois ici :
ECHANGE DE MESSAGES WINDOWS ENTRE DEUX APPLICATIONS
http://www.vbfrance.com/code.aspx?ID"686

Dans la discussion, des utilisateurs proposes d'autres méthodes. Cela
pourait peut-être t'inspirer.

Guy

"Claude" a écrit dans le message de
news:
Bonjour à tous,

Je désire créer une classe qui est appelé au démarrage
de mon application (initialiser dans le "FORM_LOAD" de ma
"form" principale) puis détruite lors de la fermeture de
mon application (destruction dans le "FORM_UNLOAD" de ma "form"


principale).

J'ai besoin que cette classe s'exécute en "background", donc dans un


autre
"thread" que celui de ma "form" principale. En d'autres termes, je


voudrais
que ma classe exécute des tâches "live" pendant que l'utilisateur lui


utilise
mon application... et ce sans qu'il s'en aperçoive.

De toutes les recherches que j'ai effectuées, il est clair qu'on oublie


la
fonction de l'API de Windows "CreateThread". D'ailleurs je l'ai essayé...


et
effectivement c'est le "crash" monumental ! J'ai donc essayé de me


déclarer
un Timer... mais je ne sais pas comment l'initialiser. Voici un "sample"


de
mon code :

'Liste des propriétés :
Private WithEvents m_tmrResync As Timer
Private m_Minutes As Long

Private Sub Class_Initialize()

'/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
'ICI EST MON PROBLÈME... COMMENT EST-CE QUE JE CRÉE
'MON TIMER ? J'AI ESSAYÉ CECI :
'a) Set m_tmrResync = New Timer
'b) Set m_tmrResync = CreateObject("Timer")
'RIEN NE FONCTIONNE... QUE FAIRE ALORS ?????
'/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
m_tmrResync .Enabled = True
m_tmrResync .Interval = 1000 '1 minute

End Sub

Private Sub Class_Terminate()

m_tmrResync.Enabled = False

End Sub

Private Sub tmrResync_Timer()

'On incrémente le temps
IncrementeMinutes

'À toutes les 5 minutes, on resynchronise
If m_lMinutes = 5 Then

'Traitement exécuté à toutes les 5 minutes

End If

'On réinitialise le compteur de minutes
m_lMinutes = 0

End Sub

Private Sub IncrementeMinutes()

m_lMinutes = m_lMinutes + 1

End Sub

Merci,
Claude :)


Avatar
Guy DETIENNE
Personnellement, je lis son message sans problèmes...

Guy

"Kiriasse" a écrit dans le message de
news:4216232c$0$820$
Bonjour Claude,

On reçoit vos contributions sous une forme peu lisible parce que vous êtes
en Unicode (UTF8).
Il faut configurer votre logiciel de News en ISO-8859-1 (Europe
occidentale -- Latin 1) ou, mieux en ISO-8859-15 (Europe occidentale --
Latin 9)

Kiriasse
www.kiriasse.fr

== > "Claude" a écrit dans le message de


news:

> Bonjour à tous,
>
> Je désire créer une classe qui est appelé au démarrage
> de mon application (initialiser dans le "FORM_LOAD" de ma
> "form" principale) puis détruite lors de la fermeture de
> mon application (destruction dans le "FORM_UNLOAD" de ma "form"
> principale).
>
> J'ai besoin que cette classe s'exécute en "background", donc dans un
> autre
> "thread" que celui de ma "form" principale. En d'autres termes, je
> voudrais
> que ma classe exécute des tâches "live" pendant que l'utilisateur lui
> utilise
> mon application... et ce sans qu'il s'en aperçoive.
>
> De toutes les recherches que j'ai effectuées, il est clair qu'on


oublie
> la
> fonction de l'API de Windows "CreateThread". D'ailleurs je l'ai


essayé...
> et
> effectivement c'est le "crash" monumental ! J'ai donc essayé de me
> déclarer
> un Timer... mais je ne sais pas comment l'initialiser. Voici un "sample"
> de
> mon code :
>
> 'Liste des propriétés :
> Private WithEvents m_tmrResync As Timer
> Private m_Minutes As Long
>
> Private Sub Class_Initialize()
>
> '/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
> 'ICI EST MON PROBLÈME... COMMENT EST-CE QUE JE CRÉE
> 'MON TIMER ? J'AI ESSAYÉ CECI :
> 'a) Set m_tmrResync = New Timer
> 'b) Set m_tmrResync = CreateObject("Timer")
> 'RIEN NE FONCTIONNE... QUE FAIRE ALORS ?????
> '/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
> m_tmrResync .Enabled = True
> m_tmrResync .Interval = 1000 '1 minute
>
> End Sub
>
> Private Sub Class_Terminate()
>
> m_tmrResync.Enabled = False
>
> End Sub
>
> Private Sub tmrResync_Timer()
>
> 'On incrémente le temps
> IncrementeMinutes
>
> 'À toutes les 5 minutes, on resynchronise
> If m_lMinutes = 5 Then
>
> 'Traitement exécuté à toutes les 5 minutes
>
> End If
>
> 'On réinitialise le compteur de minutes
> m_lMinutes = 0
>
> End Sub
>
> Private Sub IncrementeMinutes()
>
> m_lMinutes = m_lMinutes + 1
>
> End Sub
>
> Merci,
> Claude :)