thread problem...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: thread problem...

Beitrag von NicTheQuick »

Deine Thread-Procedure muss einen Parameter vom Typ Integer haben, auch wenn du ihn nicht verwendest.
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: thread problem...

Beitrag von teamO »

Dank für die Antworten.

Leider besteht mein Probelm immernoch. :cry:

Ich hab die 800 Zeilen jetzt mal auf 80 zusammengeschrumpft. Der Code kann jetzt nichts mehr außer den IMA zu erzeugen - aber darin ist er richtig gut.

hier ist er:

Code: Alles auswählen

;-inital Vars
;window and resolution
width=512
height=512

; colonie
numberOfColonies=1


; ------------------------------------------------------------------------------
;-structs

Structure pheromonMap
  Array strength.f(2)
EndStructure

Structure colony
  Array pheromonMap.pheromonMap(0) ;array, that contains pointer to the pheromon List
  pheroMapMutex.i
EndStructure

Global Dim colony.colony(numberOfColonies-1)


For i=0 To numberofColonies-1
  Dim colony(i)\pheromonMap(width*height-1)
  colony(i)\pheroMapMutex=CreateMutex()
Next


Global all.i=CreateMutex()

Procedure refreshPheromonMap(dummy)
  width=512
  height=512
    resizedWidth=129
  Dim pheroMapTmp.pheromonMap(width*height-1)

  Repeat
    LockMutex(all)
;    LockMutex(colony(0)\pheroMapMutex)  ;unnötig
    Swap colony(0)\pheromonMap(), pheroMapTmp()
;    UnlockMutex(colony(0)\pheroMapMutex)
    UnlockMutex(all)
    Delay(100)
  ForEver
EndProcedure


