AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language C++ FloatToStr nicht Thread-sicher aber erweiterte Form?
Thema durchsuchen
Ansicht
Themen-Optionen

FloatToStr nicht Thread-sicher aber erweiterte Form?

Ein Thema von Mikkey · begonnen am 24. Jun 2015 · letzter Beitrag vom 24. Jun 2015
Antwort Antwort
Popov
(Gast)

n/a Beiträge
 
#1

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 11:46
Was bedeutet die Aussage der Online-Hilfe?
Das bedeutet, dass dir FloatToStr u. U. um die Ohren fliegen kann, weil irgendwer für den Preis 3,95 Euro in das Feld 3,95 eingibt (mit Komma), im System aber als Dezimaltrennzeichen ein Punkt (.) eingetragen ist und dein Programm deshalb ein 3.95 erwarten (mit Punkt).

Das FloatToStr richtet sich immer nach dem im System eingetragenem Dezimaltrennzeichen, was an für sich keine schlechte Idee ist. Das kann aber gelegentlich zu Problemen führen. Hier bist also nicht du der Herr über das Dezimaltrennzeichen in deinem Programm, sondern das System.

Wieso man das nun mit Thread-Sicherheit beschreibt fällt mir nicht ein. Gemeint ist aber damit, dass es u. U. zu Fehlermeldungen kommt wenn ein falsches Zeichen eingegeben wird. Mit der zweiten Form kann man nämlich FloatToStr mitteilen welches Dezimaltrennzeichen er beachten soll. Ein Beispiel:
Delphi-Quellcode:
var
  fs: TFormatSettings;
  s: string;
begin
  fs.DecimalSeparator := ','; //falls Komme erwünscht
  s := FloatToStr(3.95, fs);
  ShowMessage(s);
end;
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 12:27
Wieso man das nun mit Thread-Sicherheit beschreibt fällt mir nicht ein.
Naja, angenommen du gewöhnst dir einfach an, immer am globalen Decimal-Separator herumzuspielen wenn du es grade brauchst dann bekommst du ein Problem wenn du anfängst mit mehreren Threads zu arbeiten.

Die Hilfe erzählt manchmal gerne
Das beste ist, wo sie irgendwo zu Methoden eines TDataSets anfangen zu erklären, was eigentlich virtuelle Methoden sind. Wenn man ja schon dabei ist...
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 12:44
Alle Funktionen, die z.B. mit den FormatSettings arbeiten sind nicht threadsafe, denn der interne Aufruf sieht so aus:
Delphi-Quellcode:
function FloatToStr(Value: Extended): string;
begin
  Result := FloatToStr(Value, FormatSettings); // GLOBALE Variable FormatSettings wird benutzt
end;
Und eine globale Variable ist nun mal nicht threadsafe (es gibt da Ausnahmen, aber die wollen wir mal aussen vor lassen), denn in diese kann man jederzeit von überall einfach reingreifen und verändern.

Korrekt wäre es einem Thread eine eigene FormatSettings Variable zu verpassen, die dann innerhalb des Threads verwendet wird.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (24. Jun 2015 um 12:47 Uhr)
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#4

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 12:49
Das bedeutet, dass dir FloatToStr u. U. um die Ohren fliegen kann
Ich habe mit Absicht nach FloatToStr gefragt, nicht nach StrToFloat . Ersteres fliegt einem in der Regel nicht um die Ohren.
Wieso man das nun mit Thread-Sicherheit beschreibt fällt mir nicht ein
Genau darum dreht sich aber die Frage, kann man sich auf die Umkehrung der OH-Aussage verlassen?

@mkinzler:
Üblicherweise können Daten, die nur gelesen werden, ohne Weiteres zwischen verschiedenen Threads geteilt werden.

@Günther:
Das macht Sinn, müsste dann aber auch den Schluss zulassen, dass ich mit einer einzelen FormatSettings-Struktur auch in mehreren Threads arbeiten kann?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 12:56
Das Hauptproblem ist doch, dass man die Zugriffe auf eine gemeinsame Struktur nicht kontrollieren kann. Man muss im gesamten Programm höllisch aufpassen, da nicht irgendwie reinzugrätschen um dadurch die lustigsten Fehler zu erhalten: "Geht meistens, aber nicht kurz nach Sonnenuntergang!"

Das ist das Salz in der Suppe beim Multi-Threading!
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#6

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 12:57
Üblicherweise können Daten, die nur gelesen werden, ohne Weiteres zwischen verschiedenen Threads geteilt werden.
Man kann sich noch darüber streiten, ob das Starten eines Threads eine Synchronisation ist

Das ist das Salz in der Suppe beim Multi-Threading!
Und Speichersemantik sind die Speckgrieben.

Geändert von BUG (24. Jun 2015 um 13:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#7

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 13:35
Zitat:
nicht threadsicher
Ohne den Settings-Parameter gehen diese Funktionen auf die globale FormatSettings-Variable
und was ein nicht abgesicherter Zugriff auf globale Variablen bedeutet, daß verstehst du doch?
Vorallem wenn während dessen irgendwer diese Variable mal wieder bösartig verändern könnte.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#8

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 14:00
Es geht mir nicht darum, dass ich die globale Variable verwenden möchte, sondern darum, ob der Umkehrschluss, dass bei einer eigenen Variablen, die von allen Threads lesend(!) verwendet wird, Probleme auftreten können. Fall ja: Reicht eine flache Kopie der Struktur oder muss sie komplett neu erzeugt werden.

Als Hinweis:
Die vereinfachten Methoden FloatToStr etc. sind in C++ eh nicht verwendbar, weil die globalen Variablen DecimalSeparator etc. nicht verfügbar sind und auch über TFormatSettings::DecimalSeparator nicht ansprechbar.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#9

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 15:44
Wenn du die erweiterte Version nimmst und in mehreren Threads aufrufst, dann trifft genau das Selbe zu ... nur halt in einem kleineren und abgegrenzteren Raum, welchen nur du kontrollierst.

Nur Lesen ist weitestgehenst thread-save, wobei die globale Variable, z.B. durch ein WM_WININICHANGE, sich urplözlich mal ändern könnte.
Die Referenzzählung von LongStrings ist thread-save implementiert. (was hier also z.B. die DateFormat-Strings betrifft)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (24. Jun 2015 um 15:46 Uhr)
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#10

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 16:46
Vielen Dank, das war das, was ich wissen wollte.

Die Möglichkeit der flachen Kopie scheidet wegen der höchstwahrscheinlich dann gestörten Referenzzählung dann auch aus.

Die Klasse, die die Formateinstellungen bereitstellt, sieht nun so aus:
Code:
class...
{
  TFormatSettings m_FormatSettings;
...
  TFormatSettings* GetFormatSettings() {return &m_FormatSettings;};
};
GetFormatSettings() ist Funktion einer implementierten Schnittstelle und deshalb kein __property .

m_FormatSettings wird beim Erzeugen der Instanz wie benötigt gefüllt und danach nicht mehr verändert.

Geändert von Mikkey (24. Jun 2015 um 16:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz