Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5   вперед  Ctrl      все
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1167
DmSer
и, как минимум, реализовать override-метод Execute.

_Vasilisk_
и, как минимум, переопределить виртуальный метод Execute.


А точно между этими двумя вариантами выражения есть какая-то разница? На мой взгляд, оба варианта равноценны. Если человек понимает, что такое виртуальный метод, то он также знает что такое override-метод.

_Vasilisk_
> Ваша программа с большой вероятностью будет глючить.
Может имеет смысл обойтись без сленга?


Что здесь является сленгом? Слово "глючить"? Вроде нормальный термин для программистов. Да и статья не академическая.



_Vasilisk_
> Также хочу отметить, что при срабатывании таймера не следует обращаться к
> базе данных из основного потока, лучше это делать из дополнительного потока,
> разумеется, в отдельном подключении.
Если мы говорим о мануале для новичков, то нифига это не разумеется. Если уже зацепил работу с БД, то явно укажи, что делать только так или смотреть документацию к СУБД. Тот же MySQL позволяет расшаривать соединение между потоками, при выполнении определенных условий


Я согласен. По поводу работы с базой данных обязательно напишу отдельный раздел. Считаю это очень важным. Тем более работа с базами данных - это наиболее популярная область использования Дельфи. Есть большое количество наработок в этой часть. Есть что написать.


_Vasilisk_
> ℹ️ Внимание! Если периодическая задача выполняется редко (например,
> каждые 10 минут), рекомендуется каждый раз (если это не сложно!) для
> такой задачи создавать новый поток. Вероятно, это лучше, чем часами
> удерживать дополнительный поток в спящем состоянии (особенно, если
> вы разрабатываете 32-разрядное Windows-приложение).

Чем лучше? Я бы наоборот делал бы обратную рекомендацию. Спящий поток есть не просит, а снаружи лучше управлять одним объектом, чем каждый раз создавать новый. Плюс дополнительное время на инициализацию нового потока


Спящий поток кушает примерно 1,3 МБ адресного пространства (при условии, что 32-разрядная программа запущена на 64-разрядной винде). Это весьма много, ведь 32-разрядной программе доступно всего 2 ГБ под собственные нужны. Стоит лишь открыть TOpenDialog, так на тебе, сразу 300МБ уплыло. Используешь TWebBrowser, так ещё минус 200МБ. А что остаётся?

_Vasilisk_
Ну и в чем великий смысл выделенной строчки? Если


Это приём, направленный на повышение читаемости кода. Там же чуть ниже отмечено, для чего так сделано.

_Vasilisk_
Верно только для случая, когда поток завершается сам


Именно так!

Сообщение было отредактировано: 29 июл 20, 17:23
29 июл 20, 17:26    [22175311]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11984
InterlockedIncrement/InterlockedDecrement я бы заменил на кроссплатформенные AtomicIncrement/AtomicDecrement

DmSer
  // Создаём поток в спящем состоянии
  FMyThread := TMyThread.Create(True);

  // Запоминаем длину ряда в поле MaxValue
  FMyThread.MaxValue := StrToIntDef(edMaxValue.Text, 0);

  // Пробуждаем поток для выполнения вычислений
  FMyThread.Resume;
Я бы инициализацию MaxValue вынес в конструктор. Чтобы не возникало желания его модифицировать

DmSer
На главной форме находится таймер, который через определённые промежутки времени (каждые 100 мс) считывает из объекта-потока FMyThread свойства CalcResult, CurrValue и ThreadStateInfo
И рискуем получить несогласованные данные.

DmSer
procedure TMyThread.SetThreadStateInfo(const Value: string);
begin
StringProtectSection.Enter; // Входим в режим защиты
FThreadStateInfo := Value;
StringProtectSection.Leave; // Выходим из режима защиты
end;
try finally всегда. Даже если внутри одна строчка. Ну и использование одной глобальной критической секции на все - это огромный антипаттерн

DmSer
⚠️ Внимание! Если строка (структура, объект, массив) является «константной», т.е. если значение присваивается лишь один раз и больше не меняется, то нет смысла её защищать!
Это неверно. При чтении управляемых объектов изменяется счетчик ссылок тынц

DmSer
б) освобождается память, занятая старой строкой (с помощью функции менеджера памяти FreeMem).
Память будет освобождена при условии, если старая строка нигде больше не используется, т.е. у неё нулевой счётчик ссылок.
Как громоздко.
У строки уменьшается счетчик ссылок. Если он достиг значения 0, то память освобождается

DmSer
⚠️ Внимание! Если Вы вводите свои (нестандартные коды сообщений), то необходимо использовать коды не менее WM_USER,
WM_APP. Потому, что WM_USER + XXX VCL резервирует для себя. И можно нарваться
29 июл 20, 17:28    [22175314]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11984
DmSer
он также знает что такое override-метод.
Я впервые слышу такой термин. Я воспринимаю термин "override-метод" как "переопределенный" (в родителе) метод. У нас же в родителе метод абстрактный
DmSer
Спящий поток кушает примерно 1,3 МБ адресного пространства
Где?
procedure TMyThread.Execute;
begin
  WaitForSingleObject(Handle, INFINITE);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  LBase: PROCESS_MEMORY_COUNTERS;
  LInfo1: PROCESS_MEMORY_COUNTERS;
  LInfo2: PROCESS_MEMORY_COUNTERS;
  LInfo3: PROCESS_MEMORY_COUNTERS;
  LStr: string;
begin
  Win32Check(GetProcessMemoryInfo(GetCurrentProcess, @LBase, SizeOf(LBase)));
  TMyThread.Create(False);
  Win32Check(GetProcessMemoryInfo(GetCurrentProcess, @LInfo1, SizeOf(LInfo1)));
  TMyThread.Create(False);
  Win32Check(GetProcessMemoryInfo(GetCurrentProcess, @LInfo2, SizeOf(LInfo2)));
  TMyThread.Create(False);
  Win32Check(GetProcessMemoryInfo(GetCurrentProcess, @LInfo3, SizeOf(LInfo3)));
  LStr := Format('WorkingSet: 1: %d, 2: %d, 3: %d, Total: %d', [
    LInfo1.WorkingSetSize - LBase.WorkingSetSize,
    LInfo2.WorkingSetSize - LInfo1.WorkingSetSize,
    LInfo3.WorkingSetSize - LInfo2.WorkingSetSize,
    LInfo3.WorkingSetSize - LBase.WorkingSetSize
  ]) + Format(#13#10'PageFileSet: 1: %d, 2: %d, 3: %d, Total: %d', [
    LInfo1.PagefileUsage - LBase.PagefileUsage,
    LInfo2.PagefileUsage - LInfo1.PagefileUsage,
    LInfo3.PagefileUsage - LInfo2.PagefileUsage,
    LInfo3.PagefileUsage - LBase.PagefileUsage
  ]);
  ShowMessage(LStr);
end;

WorkingSet: 1: 20480, 2: 16384, 3: 32768, Total: 69632
PageFileSet: 1: 81920, 2: 86016, 3: 81920, Total: 249856
Rio 10.3.1. Сборка проекта Debug.
29 июл 20, 17:48    [22175329]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11984
DmSer
В некоторых задачах (например, при математических вычислениях) следует по возможности избегать использования конструкций try..finally и try..except, т.к. они могут нести значительные накладные расходы.
Шта?

DmSer
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FList.Free;

  // В списке могут остаться элементы. Это не страшно, поскольку
  // выполняется выход из программы
  EventList.Free;
end;
1. И получить в конце ругань от менеджера памяти об утечках
2. Form1 может оказаться не главной формой и приложение может не завершиться

DmSer
Относительный приоритет потока работает только в рамках процесса и никак не влияет на выделение квантов времени потокам, которые работают в других процессах.
MSDN с тобой не согласен
https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setthreadpriority#remarks
The SetThreadPriority function enables setting the base priority level of a thread relative to the priority class of its process. For example, specifying THREAD_PRIORITY_HIGHEST in a call to SetThreadPriority for a thread of an IDLE_PRIORITY_CLASS process sets the thread's base priority level to 6.


Ну и нет главы о передаче данных в дополнительный поток
29 июл 20, 18:17    [22175346]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11984
_Vasilisk_
DmSer
В некоторых задачах (например, при математических вычислениях) следует по возможности избегать использования конструкций try..finally и try..except, т.к. они могут нести значительные накладные расходы.
Шта?
+
procedure TForm1.Button1Click(Sender: TObject);
const
  CCount = Round(1e+9);
  CStart = 1e+6;
var
  LStart: Cardinal;
  LClear, LFinally, LExcept: Cardinal;
  Li: Integer;
  LRes: Double;
begin
  LStart := GetTickCount;
  LRes := CStart;
  for Li := 0 to CCount - 1 do begin
    LRes := Sqrt(LRes);
    LRes := LRes * LRes;
  end;
  LClear := GetTickCount - LStart;

  LStart := GetTickCount;
  LRes := CStart;
  for Li := 0 to CCount - 1 do begin
    try
      LRes := Sqrt(LRes);
      LRes := LRes * LRes;
    finally

    end;
  end;
  LFinally := GetTickCount - LStart;

  LStart := GetTickCount;
  LRes := CStart;
  for Li := 0 to CCount - 1 do begin
    try
      LRes := Sqrt(LRes);
      LRes := LRes * LRes;
    except
    end;
  end;
  LExcept := GetTickCount - LStart;

  ShowMessageFmt('Clear: %d, Finally: %d, Except: %d', [LClear, LFinally, LExcept]);
end;
Clear: 9844, Finally: 11734, Except: 9922
2 секунды на миллиарде операций стоят того, чтобы отказываться от обработки ошибок?
29 июл 20, 18:33    [22175353]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1167
_Vasilisk_

DmSer
Спящий поток кушает примерно 1,3 МБ адресного пространства
Где?
procedure TMyThread.Execute;
begin
  WaitForSingleObject(Handle, INFINITE);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  LBase: PROCESS_MEMORY_COUNTERS;
  LInfo1: PROCESS_MEMORY_COUNTERS;
  LInfo2: PROCESS_MEMORY_COUNTERS;
  LInfo3: PROCESS_MEMORY_COUNTERS;
  LStr: string;
begin
  Win32Check(GetProcessMemoryInfo(GetCurrentProcess, @LBase, SizeOf(LBase)));
  TMyThread.Create(False);
  Win32Check(GetProcessMemoryInfo(GetCurrentProcess, @LInfo1, SizeOf(LInfo1)));
  TMyThread.Create(False);
  Win32Check(GetProcessMemoryInfo(GetCurrentProcess, @LInfo2, SizeOf(LInfo2)));
  TMyThread.Create(False);
  Win32Check(GetProcessMemoryInfo(GetCurrentProcess, @LInfo3, SizeOf(LInfo3)));
  LStr := Format('WorkingSet: 1: %d, 2: %d, 3: %d, Total: %d', [
    LInfo1.WorkingSetSize - LBase.WorkingSetSize,
    LInfo2.WorkingSetSize - LInfo1.WorkingSetSize,
    LInfo3.WorkingSetSize - LInfo2.WorkingSetSize,
    LInfo3.WorkingSetSize - LBase.WorkingSetSize
  ]) + Format(#13#10'PageFileSet: 1: %d, 2: %d, 3: %d, Total: %d', [
    LInfo1.PagefileUsage - LBase.PagefileUsage,
    LInfo2.PagefileUsage - LInfo1.PagefileUsage,
    LInfo3.PagefileUsage - LInfo2.PagefileUsage,
    LInfo3.PagefileUsage - LBase.PagefileUsage
  ]);
  ShowMessage(LStr);
end;

WorkingSet: 1: 20480, 2: 16384, 3: 32768, Total: 69632
PageFileSet: 1: 81920, 2: 86016, 3: 81920, Total: 249856
Rio 10.3.1. Сборка проекта Debug.


Причём тут pagefile? Речь же шла про виртуальное адресное пространство!

Сообщение было отредактировано: 29 июл 20, 19:34
29 июл 20, 19:36    [22175394]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1167
_Vasilisk_
_Vasilisk_
пропущено...
Шта?
+
procedure TForm1.Button1Click(Sender: TObject);
const
  CCount = Round(1e+9);
  CStart = 1e+6;
var
  LStart: Cardinal;
  LClear, LFinally, LExcept: Cardinal;
  Li: Integer;
  LRes: Double;
begin
  LStart := GetTickCount;
  LRes := CStart;
  for Li := 0 to CCount - 1 do begin
    LRes := Sqrt(LRes);
    LRes := LRes * LRes;
  end;
  LClear := GetTickCount - LStart;

  LStart := GetTickCount;
  LRes := CStart;
  for Li := 0 to CCount - 1 do begin
    try
      LRes := Sqrt(LRes);
      LRes := LRes * LRes;
    finally

    end;
  end;
  LFinally := GetTickCount - LStart;

  LStart := GetTickCount;
  LRes := CStart;
  for Li := 0 to CCount - 1 do begin
    try
      LRes := Sqrt(LRes);
      LRes := LRes * LRes;
    except
    end;
  end;
  LExcept := GetTickCount - LStart;

  ShowMessageFmt('Clear: %d, Finally: %d, Except: %d', [LClear, LFinally, LExcept]);
end;
Clear: 9844, Finally: 11734, Except: 9922
2 секунды на миллиарде операций стоят того, чтобы отказываться от обработки ошибок?


Операция операции рознь. Чем тяжелее операция тем меньше разница. Отказываться от обработки ошибок не нужно. Но и совать её куда ни попадая не следует.
29 июл 20, 19:43    [22175397]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1167
_Vasilisk_
DmSer
procedure TMyThread.SetThreadStateInfo(const Value: string);
begin
StringProtectSection.Enter; // Входим в режим защиты
FThreadStateInfo := Value;
StringProtectSection.Leave; // Выходим из режима защиты
end;
try finally всегда. Даже если внутри одна строчка. Ну и использование одной глобальной критической секции на все - это огромный антипаттерн


try..finally ради одной безобидной строчки выглядит как-то нерационально. Какой в ней смысл? Кто такое правило ввёл?
Про критическую секцию согласен. Однако в плане обучения я посчитал такой подход проще, удобнее, понятнее. И я не сразу ввожу термин "критическая секция", а постепенно. Иначе у начинающего каша в голове будет и он бросит всё это читать.

_Vasilisk_
DmSer
Внимание! Если строка (структура, объект, массив) является «константной», т.е. если значение присваивается лишь один раз и больше не меняется, то нет смысла её защищать!
Это неверно. При чтении управляемых объектов изменяется счетчик ссылок тынц


Счётчик ссылок может изменяться из разных потоков. Это безопасно в том случае, если строка не меняется.

_Vasilisk_
DmSer
Внимание! Если Вы вводите свои (нестандартные коды сообщений), то необходимо использовать коды не менее WM_USER,
WM_APP. Потому, что WM_USER + XXX VCL резервирует для себя. И можно нарваться


Фантазии какие-то! Назови хоть один случай, где WM_USER+1 не работал!
А ещё огласи, чему равен тот загадочный XXX?
29 июл 20, 21:38    [22175427]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1167
_Vasilisk_

DmSer
Относительный приоритет потока работает только в рамках процесса и никак не влияет на выделение квантов времени потокам, которые работают в других процессах.
MSDN с тобой не согласен
https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setthreadpriority#remarks
The SetThreadPriority function enables setting the base priority level of a thread relative to the priority class of its process. For example, specifying THREAD_PRIORITY_HIGHEST in a call to SetThreadPriority for a thread of an IDLE_PRIORITY_CLASS process sets the thread's base priority level to 6.



Действительно я накосячил. Исправил. Доработал программу для исследования квантов и приоритетов.
29 июл 20, 22:13    [22175449]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
istrebitel
Member

Откуда:
Сообщений: 60
DmSer

Фантазии какие-то! Назови хоть один случай, где WM_USER+1 не работал!
А ещё огласи, чему равен тот загадочный XXX?

http://delphimaster.net/view/1-59239
30 июл 20, 07:26    [22175501]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1167
Еще поправил раздел о приоритетах спорная часть теперь выглядит так:

Обычно программисту нет смысла изменять приоритеты потоков. Приоритет потока никак не влияет на скорость исполнения программного кода. Приоритет потока никак не влияет на размер кванта времени (однако размер кванта времени зависит от того, является ли приложение активным или нет).

:information_source: **Внимание!** У приложения, которое находится на переднем плане, длительность кванта времени увеличивается примерно в 3 раза (это не имеет отношения к базовому приоритету процесса). Одну и ту же вычислительную задачу быстрее (примерно в 3 раза) сможет решить приложение, которое находится на переднем плане. На моих компьютерах с Windows 7 длительность кванта времени у приложений на заднем плане (думаю, что и у служб тоже) составляет 32 мс, а у приложений на переднем плане - 96 мс.

Относительный приоритет потока влияет на выделение процессорного времени как между потоками в рамках одного процесса, так и между потоками различных процессов.
30 июл 20, 08:40    [22175510]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1167
istrebitel
DmSer

Фантазии какие-то! Назови хоть один случай, где WM_USER+1 не работал!
А ещё огласи, чему равен тот загадочный XXX?

http://delphimaster.net/view/1-59239


Думаю, что WM_USER+100 нужен при разработке наследников от некоторых компонентов. А лучше изучать исходники и смотреть, какие коды там используются.
30 июл 20, 08:47    [22175512]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1167
DmSer
Одну и ту же вычислительную задачу быстрее (примерно в 3 раза) сможет решить приложение, которое находится на переднем плане.


Исправлено:

В том случае, если два приложения будут привязаны к одному ядру процессора, то одну и ту же вычислительную задачу быстрее (примерно в 3 раза) сможет решить приложение, которое находится на переднем плане.


Сообщение было отредактировано: 30 июл 20, 09:11
30 июл 20, 09:14    [22175522]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4513
DmSer,

От настроек зависит. На серверных виндах приоритет у фоновых задач.
Картинка с другого сайта.
30 июл 20, 09:46    [22175533]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1167
Kazantsev Alexey
DmSer,

От настроек зависит. На серверных виндах приоритет у фоновых задач.
Картинка с другого сайта.


Как-то странно это работает. Поставил приоритет для служб в фоновом режиме, теперь квант у обычных программ резко подрос и стал около 195 мс. Причем теперь он у всех одинаковый и не зависит от того, на переднем плане программа или на заднем плане.

Сообщение было отредактировано: 30 июл 20, 12:34
30 июл 20, 12:37    [22175630]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4513
DmSer,

Да, про увеличение размера кванта написано у Русиновича, кажется (Внутреннее устройство Windows).
30 июл 20, 12:45    [22175632]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4513
Кстати, величина самого длинного кванта на Windows 2000 всего 36.
30 июл 20, 13:01    [22175646]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11984
DmSer
Счётчик ссылок может изменяться из разных потоков. Это безопасно в том случае, если строка не меняется.
Счетчик ссылок может стать нулем

Ладно. Я все понял. Твой подход: "зачем делать правильно если в конкретном частном случае работает и так?".

Только программа имеет тенденцию развиваться и мне проще изначально писать правильно, чем потом выискивать места, где нужно что-то поправить
30 июл 20, 15:01    [22175731]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1167
_Vasilisk_
DmSer
Счётчик ссылок может изменяться из разных потоков. Это безопасно в том случае, если строка не меняется.
Счетчик ссылок может стать нулем


Речь идёт о "константной" строке, значение которой присваивается один раз и больше не меняется.
Счётчик станет нулём в том случае, если строка никому больше не нужна. В этом случае строка будет уничтожена, память освободится. Никаких проблем с многопоточным доступом тут нет. Конечно, можно на всякий случай каждую строчку кода защищать критической секцией и для каждой строки на всякий случай вызывать UniqueString. Но зачем?
30 июл 20, 16:10    [22175781]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1747
DmSer
_Vasilisk_
пропущено...
Счетчик ссылок может стать нулем


Речь идёт о "константной" строке, значение которой присваивается один раз и больше не меняется.
Счётчик станет нулём в том случае, если строка никому больше не нужна. В этом случае строка будет уничтожена, память освободится. Никаких проблем с многопоточным доступом тут нет. Конечно, можно на всякий случай каждую строчку кода защищать критической секцией и для каждой строки на всякий случай вызывать UniqueString. Но зачем?


Сколько интересных граблей необходимо помнить и обходить, если вместо подходящих инструментов и подходов использовать базовые...

На моей памяти уже несколько лет не было случая, чтобы что-то блокировать, кроме очередей.
30 июл 20, 19:35    [22175868]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1167
Добавлена информация о threadvar и немного о UniGui.
1 авг 20, 00:02    [22176441]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Док
Member

Откуда: Казань
Сообщений: 6753
Кстати, если интересно, вот тут https://forum.lazarus.freepascal.org/index.php/topic,40163.msg277111.html#msg277111 многие из авторов рекомендуют пользоваться Synchronize/Queue взамен привычных для винды SendMessage/PostMessage. Правда, это для Лазаря и с учетом кроссплатформенности.
3 авг 20, 17:06    [22177111]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26714
Док
Кстати, если интересно, вот тут https://forum.lazarus.freepascal.org/index.php/topic,40163.msg277111.html#msg277111 многие из авторов рекомендуют пользоваться Synchronize/Queue взамен привычных для винды SendMessage/PostMessage. Правда, это для Лазаря и с учетом кроссплатформенности.

Только с некой оговоркой, как у меня. Синхронизация с главным потоком происходит через посредника - отдельного потока, которым пользуются все остальные. Так я избавляюсь от ожидания.

Сказал посреднику, что хочешь сообщить главному и дальше пошел работать.
3 авг 20, 21:07    [22177192]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6017
Док
Кстати, если интересно, вот тут https://forum.lazarus.freepascal.org/index.php/topic,40163.msg277111.html#msg277111 многие из авторов рекомендуют пользоваться Synchronize/Queue взамен привычных для винды SendMessage/PostMessage. Правда, это для Лазаря и с учетом кроссплатформенности.
и для VCL я это советую - 22162612
и на это есть много причин
4 авг 20, 09:25    [22177275]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Док
Member

Откуда: Казань
Сообщений: 6753
kealon(Ruslan)
и для VCL я это советую

И не знаешь, кого слушать :)

Это как с Application.ProcessMessages - все кричат, что его применение - моветон и чревато страшными багами, а на деле - вероятность можно на пальцах посчитать

Сообщение было отредактировано: 4 авг 20, 14:46
4 авг 20, 14:44    [22177462]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5   вперед  Ctrl      все
Все форумы / Delphi Ответить