Seite 2 von 2

Verfasst: 10.11.2007 16:19
von DarkDragon
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.

Verfasst: 10.11.2007 20:38
von PMV
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:

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)
MFG PMV

Verfasst: 10.11.2007 23:49
von AND51
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
Könnte es sein, dass jeder Thread für sich (auch der Mainthread) DirectX initialiseren muss?
(Wo) Gibt es da mehr Infos?

Verfasst: 11.11.2007 01:19
von PMV
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

Verfasst: 11.11.2007 04:44
von mk-soft
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)

Code: Alles auswählen

Procedure MyThread(*Value.quad)
  Debug *Value\q
EndProcedure

wert.q = $7FFFFFFFFFFFFFFF
hThread = CreateThread(@MyThread(), @Wert)

WaitThread(hThread)

Verfasst: 11.11.2007 14:47
von hardfalcon
*Wenn* du die Direct-X-Befehle, die du brauchst, in unterschiedliche Threads packen würdest (oder auch nur einen Teil in einen Thread, und den andern Teil "normal", sprich ohne Thread reinpacken würdest), hättest du am Ende sogenannte "Racing Conditions". Sowas kann sehr fiese Bugs auslösen...