powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Синхронизация при доступе к строке
46 сообщений из 46, показаны все 2 страниц
Синхронизация при доступе к строке
    #39848472
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть поле класса
Код: pascal
1.
FMessage: string


к нему идет обращение из разных потоков на чтение и запись.

Нужна ли мне при этом синхронизация? Или когда я записываю новое значение в строку, Delphi всегда выделяет новый кусок памяти и я никогда не прочитаю часть строки до присвоения и часть после,


С уважением, Vasilisk
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848476
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
12.08.2019 17:56, _Vasilisk_ пишет:
> Delphi всегда выделяет новый кусок памяти и я никогда не прочитаю часть строки до присвоения и часть после,

интересно послушать, что скажут монстры рока.

раскапывать какая там неонка у неё внутре - долго и муторно.
имхо, лучше перебдеть, чем недобдеть.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848477
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Нужна ли мне при этом синхронизация?
Нужна.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848481
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey_Vasilisk_Нужна ли мне при этом синхронизация?Нужна.Тогда вопрос. Такой код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function GetMessage: string;
begin
  Lock;
  try
    Result := FMessage;
  finally
    Unlock;
  end;
end;

имеет право на существование? Или я должен писать так?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function GetMessage: string;
begin
  Lock;
  try
    Result := FMessage;
    UniqueString(Result);
  finally
    Unlock;
  end;
end;


По идее без UniqueString синхронизация не имеет смысла
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848488
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function GetMessage: string;
begin
  Lock;
  try
    Result := FMessage;
  finally
    Unlock;
  end;
end;
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848490
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Это сейчас о чем?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848494
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Или я должен писать так?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function GetMessage: string;
begin
  Lock;
  try
    Result := FMessage;
    UniqueString(Result);
  finally
    Unlock;
  end;
end;


По идее без UniqueString синхронизация не имеет смысла

Я всегда так пишу. Одной лишь CS недостаточно (вроде). В принципе, ошибки со строками довольно быстро отыскиваются, если сделать нагрузочный тест с несколькими потоками. Чем больше ядер у процессора, тем быстрее ошибка воспроизводится. От длины строки также может зависеть.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848495
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Насколько я помню, только чтение синхронизировать не требуется (счётчик и так синхронизируется). Синхронизация нужна в сценариях где присутствует запись.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848497
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyтолько чтение синхронизировать не требуется (счётчик и так синхронизируется). Синхронизация нужна в сценариях где присутствует запись.А какой смысл синхронизации записи при несинхронизированном чтении?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848499
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_А какой смысл синхронизации записи при несинхронизированном чтении?

Kazantsev AlexeyСинхронизация нужна в сценариях где присутствует запись .
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848503
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, нашёл разъяснение от создателя: https://blog.therealoracleatdelphi.com/2015/11/friendly-reminder.html
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848563
ARGB32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_Нужна ли мне при этом синхронизация? Или когда я записываю новое значение в строку, Delphi всегда выделяет новый кусок памяти и я никогда не прочитаю часть строки до присвоения и часть после

Так со строками получиться не может благодаря copy-on-write, но синхронизация доступа к самой переменной таки нужна.
Иначе, в отличии от случая с Integer кстати, геттер может получить из другого потока строку, которая будет вот-вот разрушена и дальнейшее обращение к этой переменной приведет к AV.
UniqueString() не нужен.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848582
Голландец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Синхронизация нужна, unique не нужен
Можно заморочиться с лок фри, но это сложно
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848584
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UniqueString() не нужен
Лучше пусть будет. Мы же не знаем, какая работа со строкой будет в дальнейшем. А cs больше не будет.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848585
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голландец_Vasilisk_,

Синхронизация нужна, unique не нужен
+1

по мне lock лучше для каждой несвязной переменной с контролем времени жизни свой сделать, по типу плюсов.
например,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
TSync<t> = record
private
  l: TSpinLock;
  v: t;
  function GetValue(): t;
  procedure SetValue(const A: t);
public
  property Value read GetValue write SetValue;
end;



но мазохисты конечно встречаются везде...
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848632
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Присвоение строк просто копирует указатель на один и тот же фрагмент памяти. Лок-анлок достаточно, если ты прям железно уверен, что сама строка не меняется. Но лучше добавить и копирование, если это не станет узким местом.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848660
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем копирование, если есть лок?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848727
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может меняться содержимое строки.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848734
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Логично же что может...
Пока у вас обращение к переменной чтение/запись через блокировку то изменения строк управляемые..
Копирование тогда зачем?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848746
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteКопирование тогда зачем?

Чтобы не писать в дальнейшем при обращении к это строке Lock / Unlock
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848767
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerX-CiteКопирование тогда зачем?

