Thread mit String Parameter

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

helpy hat geschrieben:Wenn der Pointer auf einen String übergeben wird (mit welcher Methode auch immer), muss in jedem Fall vom Programmierer sicher gestellt werden, dass der String nicht verändert wird, solange dieser nicht endgültig vom Thread (oder von was auch immer ;-)) verarbeitet worden ist.

Ich habe da vor kurzem etwas ähnliches, wie den folgenden Code verwendet:

Code: Alles auswählen

Procedure NewTmpString(s.s)
	Protected *s.String = AllocateMemory(StringByteLength(s)+SizeOf(Character))
	If *s
		PokeS(*s,s)
	EndIf
	ProcedureReturn *s
EndProcedure

Procedure.s GetTmpString(*s.String)
	Protected s.s
	If *s
		s = PeekS(*s)
		FreeMemory(*s)
	EndIf
	ProcedureReturn s
EndProcedure
Das ist nur eine Möglichkeit!

cu, guido
Du hast ein Speicherleck in deiner zweiten Methode, der String wird nicht freigegeben.
Siehe hier: http://www.purebasic.fr/english/viewtopic.php?t=33703 (2. Post)
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

milan1612 hat geschrieben:Du hast ein Speicherleck in deiner zweiten Methode, der String wird nicht freigegeben.
Siehe hier: http://www.purebasic.fr/english/viewtopic.php?t=33703 (2. Post)
Da muss ich Dir widersprechen!

Das Speicherleck habe ich nur, wenn ich z.B. folgendes mache:

1. Struktur mit Stringelementen definieren

Code: Alles auswählen

Structure TEST
  x.l
  y.s
  ; und noch mehr
EndStructure
2. Speicherbereich für die Struktur mit AllocateMemory anlegen

Code: Alles auswählen

*t.TEST = AllocateMemory(SizeOf(TEST))
3. Stringelemente mit Strings beschreiben:

Code: Alles auswählen

*t\y = "Irgendein String ..."
==> Hier wird vom der PB-Stringverwaltung ein Speicher für den String allokiert!!!!

4. Speicherbereich der Struktur wieder freigeben:

Code: Alles auswählen

FreeMemory(*t)
==> Der von mir allokierte Speicherbereich wird freigegeben!!!
==> Der von der PB-Stringverwaltung allokierte Speicherbereich wird NICHT freigegeben!!!


==> Und nun schau Dir meinen Code oben nochmals an. Da wird nur in der Procedur GetTmpString() die PB-Stringverwaltung in Anspruch genommen ... und dort wird die Stringvariable s.s am Ende der Procedure ordnungsgemäß von der PB-Stringverwaltung freigegeben!!!

cu, guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Thorium hat geschrieben:
Andreas_S hat geschrieben:Kopieren wäre besser, da du normalerweise den Speicher auf den der Parameter zeigt nicht werändern sollst...
Wieso denn das?
Mit dem Speicher kann man machen was man will, bzw. mit dem Parameter.
Das ist einfach nicht gut gekapselt... wenn du dann den Speicher unabsichtlich manipulierst und dein code ist schon etwas länger und komplizierter, dann wird die Fehlersuche zum größten Problem.
Und mit Fehler suchen vergeudet man doch nicht gerne die Zeit, oder?

Sowas sollte man nur machen wenn der code 1. keine Fehler hat und 2. man viel Performance braucht.
Sonnst wäre es unsinn...
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

helpy hat geschrieben:
milan1612 hat geschrieben:Du hast ein Speicherleck in deiner zweiten Methode, der String wird nicht freigegeben.
Siehe hier: http://www.purebasic.fr/english/viewtopic.php?t=33703 (2. Post)
Da muss ich Dir widersprechen!

Das Speicherleck habe ich nur, wenn ich z.B. folgendes mache:

1. Struktur mit Stringelementen definieren

Code: Alles auswählen

Structure TEST
  x.l
  y.s
  ; und noch mehr
EndStructure
2. Speicherbereich für die Struktur mit AllocateMemory anlegen

Code: Alles auswählen

*t.TEST = AllocateMemory(SizeOf(TEST))
3. Stringelemente mit Strings beschreiben:

Code: Alles auswählen

*t\y = "Irgendein String ..."
==> Hier wird vom der PB-Stringverwaltung ein Speicher für den String allokiert!!!!

4. Speicherbereich der Struktur wieder freigeben:

Code: Alles auswählen

FreeMemory(*t)
==> Der von mir allokierte Speicherbereich wird freigegeben!!!
==> Der von der PB-Stringverwaltung allokierte Speicherbereich wird NICHT freigegeben!!!


==> Und nun schau Dir meinen Code oben nochmals an. Da wird nur in der Procedur GetTmpString() die PB-Stringverwaltung in Anspruch genommen ... und dort wird die Stringvariable s.s am Ende der Procedure ordnungsgemäß von der PB-Stringverwaltung freigegeben!!!

cu, guido
Sorry, hab nicht genau genug geschaut :oops:
:)
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Bei verwendung von Strings bei Threads ist es immer besser eine Struktur zu übergeben. Da Thread asyncron laufen muss man sich ein Kopf um die konsistents der Daten selber machen. Vielleicht Handshake flags als Globale Long Variablen anlegen.

Die sache mit den Speicherleck bei der Strings in Stkturen und FreeMemory ist bereits gelöst.
Siehe: http://www.purebasic.fr/english/viewtop ... highlight=

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten