Structuren an Proceduren übergeben mit AllocateStructure ?
Verfasst: 18.08.2014 09:30
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:
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.
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
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.