*.dlls Parallel ausführen.

26/04/2010 - 08:18 von Jan Eisner | Report spam
Moin, Moin NG,

Ich habe ein kleines Programm in VB6, das aus mehreren Modulen besteht.
Es gibt unter anderem 3 Module in denen Daten aus verschiedenen
Datenbanken geladen werden. Ich nenne sie der einfachheit halber mal M1,
M2, M3.
Wenn das Frontend geladen wird, gelange ich beim debuggen irgendwann in
die Funktion Laden() in der vereinfacht folgendes passiert:
Private Sub Laden()
M1.Laden
M2.Laden
M3.Laden
End Sub

VB6 arbeitet die Befehle immer brav hintereinander ab. Wenn jedes Laden
20 Sekunden dauert, dann brauchen also alle 3 Module zusammen 60Sek(1Min)
Da die Module nicht voneinander abhàngig sind (Reihenfolge des Ladens
ist egal), bin ich auf der Suche nach einer Möglichkeit die Module
parallel zu öffnen, mit der Hoffnung die Ladezeit zu halbieren.
Für Ideen oder weiterführende Links bin ich sehr Dankbar.

MfG

J. Eisner
 

Lesen sie die antworten

#1 Peter Götz
26/04/2010 - 10:08 | Warnen spam
Hallo Jan,

Ich habe ein kleines Programm in VB6, das aus mehreren Modulen besteht. Es
gibt unter anderem 3 Module in denen Daten aus verschiedenen Datenbanken
geladen werden. Ich nenne sie der einfachheit halber mal M1, M2, M3.
Wenn das Frontend geladen wird, gelange ich beim debuggen irgendwann in
die Funktion Laden() in der vereinfacht folgendes passiert:
Private Sub Laden()
M1.Laden
M2.Laden
M3.Laden
End Sub



Interessant wàre zu wissen, wie dieses Laden
konkret (Code) aussieht?


VB6 arbeitet die Befehle immer brav hintereinander ab.



Ja, solange die Befehle im selben Thread laufen.

Wenn jedes Laden 20 Sekunden dauert, dann brauchen also alle 3 Module
zusammen 60Sek(1Min)
Da die Module nicht voneinander abhàngig sind (Reihenfolge des Ladens ist
egal), bin ich auf der Suche nach einer Möglichkeit die Module parallel zu
öffnen, mit der Hoffnung die Ladezeit zu halbieren.



Ich weiss nicht so recht, was Du mit "Module parallel öffnen"
meinst, aber Du hast die Wahl beim Einlesen von Daten in
ein ADODB.Recordset dieses synchron oder asynchron
ausführen zu lassen. Ein asynchrones Einlesen würde in etwa
so aussehen:


Private WithEvents mRS As ADODB.Recordset

Private Sub OpenRS(CNN As ADODB.Connection, strSQL As String)
Set mRS = New ADODB.Recordset
With mRS
Set .ActiveConnection = CNN
.Source = strSQL
.CursorType = adOpenStatic
.CursorLocation = adUseClient
.LockType = adLockOptimistic

' *** Einlesen der Daten asynchron ***
.Open , , , , adAsyncFetchNonBlocking
End With

End With
End Sub

Private Sub mRS_FetchComplete _
(ByVal pError As ADODB.Error, _
adStatus As ADODB.EventStatusEnum, _
ByVal pRecordset As ADODB.Recordset)

' wird ausgelöst, wenn das Einlesen
' der Daten beendet ist
End Sub

Private Sub mRS_FetchProgress _
(ByVal Progress As Long, _
ByVal MaxProgress As Long, _
adStatus As ADODB.EventStatusEnum, _
ByVal pRecordset As ADODB.Recordset)

' wird periodisch ausgelöst, solange das
' Einlesen der Daten andauert.
End Sub


Nach dem

mRS .Open , , , , adAsyncFetchNonBlocking

wird sofort der nàchste Befehl ausgeführt.
Das Beenden des Einlesens der Daten wird durch das
Auslösen des Ereignisses MRS_FetchComplete() erkannt.
Wàhrend des (lange andauernden) Einlesens der Daten
wird periodisch das Ereignis mRS_FetchProgress()
ausgelöst. Mehr dazu findest Du in der Online-Hilfe zu
"adAyncFetchNonBocking" sowie zu "FetchProgress" und
"FetchComplete".

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen