![]() |
Delphi-Version: XE7
FloatToStr nicht Thread-sicher aber erweiterte Form?
Was bedeutet die Aussage der Online-Hilfe?
Zitat:
Ihr könnt davon ausgehen, dass ich die Suchfunktion bereits zum glühen gebracht habe, aber dazu gibt es keine Aussage. Es geht konkret um ein Projekt, in dem durchweg ein Punkt als Dezimaltrenner verwendet werden muss. Bisher sind DIE FormatSettings Bestandteil eines Objekts, das praktisch allen Programmteilen bekannt ist und eine Funktion zum Abruf dieser Struktur besitzt. Kann die Funktion nun einen Zeiger auf die Formatsettings zurückgeben, muss der Inhalt zurückgegeben werden oder muss jeder Thread eine neue Struktur erzeugen? Vielen Dank im Voraus PS: Es ist ein C++-Projekt, aber da dürften ggü. Delphi keine Unterschiede bestehen. |
AW: FloatToStr nicht Thread-sicher aber erweiterte Form?
Daten sollten nicht unsychronsiert zwischen Thraeds geteilt werden.
|
AW: FloatToStr nicht Thread-sicher aber erweiterte Form?
Zitat:
Delphi-Quellcode:
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).
FloatToStr
Das
Delphi-Quellcode:
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.
FloatToStr
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
Delphi-Quellcode:
mitteilen welches Dezimaltrennzeichen er beachten soll. Ein Beispiel:
FloatToStr
Delphi-Quellcode:
var
fs: TFormatSettings; s: string; begin fs.DecimalSeparator := ','; //falls Komme erwünscht s := FloatToStr(3.95, fs); ShowMessage(s); end; |
AW: FloatToStr nicht Thread-sicher aber erweiterte Form?
Zitat:
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... :-D |
AW: FloatToStr nicht Thread-sicher aber erweiterte Form?
Alle Funktionen, die z.B. mit den
Delphi-Quellcode:
arbeiten sind nicht threadsafe, denn der interne Aufruf sieht so aus:
FormatSettings
Delphi-Quellcode:
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.
function FloatToStr(Value: Extended): string;
begin Result := FloatToStr(Value, FormatSettings); // GLOBALE Variable FormatSettings wird benutzt end; Korrekt wäre es einem Thread eine eigene
Delphi-Quellcode:
Variable zu verpassen, die dann innerhalb des Threads verwendet wird.
FormatSettings
|
AW: FloatToStr nicht Thread-sicher aber erweiterte Form?
Zitat:
Delphi-Quellcode:
gefragt, nicht nach
FloatToStr
Delphi-Quellcode:
. Ersteres fliegt einem in der Regel nicht um die Ohren.
StrToFloat
Zitat:
@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? |
AW: FloatToStr nicht Thread-sicher aber erweiterte Form?
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! |
AW: FloatToStr nicht Thread-sicher aber erweiterte Form?
Zitat:
Zitat:
|
AW: FloatToStr nicht Thread-sicher aber erweiterte Form?
Zitat:
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. |
AW: FloatToStr nicht Thread-sicher aber erweiterte Form?
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
Delphi-Quellcode:
etc. sind in C++ eh nicht verwendbar, weil die globalen Variablen
FloatToStr
Delphi-Quellcode:
etc. nicht verfügbar sind und auch über
DecimalSeparator
Delphi-Quellcode:
nicht ansprechbar.
TFormatSettings::DecimalSeparator
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:16 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