Чтобы не писать в дальнейшем при обращении к это строке Lock / Unlock
Вы не к строке обращаетесь, а к переменной.
Выделите абстракцию (класс/ы), перенесите туда логику связанную со строкой.. в этой абстракции обеспечьте потокобезопасность и везде используйте ее.. Методы абстракции (классов) будут потокобезопасны, вызывайте где хотите...
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848789
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerX-CiteКопирование тогда зачем?

Чтобы не писать в дальнейшем при обращении к это строке Lock / Unlockа смысл?
как уже написали выше, проблема при взятии строки
увеличение инкремента может не успеть и строку удалят в другом потоке, по-этому операции с "хранилищем" надо лочить

а дальше строка защищена механизмом CopyOnWrite, если напрямую не лезть в память, то проблем с копией строки нет
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848806
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyВот, нашёл разъяснение от создателя: https://blog.therealoracleatdelphi.com/2015/11/friendly-reminder.html авторJust like any other variable that is being read from or written to from many threads, string variables require the same level of protection as you would give to a simple Integer variable.Так извини, меня, если я Integer в одном потоке только читаю, а в другом только пишу, то и синхронизация мне не нужна. Мне не критично прочитать старое или новое значение

ARGB32геттер может получить из другого потока строку, которая будет вот-вот разрушена и дальнейшее обращение к этой переменной приведет к AV.kealon(Ruslan)увеличение инкремента может не успеть и строку удалят в другом потоке, по-этому операции с "хранилищем" надо лочитьТакого быть не может. Изменение счетчика ссылок атомарная операция
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848835
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_ARGB32геттер может получить из другого потока строку, которая будет вот-вот разрушена и дальнейшее обращение к этой переменной приведет к AV.kealon(Ruslan)увеличение инкремента может не успеть и строку удалят в другом потоке, по-этому операции с "хранилищем" надо лочитьТакого быть не может. Изменение счетчика ссылок атомарная операция группа атомарных операций не атомарна

Код: plaintext
1.
2.
3.
mov eax, [v]
<-  если здесь произведут декремент в другом потоке, то в eax будет ссылка на убитый кусок
call _straddref



т.е. при работе со строкой, interlocked функциями не обойтись
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848838
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)т.е. при работе со строкой, interlocked функциями не обойтисьОни там и есть
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function _UStrClr(var S): Pointer;
var
  P: PStrRec;
begin
  if Pointer(S) <> nil then
  begin
    P := Pointer(PByte(S) - SizeOf(StrRec));
    Pointer(S) := nil;
    if P.refCnt > 0 then
    begin
      if AtomicDecrement(P.refCnt) = 0 then
        FreeMem(P);
    end;
  end;
  Result := @S;
end;
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848839
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
thred1:
mov eax, [v]

thred2:
 _UStrClr [v]

thred1:
call _straddref



что будет?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848841
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
Код: plaintext
1.
mov eax, [v]

Это что?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848849
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_там и есть

Руки бы оторвать тому, что ЭТО написал...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848870
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_если я Integer в одном потоке только читаю, а в другом только пишу, то и синхронизация мне не нужна. Мне не критично прочитать старое или новое значение
Для Integer не нужна, но изменение строковой переменной, как уже сказали, операция не атомарная. Может получится так, что прочитаешь указатель на освобождённый блок памяти. Тест просто пишется, проверь.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848878
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyМожет получится так, что прочитаешь указатель на освобождённый блок памяти.

Это бы ещё ладно, а вот прочитать указатель на освобождённый и заново выделенный блок даст
реально забавные спецэффекты и снос крыши при попытке отладки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848929
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyизменение строковой переменной, как уже сказали, операция не атомарная. Может получится так, что прочитаешь указатель на освобождённый блок памятиТ.е. кроме лока нужна еще и UniqueString?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848931
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovРуки бы оторвать тому, что ЭТО написал...Что-то не вижу. В чем криминал?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848937
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Kazantsev Alexeyизменение строковой переменной, как уже сказали, операция не атомарная. Может получится так, что прочитаешь указатель на освобождённый блок памятиТ.е. кроме лока нужна еще и UniqueString?нет, если у тебя уже есть валидная строка, неважно сколько на неё "копий", работа с ней будет корректна


_Vasilisk_Это что?копирование в регистр из участка памяти, куда идёт совместный доступ
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848940
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Kazantsev AlexeyТ.е. кроме лока нужна еще и UniqueString?
Нет.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848943
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_В чем криминал?

Строка "if P.refCnt > 0 then" совершенно тут бесполезна и только вводит в заблуждение. К
моменту её выполнения refCnt в многопоточном приложении должен быть либо больше единицы,
либо приходит пушной зверёк. (Приложение в котором только один поток использует эту
переменную считается за однопоточное.)

