Seite 1 von 1

Structuren an Proceduren übergeben mit AllocateStructure ?

Verfasst: 18.08.2014 09:30
von Makke
Hallo zusammen,

folgendes beschäftigt mich, ich habe ein Programm das eine Structure an mehrere Proceduren (ggfs. auch nur Teile davon) bzw. Threads übergibt, damit diese die Structure befüllen, ist es sinnvoller und sicherer dies Structure dann im Vorfeld mit AllocateStructure() zu initialisieren und dann weiter zu reichen oder ist das relativ egal.

Hier mal ein Pseudocode Beispiel wie ich es im Moment mache:

Code: Alles auswählen

Structure structList
  name.s
  List number.s()
EndStructure

Structure structData
  source.s
  target.s
  srcLst.structList
  tarLst.structList
  Array timer.l(9)
EndStructure


Procedure DoThis(*struct.structList)
  Protected.l n
  For n = 65 To 90
    AddElement(*struct\number())
    *struct\number() = Chr(n)
  Next
EndProcedure

Procedure DoThat(*struct.structList)
  Protected.l n
  For n = 90 To 65 Step -1
    AddElement(*struct\number())
    *struct\number() = Chr(n)
  Next
EndProcedure

Procedure.l Main(*myData.structData, TryNb.l=1)
  
  Protected.b exit
  Protected.i thread1, thread2
  
  If TryNb > 10
    TryNb = 1
  EndIf
  TryNb - 1
  
  *myData\source = "myData"
  *myData\target = "myBackup"
  
  *myData\timer(TryNb) = ElapsedMilliseconds()
  
  thread1 = CreateThread(@DoThis(), *mydata\srcLst)
  thread2 = CreateThread(@DoThat(), *mydata\tarLst)
  
  Repeat
    
    Delay(10)
    
    If IsThread(thread1) = 0 And IsThread(thread2) = 0
      exit = #True
    EndIf
    
  Until exit = #True
  
  *myData\timer(TryNb) = ElapsedMilliseconds() - *myData\timer(TryNb)
  
  ProcedureReturn *myData\timer(TryNb)
  
EndProcedure

Define.l          time
Define.structData mainData

time = Main(mainData)

MessageRequester("Pseudo", "Threads needed " + Str(time) + " ms for procedure.")

End
Kompilierung erfolgt im Thread sicheren Modus, ansonsten wird es wohl (aufgrund der vielen Strings) nicht funktionieren.

Kann es bei der oben stehenden Variante zu Fehlern kommen, z.B. das Daten verloren oder beschädigt werden wenn ich es so mache ? Oder sollte man dort noch mit Mutexen arbeiten ? Stört es wenn innerhalb einer Struktur zwei unterschiedliche Listen bearbeitet werden (zur gleichen Zeit) ?

Danke im Voraus für Eure Tips und Hilfen.

Re: Structuren an Proceduren übergeben mit AllocateStructure

Verfasst: 18.08.2014 09:36
von STARGÅTE
AllocateStructure() brauchst du nur, wenn du selbst einen Speicher reservieren willst.
Solange du Variablen mit Global, Threaded, Define, Protected usw. definierst, ist der Speicher bereits definiert.

So wie der Code jetzt ist, brauchst du nicht zwingend ein Mutex, da wie du selbst sagtest, beide Threads und Main, nicht auch gleiche Ressourcen zugreifen.

Re: Structuren an Proceduren übergeben mit AllocateStructure

Verfasst: 20.08.2014 08:49
von Makke
Vielen Dank für Deine Antwort Stargate. Ich war mir nicht sicher wenn ich zwei Listen aus der gleichen Struktur zur gleichen Zeit abarbeiten lasse.