Problème avec les Threads et la fonction Creaobject

skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007 - 8 avril 2005 à 12:09
frank150 Messages postés 34 Date d'inscription lundi 6 janvier 2003 Statut Membre Dernière intervention 29 mars 2008 - 12 janv. 2006 à 10:54
Bonjour à tous,



Voila, j'ai un gros problème avec les Thread sous VB 6.

Plus précisément, c'est la fonction CreateObject dans la fonction de mon thread qui pose problème.

Je m'explique :

Mon but et de créer un thread qui va instancier une dll via CreateObject (et son ProgID)

Au final, j'aimerais que mon programme puisse lancer plusieurs threads et instancier chacun une dll différente



Le code ci-dessous fonctionne dans l'environnement de VB. Mais une fois
l'exe compilé, ça plante à l'exécution sur la fonction CreateObject



Pour l'utiliser, il suffit de créer un projet et d'y insérer un
formulaire (avec un bouton cmdStartThread et cmdQuit) , un module et un
module de classe



Merci d'avance pour votre aide.



''''''''''''' Code du formulaire



Option Explicit



'API Declarations

Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Private Declare Function GetCurrentProcess Lib "kernel32" () As Long



Private Sub cmdStartThread_Click()

Set TabThread = New clsThreading



TabThread.CreateNewThread AddressOf LaunchFunctionFromDll, 0, True



cmdStartThread.Enabled = False

End Sub



Private Sub cmdQuit_Click()

Unload Me

End Sub



Private Sub Form_Unload(Cancel As Integer)

Set TabThread = Nothing

End Sub



''''''''''''' Fin Code du formulaire



'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''



''''''''''''' Code du module



Option Explicit



'API Declarations

Private Declare Function CoInitialize Lib "ole32.dll" (pvReserved As Long) As Long

Private Declare Sub CoUninitialize Lib "ole32.dll" ()



Public TabThread As clsThreading



Public Sub LaunchFunctionFromDll()

Dim plugins As Object



On Error GoTo Erreur



Call CoInitialize(ByVal 0&)



Set plugins = CreateObject("ADODB.Command") ' Ligne qui pose PROBLEME ! ! !



Set plugins = Nothing



Call CoUninitialize



Exit Sub

Erreur:

MsgBox Err.Description, vbCritical, "Erreur n° : " & Err.Number

End Sub



''''''''''''' Fin Code du module



'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''



''''''''''''' Code du module de class



Private Declare Function CreateThread Lib "kernel32" (ByVal
lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal
lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As
Long, lpThreadID As Long) As Long

Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long



Private mThreadHandle As Long

Private mThreadID As Long

Private mCreated As Boolean



Public Function CreateNewThread(ByVal cFunction As Long, Optional ByVal
cPriority As Long 0, Optional ByVal cEnabled As Boolean True)

'Creates a new Thread

Dim mHandle As Long

Dim lpThreadID As Long



' regarde si déjà crée

If mCreated = True Then Exit Function



mHandle = CreateThread(ByVal 0&, ByVal 0&, cFunction, ByVal 0&, ByVal 0&, lpThreadID)



If mHandle = 0 Then ' Echec création

Else

mThreadHandle = mHandle

mThreadID = lpThreadID

mCreated = True

End If

End Function



Public Function TerminateCurrentThread()

On Error Resume Next



Call TerminateThread(mThreadHandle, ByVal 0&)

mCreated = False

End Function



Private Sub Class_Terminate()

Call TerminateCurrentThread

End Sub



''''''''''''' Fin Code du module de class

3 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
8 avril 2005 à 13:01
Un conseil, laisse tomber les threads avec VB6, il n'est pas prevu pour
faire du multithreading et ne sait pas le gérer (du tout, contrairement
à VB5 qui lui ne sais pas le gérer correctement).



Le multithreading en VB6 c'est plantage assuré



Le seul moyen (détourné) de faire un semblant de multithreading c'est de créer des ocx.



Eventuellement déporter le code et la gestion multithreading dans une dll écrite en C.



<hr size="2" width="100%">Si le cerveau était assez simple pour que nous puissions le comprendre,

nous serions assez bête pour ne pas le comprendre malgré tout.
0
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007
8 avril 2005 à 15:14
Salut casy,



Merci pour ta réponse. Au moins elle a le mérite d'être clair et elle
confirme ce que j'ai déjà lu dans différent article sur le Net.



A+
0
frank150 Messages postés 34 Date d'inscription lundi 6 janvier 2003 Statut Membre Dernière intervention 29 mars 2008
12 janv. 2006 à 10:54
C'est bizarre pcq jsuis en vb6 et jpeux faire tourner 1 thread en background (soit 2 threads total en comptant celui du prog principale) et sa plante pas du tout!! Je pense que le problème vient du fait que tu n'a pas compiler ton exe en P-Code (dans les options du projet -> Compile -> Compiler en mode P-Code).

Bonne chance!

Frank150
0
Rejoignez-nous