Таким образом эта процедура построена на предположении, что вся остальная compiler magic
работает корректно, а на уровне приложения обращение к переменной таки синхронизировано.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848953
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovСтрока "if P.refCnt > 0 then" совершенно тут бесполезна и только вводит в заблуждение. К моменту её выполнения refCnt в многопоточном приложении должен быть либо больше единицы, Нет. Для констант refCnt -1 и не изменяется
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
procedure _UStrAsg(var Dest: UnicodeString; const Source: UnicodeString); // globals (need copy)
{$IFDEF PUREPASCAL}
var
  S, D: Pointer;
  P: PStrRec;
  Len: LongInt;
begin
  S := Pointer(Source);
  if S <> nil then
  begin
    if __StringRefCnt(Source) < 0 then   // make copy of string literal
    begin
      Len := __StringLength(Source);
      S := _NewUnicodeString(Len);
      Move(Pointer(Source)^, S^, Len * SizeOf(WideChar));
    end else
    begin
      P := PStrRec(PByte(S) - SizeOf(StrRec));
      AtomicIncrement(P.refCnt);
    end;
  end;
  D := Pointer(Dest);
  Pointer(Dest) := S;
  _UStrClr(D);
end;
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848959
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я совсем потерялся. Давайте еще раз. string это указатель на структуру
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  StrRec = packed record
  {$IF defined(CPUX64)}
    _Padding: LongInt; // Make 16 byte align for payload..
  {$ENDIF}
    codePage: Word;
    elemSize: Word;
    refCnt: Longint;
    length: Longint;
    data: array[0...] of Char;
  end;

codePage и elemSize модифицироваться не могут refCnt модифицируется атомарно length и data не модифицируются логикой программы. Новая строка только присваивается. Без всякого сложений и модификаций символов.

Т.е. из всей структуры модифицируется только одно поле refCnt и то происходит атомарно. Зачем здесь синхронизация?

Далее, допустим, синхронизация нужна, но не нужна UniqueString. Тогда я вообще не понимаю. Код
_Vasilisk_
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function GetMessage: string;
begin
  Lock;
  try
    Result := FMessage;
  finally
    Unlock;
  end;
end;

по сути идентичен такому
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
FMessage: Pointer;
....
function GetMessage: Pointer;
begin
  Lock;
  try
    AddRef(FMessage)
    Result := FMessage;
  finally
    Unlock;
  end;
end;

Но тогда любой код, вызвавший GetMessage получает тот же указатель, что и оригинальный FMessage, но уже ни о какой синхронизации не подозревает. Тогда в чем смысл был Lock/Unlock, если AddRef атомарна?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848961
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

потому что

Код: pascal
1.
Result := FMessage;

это две операции: нужно сначала получить указатель на структура StrRec, а потом уже вызвать инкремент, и наоборот это принципиально не сделать
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848965
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Для констант refCnt -1 и не изменяется

Эва какие костыли...

В любом случае, когда этот код параллельно выполняется для refCnt = 1, наступает "Бум!"
поскольку один поток затормозил перед проверкой, второй в это время полностью выполнил
процедуру и освободил память, первый прочухался и проверяет refCnt в уже освобождённом
мусоре. А для глобальной переменной счётчик будет 1 без вариантов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848976
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)это две операции: нужно сначала получить указатель на структура StrRec, а потом уже вызвать инкрементВсе. Уразумел. Извините за торможение
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848978
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovпоскольку один поток затормозил перед проверкой, второй в это время полностью выполнил процедуру и освободил память,Нет. Декремент вызывается только при потере видимости. Если мы говорим о доступе к одной переменной из разных потоков, значит эта переменная не локальная, а, как минимум, поле класса. А значит видимость она потеряет только при вызове деструктора.

Если же у нас два указателя на одну строку, то уже refCnt >= 2
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39849024
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Dimitry Sibiryakovпоскольку один поток затормозил перед проверкой, второй в это время полностью выполнил процедуру и освободил память,Нет. Декремент вызывается только при потере видимости. Если мы говорим о доступе к одной переменной из разных потоков, значит эта переменная не локальная, а, как минимум, поле класса. А значит видимость она потеряет только при вызове деструктора.

Если же у нас два указателя на одну строку, то уже refCnt >= 2 только читать наверное не особо интересно, надо наверное и писать - 21948221
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39849304
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)только читать наверное не особо интересно, надо наверное и писать - 21948221 Так мы же договорились, что доступ к переменной только через синхронизацию
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39849334
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Dimitry Sibiryakov тебе объяснял, что будет без лока
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39849353
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dimitry Sibiryakov тебе объяснял, что будет без локаДмитрий возмущался кривизной кода RTL. Я попросил показать в чем кривизна.

Кроме того, обсуждаемый код RTL влияет на объекты "строка", а не на строковые переменные (которые указатели на эти объекты)
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39849362
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_обсуждаемый код RTL влияет на объекты "строка", а не на строковые переменные (которые
указатели на эти объекты)

Благодаря магии компилятора они "умные" указатели, что несколько изменяет картину.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
46 сообщений из 46, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Синхронизация при доступе к строке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]