TFormatSettings

7 отговора 180 прегледа
#1

TFormatSettings

Някои може ли да ми обясни за какво става дума?

{ Thread safe currency and date/time formatting

The TFormatSettings record is designed to allow thread safe formatting,
equivalent to the gloabal variables described above. Each of the
formatting routines that use the gloabal variables have overloaded
equivalents, requiring an additional parameter of type TFormatSettings.

A TFormatSettings record must be populated before use. This can be done
using the GetLocaleFormatSettings function, which will populate the
record with values based on the given locale (using the Win32 API
function GetLocaleInfo). Note that some format specifiers still require
specific thread locale settings (such as period/era names).
}

type
TFormatSettings = record
CurrencyFormat: Byte;
NegCurrFormat: Byte;
ThousandSeparator: Char;
DecimalSeparator: Char;
CurrencyDecimals: Byte;
DateSeparator: Char;
TimeSeparator: Char;
ListSeparator: Char;
CurrencyString: string;
ShortDateFormat: string;
LongDateFormat: string;
TimeAMString: string;
TimePMString: string;
ShortTimeFormat: string;
LongTimeFormat: string;
ShortMonthNames: array[1..12] of string;
LongMonthNames: array[1..12] of string;
ShortDayNames: array[1..7] of string;
LongDayNames: array[1..7] of string;
TwoDigitYearCenturyWindow: Word;
end;

Отговор
в отговор на jp #2

Re: TFormatSettings

Ами то си пише. Този record се използва при многонишкови приложения. Вместо да използваш глобалните променливи (които са достъпни от всички нишки) използваш този запис за да разделиш нишките, така че те да не влизат в конфликт при ползването на общите променливи. За целта вместо function Format(const Format: string; const Args: array of const): string; ползваш function Format(const Format: string; const Args: array of const; const FormatSettings: TFormatSettings): string; и не се притесняваш за споделянето на ресурсите.

Ако не успееш, опитай пак. Ако пак не успееш спри да се правиш на глупак!
Отговор
в отговор на andrew_nikoloff #3

Re: TFormatSettings

Е това накрая не можах да го схвана с Format функцията и споделянето на ресурсите.
Обясни моляте по подробноза това.

Отговор
в отговор на jp #4

Re: TFormatSettings

Когато имаш многонишково приложение е възможно в даден момент 2 или повече нишки да използват едни и същи ресурси. Представи си следната ситуация:

Thread 1:
i := 10;
i := i + 1;
ShowMessage(IntToStr(i));

Thread 2:
i := 20;

Вторият тред се активира след изпълнението на първият ред от тред 1. И тогава стойността на i в края му няма да е 11 както си мислиш, а 21. А сега си представи, че всеки тред си има локално копие на променливата - това би решило проблема.

Горе-долу такава е идеята и да се отделят в този запис някои променливи, които се използват за форматиране на време и т.н. Само че стандартните функции ползват глобалните променливи. За да бъдат нещата "thread safe" трябва да се ползват overload-натите еквиваленти на функциите, които получават като параметър този запис и по този начин всеки тред си има собствено копие на нещата.

В хелпа нещата са обяснени добре. Ако темата те интересува можеш да вземеш да попрочетеш за многонишково програмиране, синхронизация, семафори, мутекси и т.н. Една нелоша статийка по въпроса можеш да прочетеш от тук.

Ако не успееш, опитай пак. Ако пак не успееш спри да се правиш на глупак!
Отговор
в отговор на andrew_nikoloff #5

Не му ли се вика на това "реентрантност" на кода?

Не му ли се вика на това "реентрантност" на кода?
Възможност за многократно стартиране на един и същ код, преди да е завършила обработктата на предходните стартирания.

Отговор
в отговор на NikB #6

Re: Не му ли се вика на това "реентрантност" на ко

Кой е казъл, че кодът е един и същ?

Ако не успееш, опитай пак. Ако пак не успееш спри да се правиш на глупак!
Отговор
в отговор на andrew_nikoloff #7

Re: Не му ли се вика на това "реентрантност" на ко

, как е точният израз, според теб?

Отговор
в отговор на NikB #8

Re: Не му ли се вика на това "реентрантност" на ко

Според мен "thread safe". Но не мисля, че названието е най-важното нещо

Ако не успееш, опитай пак. Ако пак не успееш спри да се правиш на глупак!
Отговор