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

Откуда: Пенза
Сообщений: 1164
Работаю над учебником "Многопоточное программирование в Delphi для начинающих".
Учебник вместе с примерами доступен по ссылке: https://github.com/loginov-dmitry/multithread
Примеры должны компилироваться во всех версиях Delphi, начиная с Delphi 2007 (кроме примера Ex12, где рассматривается метод Queue).
В настоящее время в учебнике 58 страниц. Описаны минимальные базовые вещи, которые позволят начинающему разобраться с многопоточностью и начать разработку реальных проектов.
Прошу отнестись к данной работе критически, т.к. есть желание (цель) давать ссылки на данный учебник при возникновении вопросов по многопоточности. Я потратил на эту работу в сумме около месяца и будет обидно читать комментарии типа "на второй странице пропущена запятая, значит всё там неправильно и читать дальше не буду".

К сожалению, я успел описать далеко не всё, что хотелось бы. Надеюсь, что мне удастся и дальше продолжить эту работу (не в ущерб основной работе).

В настоящее время оглавление следующее:
Оглавление
1. Вступление
1.1 Для чего используется многопоточное программирование в Delphi
1.2 В чём сложность разработки многопоточных программ в Delphi по сравнению с другими современными языками программирования
1.3 Поддержка многопоточности в операционных системах и процессорах
2. Базовый класс многопоточности - TThread
3. Предотвращаем зависание основного потока (имитация задачи длительного вычисления)
4. Управление временем жизни потоков
4.1 Использование свойства TThread.Terminated для выхода из метода Execute
4.2 Главная форма отвечает за прекращение работы потока и уничтожение объекта потока
4.3 Главная форма отвечает за уничтожение объекта потока с разовой задачей 17стр.
4.4 Главная форма отвечает за уничтожение нескольких долгоживущих потоков 19
4.5 Использование списка TObjectList для хранения ссылок на объекты потоков 23
4.6 Простой пример организации паузы в работе потока 26
4.7 Использование свойства FreeOnTerminate для автоматического уничтожения объекта потока при завершении работы потока 27
4.8 Организация корректного завершения работы программы при использовании свойства FreeOnTerminate 28
5. Передача информации из дополнительного потока в основной 32
5.1 Обращение к визуальным компонентам формы из дополнительного потока – как нельзя делать 32
5.2 Использование метода TThread.Synchronize для передачи данных в основной поток 32
5.3 Периодическое чтение основным потоком данных, подготовленных в дополнительном потоке 36
5.4 Использование функции SendMessage для передачи данных в основной поток 40
5.5 Использование функции PostMessage для передачи очереди сообщений в основной поток 44
5.6 Использование списка TThreadList для передачи очереди данных в основной поток 46
5.7 Использование метода TThread.Synchronize для передачи данных в основной поток – вариант с использованием анонимной процедуры 50
5.8 Использование метода TThread.Queue для передачи данных в основной поток 51
6. Где можно и где нельзя создавать и уничтожать потоки 57


Сообщение было отредактировано: 8 июл 20, 16:52
8 июл 20, 12:09    [22163946]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1143
DmSer,

привет, начал читать. Что касается "запятых" ("а второй странице пропущена запятая...") то по-моему как раз язык нормальный, мысли пока что, сколько прочитал, были по-моему выражены ясно. )
Дочитал до начала описания класса TThread. Мне показалось, что есть "дырка" в изложении - переход от общего описания многопоточности в ОС к классу TThread. Может быть стоит написать про функцию CreateThread, при помощи которой можно создать поток в вызывающем её процессе (более строго, по документации: "который выполняется в адресном пространстве вызывающего процесса") и которую TThread инкапсулирует?

Сообщение было отредактировано: 8 июл 20, 13:27
8 июл 20, 13:24    [22164020]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1164
s62
DmSer,

привет, начал читать. Что касается "запятых" ("а второй странице пропущена запятая...") то по-моему как раз язык нормальный, мысли пока что, сколько прочитал, были по-моему выражены ясно. )
Дочитал до начала описания класса TThread. Мне показалось, что есть "дырка" в изложении - переход от общего описания многопоточности в ОС к классу TThread. Может быть стоит написать про функцию CreateThread, при помощи которой можно создать поток в вызывающем её процессе (более строго, по документации: "который выполняется в адресном пространстве вызывающего процесса") и которую TThread инкапсулирует?


Спасибо за предложение! Но мне кажется, это будет лишняя информация для начинающих. Очень сложно разобраться, какой материал нужно включать, какой не нужно. Тонкостей различных миллион! Если описывать про CreateThread, а это чисто виндовая функция, тогда придётся описывать аналоги и в других ОС (Linux, MacOS, Android). Вероятно, можно будет обойтись более общей формулировкой о том, что доп. поток на самом деле создаёт ОС, а класс TThread является обёрткой...
8 июл 20, 14:03    [22164064]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Dimitry Sibiryakov
Member

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

DmSer
Если описывать про CreateThread, а это чисто виндовая функция

Причём такая, которой не надо пользоваться практически никогда. _beginthreadex() описать
таки надо. Хотя бы пробы было понимание, что "TThread это не поток".

Posted via ActualForum NNTP Server 1.5

8 июл 20, 14:17    [22164081]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1143
DmSer
Вероятно, можно будет обойтись более общей формулировкой о том, что доп. поток на самом деле создаёт ОС, а класс TThread является обёрткой...
Ну да, можно и как-то так.
8 июл 20, 15:41    [22164154]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Док
Member

Откуда: Казань
Сообщений: 6745
DmSer
Работаю над учебником "Многопоточное программирование в Delphi для начинающих".

так вот почему такой странный топик про потоки. А я-то воспринял, как будто новичок украл твой ник и забавляется. Извини за наезд :)

Исходник книги на чем пишешь? Я тут кое-что время от времени перевожу, из markdown экспортируется весьма читабельно, а у тебя бледненько - текст труднее воспринимается

К сообщению приложен файл. Размер - 46Kb
8 июл 20, 16:24    [22164174]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 61561
DmSer> Работаю над учебником "Многопоточное программирование в Delphi для начинающих".

Это дело хорошее, полезное. Научный редактор есть
или ты надеешься на краудсорсинговую вычитку?

> Примеры должны компилироваться во всех версиях Delphi, начиная
> с Delphi 2007 (кроме примера Ex12, где рассматривается метод Queue).

В Д7 не проверялось?

Posted via ActualForum NNTP Server 1.5

8 июл 20, 16:56    [22164212]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1747
Чтобы разрабатывать реальные проекты надо не многопоточность изучать, а терминологию и практики...

Очень хороший пример всего этого описан в ответе здесь.

Далее.. Delphi сейчас - это кроссплатформенная среда разработки, следовательно все примеры должны быть кроссплатформенные.
Все что в современной версии досталось в наследство от 1-7 версий должно быть похоронено как deprecated.
У этого всего давно появились другие аналоги, более удобные в проектировании и разработке.

Как минимум уже в начале неверно описана область применения PPL.
PPL - это способ выполнить некую работу (не важно какую, абсолютно любую) конкурентно не вдаваясь в детали реализации. Как она будет выполнена: параллельно, асинхронно или синхронно - это дело десятое и в современно мире особо об этом задумываться ненужно. Когда над проектом работают десятки разработчиков, порог входа должен быть низкий, чтобы иметь возможность дешево менять ресурсы, для этого и придумывают различные библиотеки и абстракции, которые в освоении намного проще.

Проблема в Дельфи в том, что разработчики которые туда пытаются придти учатся по книжкам которые написаны были во времена высокого порога входа в программирование, а не когда курсы клепают по 100 "программистов" в день...

Поэтому лучше, чтобы появлялись книжки, которые позволят вчерашним студентам, которые не знают как там работает под капотом, да и не надо им знать, но которые будут эффективно решать реальные бизнес-задачи используя современные инструменты.
8 июл 20, 17:04    [22164227]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1747
автор
Я хотел бы выделить две основные причины использования многопоточности в Delphi-программах
Задачи длительного ожидания завершения ввода-вывода.

Вы путаете теплое с мягким. Такие задачи должны выполняться асинхронно.. Другой поток - это способ реализации, при чем довольно не эффективный, если таких запросов много.
8 июл 20, 17:24    [22164241]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1747
Первый пример показан через оверхед.
Намного лаконичнее решается через
TThread.CreateAnonymousThread(
    procedure
    var
      V: Int64;
    begin
      V := DoLongCalculations;
      MyShowMessage('Результат: ' + IntToStr(V));
    end
  ).Start();

И кстати, такая вариация намного удачнее, чем через отдельный класс, потому что явно видно в каком месте какую работу необходимо выполнить в потоке отличном от вызываемого.
А еще лучше так никогда не делать и не показывать что вообще можно...
Потому что
TTask.Run(
    procedure
    var
      V: Int64;
    begin
      V := DoLongCalculations;
      MyShowMessage('Результат: ' + IntToStr(V));
    end
  );

намного лучше, т.к. нет оверхеда на создание/разрушение потоков

Лучше учить решать задачи наиболее подходящим инструментом, чем учить использовать примитив везде где попало.

Иначе книжку надо переименовать в Работа с классом TThread, а не многопоточное программирование...
8 июл 20, 18:15    [22164296]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4236
X-Cite
лучше, чтобы появлялись книжки, которые позволят вчерашним студентам, которые не знают как там работает под капотом, да и не надо им знать, но которые будут эффективно решать реальные бизнес-задачи используя современные инструменты.
Если человек не понимает (и/или не знает), как работает под капотом, то при первой же проблеме ему придётся либо разобраться в этом, либо сменить профессию.
8 июл 20, 18:23    [22164304]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4236
X-Cite
TTask.Run

Что будет, если DoLongCalculations будет выполняться часами, а пользователь захочет закрыть программу?
Нежданчик?
И таким "современным" методам вы предлагаете учить молодежь? Чтобы они и не знали, как сделать по-нормальному, чтобы контролировать всё?
8 июл 20, 18:29    [22164310]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1747
YuRock,

Почти все проблемы для известных и популярных библиотек уже описаны и описаны способы решения. В том числе например и для PPL. Проще обучить как решать задачи для которых PPL предпочтительнее, чем решать эти же задачи на TThread
8 июл 20, 18:30    [22164311]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4236
X-Cite
YuRock,

Почти все проблемы для известных и популярных библиотек уже описаны и описаны способы решения. В том числе например и для PPL. Проще обучить как решать задачи для которых PPL предпочтительнее, чем решать эти же задачи на TThread
Проблемы всегда появляются в логике решения любой задачи.
Какие нафиг библиотеки, я не про них говорю, а про реальные проекты, которые будут делать программисты.
Научить TTask'у, конечно, проще, чем TThread'у, только толку от этого ученика не будет.
8 июл 20, 18:34    [22164312]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Vizit0r
Member

Откуда: Одесса
Сообщений: 805
YuRock
X-Cite
TTask.Run

Что будет, если DoLongCalculations будет выполняться часами, а пользователь захочет закрыть программу?
Нежданчик?

жданчик будет. Ошибки, зависания, прочие прелести.
Я от TTask отказался как раз из-за абсолютно фантастических вещей при его остановке.
8 июл 20, 18:39    [22164314]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1747
YuRock

Что будет, если DoLongCalculations будет выполняться часами, а пользователь захочет закрыть программу?


Тоже самое что и в TThread.Execute(), но в отличие от TThread бизнес-единица алгоритма будет всегда в согласованном состоянии.

Примеры:
  TThread.CreateAnonymousThread(
    procedure
    var
      a: TArray<Byte>;
    begin
      for var k := 1 to 10 do
      begin
        SetLength(a, 1024 * 1024 * 500);
        FillChar(a[0], 1024 * 1024 * 500, 5);
        TFile.WriteAllBytes('C:\TThread.txt', a);
      end;
    end
  ).Start();
  Application.Terminate;

Что будет? Access Violation будет. Отстрелили ногу.
TTask.Run - корректно дождется конца.

т.е. в TThread как минимум надо самостоятельно ждать окончания работы, чтобы корректно продолжить.

Что надо сделать чтобы не ждать конца?
А закончить работу пораньше.

Одно и тоже, что в TTask что в TThread - только способы реализации будут разные.

Только с CreateAnonymousThread - все намного сложнее, окей, применяем старый подход через отдельный класс

Реализация для TThread
+
type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  x: TThread;
begin
  x := TMyThread.Create();
  try
    while not x.Started do
      ; // Убеждаемся что поток начал работу
    x.Terminate();
    x.WaitFor();
  finally
    x.Free();
  end;
  Application.Terminate();
end;

{ TMyThread }

procedure TMyThread.Execute;
var
  a: TArray<Byte>;
begin
  for var k := 1 to 3 do
  begin
    SetLength(a, 1024 * 1024 * 500);
    FillChar(a[0], 1024 * 1024 * 500, 5);
    if Terminated then
      Exit;
    TFile.WriteAllBytes('C:\TThread.txt', a);
  end;
end;


Реализация для TTask
+
procedure TForm1.Button2Click(Sender: TObject);
var
  x: ITask;
begin
  x := TTask.Run(
    procedure
    var
      a: TArray<Byte>;
    begin
      for var k := 1 to 3 do
      begin
        SetLength(a, 1024 * 1024 * 500);
        FillChar(a[0], 1024 * 1024 * 500, 5);
        if TTask.CurrentTask.Status = TTaskStatus.Canceled then
          Exit;
        TFile.WriteAllBytes('C:\TTask.txt', a);
      end;
    end
  );
  while x.Status <> TTaskStatus.Running do
    ; // Убеждаемся что задача начала выполнятся
  x.Cancel();
  Application.Terminate();
end;


И что мы видим... Работает и то и то.
Но преимущества TTask
1) Код не размазан и лаконичен
2) Нет оверхеда на создание/уничтожение потоков
3) Задачу выполнения работы решает не примитив (поток), а инструмент (задача) который по факту может ее решить как угодно, вплоть до делегирования другому процессу.

Вы как поставите задачу подчиненному программисту?
1) Произвести запись в файл асинхронно.
2) Произвести запись в файл используя отдельный поток.
8 июл 20, 19:54    [22164355]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
shalamyansky
Member

Откуда:
Сообщений: 161
X-Cite

Что будет? Access Violation будет.

С чего бы? GUI-поток завершится, но это не беда. Процесс будет жить, пока другой поток (другие потоки) не закончит свою работу. Вторичному потоку, который пишет в файл, от бывшего главного вроде бы ничего не нужно. Допишет файл, и тихо выйдет. По идее. На практике не проверил. Единственно, что вызывает сомнения - не будет ли сломан менеджер памяти, который должен на выходе из процедуры освободить байтовый массив. На первый взгляд, не будет.
8 июл 20, 20:42    [22164379]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

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

так вот почему такой странный топик про потоки. А я-то воспринял, как будто новичок украл твой ник и забавляется. Извини за наезд :)


Все нормально! У меня в тот момент возникли сложности с тем, как лучше описать Queue. Не получалось её описать в позитивном ключе. А тему завел по причине того, что у некоторых разработчиков на этом форуме есть положительный опыт и позитивные отзывы. В результате та тема мне очень помогла, удалось очень подробно описать Queue в позитивном ключе. А кое-кто писал, что на оф. сайте по Queue всё есть, головой только немного подумать нужно. Ну да, я подумал, разобрался (вроде), но страшно представить, сколько времени уйдет у новичка, если он будет методом тыка все грабли перебирать.


Док

Исходник книги на чем пишешь? Я тут кое-что время от времени перевожу, из markdown экспортируется весьма читабельно, а у тебя бледненько - текст труднее воспринимается


Пишу в ворде 2010года. Про markdown не знал, спасибо. Почитаю, пока отпуск!
В идеале хотелось бы пользоваться специализированным решением, которое было бы совместимо с системой контроля версий. Но при этом не тратить много времени.
8 июл 20, 22:31    [22164431]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1164
Гаджимурадов Рустам
DmSer> Работаю над учебником "Многопоточное программирование в Delphi для начинающих".

Это дело хорошее, полезное. Научный редактор есть
или ты надеешься на краудсорсинговую вычитку?


Я надеюсь, что если там есть откровенная лажа, то она без внимания не останется :)
При этом понимаю, что читать 58 страниц такого текста - это не роман прочитать. За час не управишься! :)

Гаджимурадов Рустам

> Примеры должны компилироваться во всех версиях Delphi, начиная
> с Delphi 2007 (кроме примера Ex12, где рассматривается метод Queue).

В Д7 не проверялось?


Я использую модуль TimeIntervals, там есть класс TTimeInterval, который является рекордом с методами. В D7 такое не скомпилится. Также я предполагаю, что в D7 были бы проблемы с отображением исходников в кодировке UTF-8. А мне приходится использовать UTF-8 для корректного отображения в гитхабе.
8 июл 20, 22:40    [22164437]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1164
X-Cite
Чтобы разрабатывать реальные проекты надо не многопоточность изучать, а терминологию и практики...

Очень хороший пример всего этого описан в ответе здесь.

Далее.. Delphi сейчас - это кроссплатформенная среда разработки, следовательно все примеры должны быть кроссплатформенные.
Все что в современной версии досталось в наследство от 1-7 версий должно быть похоронено как deprecated.
У этого всего давно появились другие аналоги, более удобные в проектировании и разработке.

Как минимум уже в начале неверно описана область применения PPL.
PPL - это способ выполнить некую работу (не важно какую, абсолютно любую) конкурентно не вдаваясь в детали реализации. Как она будет выполнена: параллельно, асинхронно или синхронно - это дело десятое и в современно мире особо об этом задумываться ненужно. Когда над проектом работают десятки разработчиков, порог входа должен быть низкий, чтобы иметь возможность дешево менять ресурсы, для этого и придумывают различные библиотеки и абстракции, которые в освоении намного проще.

Проблема в Дельфи в том, что разработчики которые туда пытаются придти учатся по книжкам которые написаны были во времена высокого порога входа в программирование, а не когда курсы клепают по 100 "программистов" в день...

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


Я достаточно много думал о том, нужно ли описывать базовые вещи, или сразу начать с PPL. Моя уверенность в том, что важнее описать базовые вещи укрепилась после серии вопросов на этом форуме, которые относятся к PPL, а также к CreateAnonymousThread от начинающих программистов и не очень. Да, начинающего программиста можно, как мартышку, научить выполнять конкретное действие через TTask.Run. Но он нихрена не понимает, как это работает, если не знает базовые вещи. Проблема в Дельфи в том, что там нет того асинхронного программирования, которое есть в C#, JavaScript, Rust, Kotlin и некоторых других ЯП. В ЯП, где есть асинхронная конструкция async/await (либо аналоги), программисты решают реальные бизнес-задачи и как раз там им не требуется задумываться о том, как задача будет выполнена: параллельно, асинхронно или синхронно. В языках, которые изначально спроектированы как многопоточные (имею ввиду прежде всего GoLang) в сто раз меньше связанных с многопоточностью проблем и граблей, чем в языке Delphi. А теперь им еще и шедулер улучшили!
8 июл 20, 22:58    [22164442]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1164
X-Cite
автор
Я хотел бы выделить две основные причины использования многопоточности в Delphi-программах
Задачи длительного ожидания завершения ввода-вывода.

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


Да, должны! Но какого объёма книжку нужно написать для начинающего, чтобы он смог написать красивую, надёжную, быструю программу с использованием, скажем Overbyte ICS? А будет ли он читать такую книгу? А что ему даст асинхронность Overbyte ICS (какое преимущество), если ему потребовалось запрос к БД выполнить? А будет ли он читать такую книгу, если тут на форуме все примеры в основном на Indy?
8 июл 20, 23:04    [22164445]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1164
X-Cite

Потому что
TTask.Run(
    procedure
    var
      V: Int64;
    begin
      V := DoLongCalculations;
      MyShowMessage('Результат: ' + IntToStr(V));
    end
  );

намного лучше, т.к. нет оверхеда на создание/разрушение потоков

Лучше учить решать задачи наиболее подходящим инструментом, чем учить использовать примитив везде где попало.

Иначе книжку надо переименовать в Работа с классом TThread, а не многопоточное программирование...


В интернете достаточно хороших примеров того, как использовать PPL. Мне и добавить к ним нечего. Пусть начинающие учатся по этим примерам, ради Бога! Если удастся работать эффективно, я буду только рад за них.
8 июл 20, 23:09    [22164449]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9867
Хорошо работающая PPL это благо для начинающих (и не только).
Либо заголовок не правильный, либо план учебника ...
8 июл 20, 23:26    [22164461]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1164
X-Cite
procedure TForm1.Button2Click(Sender: TObject);
var
  x: ITask;
begin
  x := TTask.Run(
    procedure
    var
      a: TArray<Byte>;
    begin
      for var k := 1 to 3 do
      begin
        SetLength(a, 1024 * 1024 * 500);
        FillChar(a[0], 1024 * 1024 * 500, 5);
        if TTask.CurrentTask.Status = TTaskStatus.Canceled then
          Exit;
        TFile.WriteAllBytes('C:\TTask.txt', a);
      end;
    end
  );
  while x.Status <> TTaskStatus.Running do
    ; // Убеждаемся что задача начала выполнятся
  x.Cancel();
  Application.Terminate();
end;
.


И тут блестящая PPL разом превратилась в тыкву! Оказывается, как и с TThread, нужно останавливать таски перед завершением программы, а в таске проверять необходимость завершения :)
8 июл 20, 23:27    [22164462]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9867
DmSer
Оказывается ...

Так ты знаешь PPL или только TThread ? :)
8 июл 20, 23:32    [22164468]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
Все форумы / Delphi Ответить