Init aus Thread klappt nicht!
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Wenn du alle DX Funktionen in einen Thread packst sollte das auch gehen. D.h. InitSprite, OpenScreen, LoadSprite, DisplaySprite etc. muss dann alles drin sein.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Der PB-Befehl CreatThread() verlangt immer ein Parameter, den er an
die Prozedur weiter gibt, die als Thread gestartet wird. Passiert dies nicht,
kann es zu unerwarteten Fehlern führen. Fehler, die du nie mals finden
wirst. Daher Prozeduren, welche als Thread gestartet werden sollen,
immer mit einem LONG-Parameter ausstatten.
Hm, stimmt ... wenn man alle DX-Befehle in einen Thread packt, dann
gehts tatsächlich:
MFG PMV
die Prozedur weiter gibt, die als Thread gestartet wird. Passiert dies nicht,
kann es zu unerwarteten Fehlern führen. Fehler, die du nie mals finden
wirst. Daher Prozeduren, welche als Thread gestartet werden sollen,
immer mit einem LONG-Parameter ausstatten.
Hm, stimmt ... wenn man alle DX-Befehle in einen Thread packt, dann
gehts tatsächlich:
Code: Alles auswählen
Global StopThread.l = #False
Procedure SpriteBefehle(ID.l)
InitSprite()
OpenWindowedScreen(ID, 0, 0, 640, 480, 0, 0, 0)
CreateSprite(0, 100, 100)
StartDrawing(SpriteOutput(0))
For x = 0 To 99
For y = 0 To 99
Plot(x, y, x * y * 100)
Next
Next
StopDrawing()
Timer = ElapsedMilliseconds()
Repeat
If Timer + 1000 <= ElapsedMilliseconds()
ClearScreen(0)
DisplaySprite(0, Random(639), Random(479))
Timer + 1000
EndIf
FlipBuffers(#True)
Until StopThread = #True
EndProcedure
ID = OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "Sprite Thread")
While WindowEvent() : Wend
Thread = CreateThread(@SpriteBefehle(), ID)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
StopThread = #True
WaitThread(Thread)
Könnte es sein, dass jeder Thread für sich (auch der Mainthread) DirectX initialiseren muss?PMV hat geschrieben:Prozeduren, welche als Thread gestartet werden sollen,
immer mit einem LONG-Parameter ausstatten.{/quote]Aber warum gehen dann auch Strings? Früher hatte ich mal einen Code, da habe ich Strings übergeben und es klappte. Ist das wieder sonne Sache, wie Sachen intern in PB übergeben werden? Kenne mich da nicht so aus...
PMV hat geschrieben:Hm, stimmt ... wenn man alle DX-Befehle in einen Thread packt, dann gehts tatsächlich
(Wo) Gibt es da mehr Infos?
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
CreateThread() arbeitet auch mit Strings so wies aussieht. Double klappt
aber z.b. nicht, genau so wie Quad. Intern weis ich nicht wie das
gehandelt wird, aber sicher ist nur die Long-Variante, sofern da niemand
anders aushilft. Strings werden intern sicher in die Zeiger umgewandelt,
damit das bomben fest ist sollte man da wohl besser direkt mit Zeigern
hantieren, was aber wiederrum nicht grad für Anfänger geeignet ist.
Dokumentiert ist nur die Long-Variante, da kein Datentyp angegeben ist.
MFG PMV
aber z.b. nicht, genau so wie Quad. Intern weis ich nicht wie das
gehandelt wird, aber sicher ist nur die Long-Variante, sofern da niemand
anders aushilft. Strings werden intern sicher in die Zeiger umgewandelt,
damit das bomben fest ist sollte man da wohl besser direkt mit Zeigern
hantieren, was aber wiederrum nicht grad für Anfänger geeignet ist.
Dokumentiert ist nur die Long-Variante, da kein Datentyp angegeben ist.
MFG PMV
Ein Thread kann man nur eine 32Bit Wert übergeben. Diese kann ein Long oder Pointer sein
Bei übergabe von eine String in einen Thread wird ja nur der Pointer auf den String übergeben.
Strings sind immer nur Pointer, es sei den man deklariert ein String mit fester länge (String{x}).
Um ein Quad oder Double zu übergeben den Pointer auf den Wert Übergeben (ByRef)
Bei übergabe von eine String in einen Thread wird ja nur der Pointer auf den String übergeben.
Strings sind immer nur Pointer, es sei den man deklariert ein String mit fester länge (String{x}).
Um ein Quad oder Double zu übergeben den Pointer auf den Wert Übergeben (ByRef)
Code: Alles auswählen
Procedure MyThread(*Value.quad)
Debug *Value\q
EndProcedure
wert.q = $7FFFFFFFFFFFFFFF
hThread = CreateThread(@MyThread(), @Wert)
WaitThread(hThread)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- hardfalcon
- Beiträge: 3447
- Registriert: 29.08.2004 20:46