Init aus Thread klappt nicht!

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
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.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag 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...
Antworten