PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Multithreadingproblem in VB


TheDarkConquerer
2006-10-23, 23:13:28
Ahoihoi

Ich habe mich seit kurzem wieder mit VB befasst und schreibe zur Zeit eine Client/Server Anwendung.
Das Problem ist, dass ich dafür Threads benutzen muss. Mit folgendem Prog wollte ich testen ob das mit der ThreadErstellung auch funzt.

Form1


Private Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal dwStackSize As Long, lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Boolean
End Type

Dim sec As SECURITY_ATTRIBUTES
Dim ThreadID As Long
Dim ThreadHandle As Long

Private Sub Form_Load()

ThreadHandle = CreateThread(ByVal 0&, &O0, AddressOf inc, &O0, &O0, ThreadID)
CloseHandle (ThreadHandle)

End Sub

Module1 Code:

Dim i As Integer
Dim ret As Integer

Public Sub inc()
ret = 1
For i = 0 To 10
ret = ret + 1
MsgBox ret
Next i
End Sub



Den ersten fehler den er bringt ist folgender:
Compile error: User-Defined type may not be passed ByVal

Sobald ich beim ersten Parameter ne StrukturVariable des Typs SECURITY_ATTRIBUTES übergebe startet zwar das Programm, doch ich bekomme sofort den fehler das VB wegen eines Fehlers beendet werden musste.
Im Eventmanager steht dazu folgendes:

Ereignistyp: Fehler
Ereignisquelle: Application Error
Ereigniskategorie: Keine
Ereigniskennung: 1000
Datum: 23.10.2006
Zeit: 23:00:00
Benutzer: Nicht zutreffend
Computer: mypc
Beschreibung:
Fehlgeschlagene Anwendung vb6.exe, Version 6.0.81.76, fehlgeschlagenes Modul unknown, Version 0.0.0.0, Fehleradresse 0x0012f8b0.

Weitere Informationen über die Hilfe- und Supportdienste erhalten Sie unter http://go.microsoft.com/fwlink/events.asp.
Daten:
0000: 41 70 70 6c 69 63 61 74 Applicat
0008: 69 6f 6e 20 46 61 69 6c ion Fail
0010: 75 72 65 20 20 76 62 36 ure vb6
0018: 2e 65 78 65 20 36 2e 30 .exe 6.0
0020: 2e 38 31 2e 37 36 20 69 .81.76 i
0028: 6e 20 75 6e 6b 6e 6f 77 n unknow
0030: 6e 20 30 2e 30 2e 30 2e n 0.0.0.
0038: 30 20 61 74 20 6f 66 66 0 at off
0040: 73 65 74 20 30 30 31 32 set 0012
0048: 66 38 62 30 0d 0a f8b0..


ich habe schon alles erdenklich ausprobiert. Auch das manuelle setzen der Strukturvariable sec mit With hat nichts geholfen. :mad:

(und bitte keinen Kommentar zum Programmierstil, ich weis selbst das ich unordentlich arbeite ^^)

mfg

TDC

Juerg
2006-10-26, 09:16:08
Also es ist zwar nicht ganz unmöglich in VB6 eine Implementation multithreaded auszuführen *ABER* ... niemanden zu empfehlen. VB6 ist viel weniger thread-safe als VB5 es war.

Sehr zu empfehlende Lektüre dazu von Daniel Applemann:

A Thread to Visual Basic: Multi-Threading In VB5 and VB6
--------------------------------------------------------
http://www.freevbcode.com/ShowCode.Asp?ID=1287


Also goldene Regel:

1. Verwende Visual Basic Express Edition 2005. Period.
2. Wenn nicht möglich oder nicht gewollt verwende wenn immer möglich VB5.
3. Verwende unter keinen Umständen die CreateThread API, benutze stattdessen ActiveX COM Server und/oder DLLs.
4. Verwende nicht VB6
5. Verwende nicht CreateThread
6. Verwende nicht VB6
7. Verwende nicht CreateThread
8. Verwende nicht VB6
9. Verwende nicht CreateThread

TheDarkConquerer
2006-10-29, 21:12:54
also erstma thx für die Antwort ;)

ich hab auch schon oft gelesen das VB6 absolut ungeeignet ist für Threadbasierte Anwendungen. In Java is das ganze ja relativ simpel aber ich wollt halt das Prog in Vb schreiben.

Vb Express 2005 hab ich noch irgendwo auf CD, werd ich vielleicht ma testen.

Was nur komisch is, folgender Code funzt wundbar:



Classmodul clsThread;
'Creates a new Thread
Dim mHandle As Long
Dim CreationFlags As Long
Dim lpThreadID As Long

'Look if the thread has already been created
If mCreated = True Then Exit Function

'Look if the thread should be enabled
If cEnabled = True Then
CreationFlags = 0
Else
'Create a disabled thread, can be enabled later with the
''Enabled' property
CreationFlags = CREATE_SUSPENDED
End If

'The CreateThread Function returns the handle of the created thread;
'if the handle is 0, it failed creating the thread
mHandle = CreateThread(ByVal 0&, ByVal 0&, cFunction, ByVal 0&, CreationFlags, lpThreadID)

If mHandle = 0 Then 'Failed creating the thread
'Insert your own error handling
'Debug.Print "InitializeThread Function in clsThreading failed creating a new thread"
Else
mThreadHandle = mHandle
mThreadID = lpThreadID
mCreated = True

Modul1:

Public Function ShowMovingLine()
'Displays a line moving from the top of the PictureBox to the bottom
'in frmTest
Dim PosBuf As Integer
Dim TimeBuf As Long
Do
TimeBuf = timeGetTime
'Clear the PictureBox
frmTest.picOutput(0).Cls
'Paint the line into the PictureBox
frmTest.picOutput(0).Line (0, PosBuf)-(frmTest.picOutput(0).Width, PosBuf)

PosBuf = PosBuf + 1
If PosBuf > frmTest.picOutput(0).Height Then
'Set position back to the top of the PictureBox
PosBuf = 0
End If

'Wait some milliseconds...
Do While timeGetTime - TimeBuf < 5
Sleep 2
Loop
Loop
End Function

Public Function ShowAnimation()
'Displays a simple Animation using single pictures in frmTest
Dim PicNumber As Integer
Dim TimeBuf As Long
Do
TimeBuf = timeGetTime
'Put the actual picture into the PictureBox
frmTest.picDisplay.Picture = frmTest.imgAnimation(PicNumber).Picture

PicNumber = PicNumber + 1
If PicNumber > 3 Then PicNumber = 0

'Wait some milliseconds...
Do While timeGetTime - TimeBuf < 5
Sleep 100
Loop
Loop
End Function



das ganze is ein VB Multithreading Beispiel und klappt wunderbar. Und in meiner VB Serverapp. sieht das nicht viel anders aus :frown:

Juerg
2006-11-02, 13:39:11
Das Ganze ist *kein* Beispiel für Multithreading. Weder in VB6 noch sonst irgendwo. Das sind ein paar unfertige Code-Schnipsel die folgende Aussagekraft haben:
Entweder bist Du ein Troll oder hast tatsächlich keine Ahnung.

Was Du mit der Klasse clsThread anfängst weiss der Geier. Dasselbe gilt für die Methode ShowAnimation sowie für ShowMovingLine. Aber da die Message WM_PAINT in Windows sowieso asynchron in der Anwendung aufgerufen wird, schaltet das Ganze in den angegebenen Millisekunden Takt hin und her.

Ganz nett. Dafür brauchst Du weder Threads noch Server und schon gar kein Aufruf der CreateThread API.

Ganz ehrlich, beschäftige Dich mal mit den Grundlagen im oben genannten Link von Daniel Applemann.

TheDarkConquerer
2006-11-06, 22:50:49
Freundlichkeit wird hier auch nicht mehr groß geschrieben -.-

ich weis ja nicht wie professionelle Programmierer sowas lösen, aber eins weis ich sicher: nicht mit dem VB-Timer :D. Für eine Serveranwendung ist ein Thread nunmal praktisch und selbst wenn das ganze unter VB "etwas" unsicher ist funktioniert es doch.

Die Aussage "Ich sei ein Troll" möchte ich an dieser Stelle gerne zurückweisen, wenn es dir hilft poste ich die ganzen Projektdateien und dann wirst du sehen, dass das sehr wohl "ein" Beispiel für Multithreading unter VB ist (allerdings ein sehr umständliches finde ich, das ganze kann man auch ohne Klassenmodul realisieren).