;-test
InitSprite()
OpenWindow(0,200,200,width,height,"AntWar",#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(0),0,0,width,height,0,0,0)

t2=CreateThread(@refreshPheromonMap(),0)

Repeat

  Repeat ;some window stuff...
    event=WindowEvent()
    If Event = #PB_Event_CloseWindow
      End 
    EndIf
  Until Event = 0

  StartDrawing(ScreenOutput())
  Box(0,0,width-1,width-1)
  LockMutex(all)
  For colony=0 To numberOfColonies-1
   ;     LockMutex(colony(0)\pheroMapMutex);unnötig...
  
    asdf=colony(0)\pheromonMap(0)\strength(0);read error at adress 4294967288
  
;  UnlockMutex(colony(0)\pheroMapMutex)
  Next
  UnlockMutex(all)
  StopDrawing()
  FlipBuffers()

    Delay(1)
ForEver  
End
hat jemand ne idee, was der unterschied zu dem ist, was ich gestern gepostet hab?
Ist doch genau das gleiche Prinzip! Oder hab ich da was übersehen? So langsam beginne ich Threads zu hassen...
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: thread problem...

Beitrag von STARGÅTE »

also dieser IMA hat nichts mit dem Thread zu tun, sonden mit dem "hinundher geschiebe" der Arrays an sich.

Schreibt man den Code so um, das er ohne Threads läuft,kommen auch IMAs

Ich vermute es liegt an den Structure-Arrays die du mit den normanen vertauschst ...

Ich versehe allerdings nicht wieso du überhaupt Array in der Struktur nutzt, bei diesem Code reicht die klassische Forum mit statischen Array doch auch ?

Die sache mit Arrays in Structuren (also mit dem schlüsselwort Array) ist ja noch sehr neu, ich weiß nicht genau ob sachen wie Swap damit überhaupt schon funktionieren, vorallem weil ja interne Array mit geswapt werden müssten ...

Fest steht das es nicht mit Threads zu tun hat ! denn hier kommt der gleiche Fehler:

Code: Alles auswählen

;-inital Vars
;window and resolution
width=512
height=512

; colonie
numberOfColonies=1


; ------------------------------------------------------------------------------
;-structs

Structure pheromonMap
  Array strength.f(2)
EndStructure

Structure colony
  Array pheromonMap.pheromonMap(0) ;array, that contains pointer to the pheromon List
  pheroMapMutex.i
EndStructure

Global Dim colony.colony(numberOfColonies-1)


For i=0 To numberofColonies-1
  Dim colony(i)\pheromonMap(width*height-1)
;  colony(i)\pheroMapMutex=CreateMutex()
Next


;Global all.i=CreateMutex()

Procedure refreshPheromonMap(dummy)
  width=512
  height=512
    resizedWidth=129
  Dim pheroMapTmp.pheromonMap(width*height-1)

;   Repeat
;     LockMutex(all)
;    LockMutex(colony(0)\pheroMapMutex)  ;unnötig
    Swap colony(0)\pheromonMap(), pheroMapTmp()
;    UnlockMutex(colony(0)\pheroMapMutex)
;     UnlockMutex(all)
;     Delay(100)
;   ForEver
EndProcedure


;-test
InitSprite()
OpenWindow(0,200,200,width,height,"AntWar",#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(0),0,0,width,height,0,0,0)

;t2=CreateThread(@refreshPheromonMap(),0)

Repeat

  Repeat ;some window stuff...
    event=WindowEvent()
    If Event = #PB_Event_CloseWindow
      End 
    EndIf
  Until Event = 0

  StartDrawing(ScreenOutput())
  Box(0,0,width-1,width-1)

  refreshPheromonMap(dummy) ; << eingefühgt !
;   LockMutex(all)
  For colony=0 To numberOfColonies-1
   ;     LockMutex(colony(0)\pheroMapMutex);unnötig...
  
    asdf=colony(0)\pheromonMap(0)\strength(0);read error at adress 4294967288
  
;  UnlockMutex(colony(0)\pheroMapMutex)
  Next
;   UnlockMutex(all)
  StopDrawing()
  FlipBuffers()

    Delay(1)
ForEver  
End 
Man müsste das mal etwas genauer betrachten, um den Fehler zu finden ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: thread problem...

Beitrag von teamO »

STARGÅTE hat geschrieben:Ich versehe allerdings nicht wieso du überhaupt Array in der Struktur nutzt, bei diesem Code reicht die klassische Forum mit statischen Array doch auch ?
Im "richtigen" Programm gehts nicht anders - oder nur sehr umständlich.
STARGÅTE hat geschrieben:Ich vermute es liegt an den Structure-Arrays die du mit den normanen vertauschst ...
Hast recht gehabt. Wenn ich statt dem nicht-structure-Array ein Array der selben structure nehme, dann gehts tadellos. Ist das so gewollt? oder ein Bug?

PS: einen *amKopfKratzSimly* wäre echt cool. Ich hätte ihn schon oft gebrauchen können :lol:
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: thread problem...

Beitrag von Thorium »

teamO hat geschrieben: Hast recht gehabt. Wenn ich statt dem nicht-structure-Array ein Array der selben structure nehme, dann gehts tadellos. Ist das so gewollt? oder ein Bug?
Wenns so gewollt ist, dann würde zumindest die Compilerfehlermeldung fehlen.
Am besten mal hier in englisch melden.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: thread problem...

Beitrag von STARGÅTE »

PS: einen *amKopfKratzSimly* wäre echt cool. Ich hätte ihn schon oft gebrauchen können
sowas hier: Bild
Zuletzt geändert von STARGÅTE am 09.07.2010 17:28, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: thread problem...

Beitrag von teamO »

Genau! Aber bei mir gibts den nicht :cry: . Den hast du über [img ] eingebunden, oder?
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Re: thread problem...

Beitrag von a14xerus »

teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: thread problem...

Beitrag von teamO »

noch eine letzte (hoffentlich...) Frage zum Thema Threads:
In meinem Programm laufen jetzt zwei Threads parallel. Im Taskmanager werden aber 4 angezeigt. Debugger ist aus. Hat jemand ne idee, an was das liegt?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: thread problem...

Beitrag von STARGÅTE »

naja ein Thread läuft ja eh immer, nämlcih das eigentliche Programm selber das wird ja mit gezählt.

und wnmn ich dann sowas heir starte:

Code: Alles auswählen

Procedure test(z)
  Repeat
    Delay(10)
  ForEver
EndProcedure

CreateThread(@test(), 2)
CreateThread(@test(), 2)

Repeat
  Delay(10)
ForEver
werden genau 3 Threads angezeigt, also alles richtig.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten