Exemple d'application multithread

Soyez le premier à donner votre avis sur cette source.

Vue 22 738 fois - Téléchargée 1 564 fois

Description

Salut, Comme vous le savez tous, le multithreading n'est pas une chose facile en vb, voir quelque chose d'impossible(comme je l'ai souvent lu). Je precise que ce code ne fonctionnera pas si compilé en vb6.
L'avantage du multithread: éviter le freeze de l'application lorsque vous gerer de lourdes procedures, Ca permet a l'application de garder la main sur les differents events(souris, clavier etc).
Cet exemple simple vous permettras de mieux comprendre: vous avez deux listview. vous y ajouter des items en boucle (5000 dans l'exemple). En tant normal, c'est fini votre application va freezer le temps que ça soit fini (à moins d'utiliser doevents, mais vous savez que l'effet de cet opérateur peut etre catastrophique selon la maniere dont on l'utilise). Avec le threading, ça vous permet d'executer d'autres taches en même temps sans aucun ennui ce type.
Precision: il faut synchroniser les access à l'édition des objets. En théorie (j'ai pas tester) on ne peux pas editer un objet de deux threads distinctes => access violation.
Plus precisement, cette source utilise l'api CreateThread_ByValParam() pour creer les threads, et LocalAlloc() couplé a Copymemory() pour lui passer des parametres de la fonction a executée, appelée elle même par l'opérateur Adressof().

Source / Exemple :


Option Explicit
'Declaration
Private Const MAXLONG = 256

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
Private Declare Function LocalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal uBytes As Long) As Long
Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
Private Declare Function CreateThread_ByValParam Lib "kernel32" Alias "CreateThread" (ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Any, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, ByRef lpThreadId As Long) As Long

Private Const THREAD_BASE_PRIORITY_IDLE = -15
Private Const THREAD_BASE_PRIORITY_LOWRT = 15
Private Const THREAD_BASE_PRIORITY_MAX = 2
Private Const THREAD_BASE_PRIORITY_MIN = -2
Private Const THREAD_PRIORITY_HIGHEST = THREAD_BASE_PRIORITY_MAX
Private Const THREAD_PRIORITY_LOWEST = THREAD_BASE_PRIORITY_MIN
Private Const THREAD_PRIORITY_ABOVE_NORMAL = (THREAD_PRIORITY_HIGHEST - 1)
Private Const THREAD_PRIORITY_BELOW_NORMAL = (THREAD_PRIORITY_LOWEST + 1)
Private Const THREAD_PRIORITY_ERROR_RETURN = (MAXLONG)
Private Const THREAD_PRIORITY_IDLE = THREAD_BASE_PRIORITY_IDLE
Private Const THREAD_PRIORITY_NORMAL = 0
Private Const THREAD_PRIORITY_TIME_CRITICAL = THREAD_BASE_PRIORITY_LOWRT

Private Const CREATE_SUSPENDED = &H4

Public Enum ThreadPriority
    tpLowest = THREAD_PRIORITY_LOWEST
    tpBelowNormal = THREAD_PRIORITY_BELOW_NORMAL
    tpNormal = THREAD_PRIORITY_NORMAL
    tpAboveNormal = THREAD_PRIORITY_ABOVE_NORMAL
    tpHighest = THREAD_PRIORITY_HIGHEST
End Enum

Dim lPtr               As Long

Public Function malloc(sParam As String) As Long
Dim Ptr As Long, lSize As Long
    
lSize = LenB(sParam) 'on recupere la taille de la valeur de la variable a passer en parametre
    
'on alloue un emplacement mémoire, ptr nous retourne la position
Ptr = LocalAlloc(lPtr, lSize + 4)

'si success
If Ptr <> 0 Then

    'on copie la taille (4 bytes = long)
    CopyMemory ByVal Ptr, lSize, 4
    
    'on copie la valeur de la variables. StrPtr pointe a l'adresse du premier chr
    If lSize > 0 Then CopyMemory ByVal Ptr + 4, ByVal StrPtr(sParam), lSize
End If

'on attribue sa valeur a la fonction
malloc = Ptr
End Function

Public Function GetStrFromMemory(lParam As Long) As String
Dim lSize As Long
Dim sBuf  As String

'si le pointeur de la variable est null la valeur retournée de la fonction est null
If lParam = 0 Then
    GetStrFromMemory = ""
Else
    'on récupere la taille
    CopyMemory lSize, ByVal lParam, 4
    
    If lSize > 0 Then
    
        'on prepare un buffer
        sBuf = String(lSize \ 2, 0)
        
        'on récupere le string (lParam)
        CopyMemory ByVal StrPtr(sBuf), ByVal lParam + 4, lSize
        
        'on retourne sa valeur
        GetStrFromMemory = sBuf
    End If
End If
End Function

Public Sub FreeMemory(lParam As Long)
'on libere la memoire
LocalFree lParam
End Sub

Public Function CreateNewThread(ByVal lFunction As Long, Optional ByVal lParam As Long, Optional ByVal lPriority As Long = tpNormal, Optional ByVal lEnabled As Boolean = True)
Dim lFlags     As Long
Dim lpThreadId As Long
Dim lHandle    As Long

'on verifie la valeur du flag pour définir la propriété de la thread a creer
If lEnabled = True Then lFlags = 0 Else lFlags = CREATE_SUSPENDED

'on crée la thread (lHandle retourne son handle lol)
lHandle = CreateThread_ByValParam(ByVal 0&, ByVal 0&, lFunction, ByVal lParam, lFlags, lpThreadId)

'on retourne la valeur du handle
CreateNewThread = lHandle

End Function

Public Function TerminateCurrentThread(lParam As Long)
On Error Resume Next

'on termine la thread
TerminateThread lParam, ByVal 0&

End Function

Conclusion :


tout est dans le zip :)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
309
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
15 juin 2015
1
L'usage du multithreading est certes déconseillé et souvent instable dans vb6 mais pas impossible. Cependant, l'usage de cette méthode, qui repose sur l'api CreateThread est obsolète aujourd'hui. Je vous recommande d'utiliser la méthode reposant sur l'api SHCreateThread dont voici un exemple ci-dessous. Allez dans ses commentaires, car j'explique comment faire réduire les risques de crash sous vb6 sp6.
Voir la source :
http://www.vbfrance.com/codes/SIMPLE-PROGRAMME-MULTI-THREAD_5590.aspx
Messages postés
56
Date d'inscription
lundi 23 août 2004
Statut
Membre
Dernière intervention
1 août 2008

ça plante en exe que ce soit en pcode ou pas !!
avez vous d'autres solutions ??
Messages postés
586
Date d'inscription
jeudi 18 septembre 2003
Statut
Membre
Dernière intervention
13 février 2008
1
salut,
tant de penne pour un multithread , voici une fonction qui vous facilitera la vie:
SHCreateThread
a+++ les amis
Messages postés
14
Date d'inscription
lundi 16 février 2004
Statut
Membre
Dernière intervention
20 janvier 2012

ça plante pas (en vb5)... faut essayer avant d'affirmer :) j'insiste, oui , c'est vrai, ça tient qu'a un fil et il faut etre sur de ce qu'on code. Par contre évitons ensemble les allegations douteuses sans avoir vérifié au préalable thx ;)
Messages postés
956
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
1
lol
pas en vb.net (mais c'est plus vraiement du vb...)
Afficher les 11 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.