169 похожих чатов

Кстати... А если например мне нужно будет прервать выполнения

задачи (типичный случай когда пользователь нетерпеливый)? Это возможно будет?

3 ответов

4 просмотра

да

Serg-Vish Автор вопроса
Delphi Coder
да

смотрю пример с CancellationToken. Вроде понятно. Спасибо.

Serg Vish
смотрю пример с CancellationToken. Вроде понятно. ...

Этого класса нет его самому придется делать есть другой пример: В Delphi 11 метод CheckCanceled используется в рамках задач (tasks), запущенных через TTask. Этот метод позволяет проверять, был ли запрос на отмену задачи. Если отмена задачи была запрошена, метод CheckCanceled выбрасывает исключение EOperationCancelled, которое может быть перехвачено в блоке try...except. Это позволяет корректно завершить задачу, когда ее отмена была запрошена. ### Как это работает: 1. Запуск задачи: Вы создаете и запускаете задачу с помощью TTask.Run. 2. Отмена задачи: Метод Cancel вызывает отмену задачи. Внутри самой задачи CheckCanceled периодически проверяет, была ли задача отменена. 3. Исключение `EOperationCancelled`: Когда задача была отменена и вызван CheckCanceled, выбрасывается исключение, которое завершает выполнение задачи. ### Пример кода на Delphi 11 с использованием CheckCanceled: uses System.SysUtils, System.Classes, System.Threading; var Task: ITask; procedure StartTask; begin // Запускаем задачу Task := TTask.Run(procedure begin try for var i := 1 to 10 do begin // Выполняем проверку на отмену задачи TTask.CheckCanceled; // Выполняем длительную операцию Sleep(1000); // Имитация долгой работы TThread.Queue(nil, procedure begin Writeln('Шаг ', i, ' выполнен'); end); end; except on E: EOperationCancelled do begin // Обрабатываем исключение отмены задачи TThread.Queue(nil, procedure begin Writeln('Задача была отменена'); end); end; on E: Exception do begin // Обработка других исключений TThread.Queue(nil, procedure begin Writeln('Ошибка: ', E.Message); end); end; end; // Завершение задачи TThread.Queue(nil, procedure begin Writeln('Задача завершена'); end); end); end; procedure CancelTask; begin if Assigned(Task) then begin // Отменяем задачу Task.Cancel; Writeln('Отмена задачи запрошена'); end; end; // Пример использования begin StartTask; // Запуск задачи Sleep(3000); // Ждем 3 секунды CancelTask; // Запрашиваем отмену задачи Readln; // Ждем нажатия клавиши для выхода end. ### Объяснение примера: 1. `StartTask`: Создаем и запускаем задачу через TTask.Run. В цикле от 1 до 10 выполняется проверка с помощью TTask.CheckCanceled. 2. `CheckCanceled`: Этот метод проверяет, была ли задача отменена. Если отмена была запрошена, метод выбрасывает исключение EOperationCancelled. 3. Отмена задачи: Через 3 секунды после запуска вызывается процедура CancelTask, которая запрашивает отмену задачи с помощью метода Cancel. 4. Обработка исключения: В блоке try...except перехватывается исключение EOperationCancelled, что позволяет корректно завершить задачу. ### Итог: CheckCanceled делает процесс отмены задачи безопасным и позволяет избежать выполнения оставшихся операций, если задача была отменена. Это удобный механизм для управления долгими операциями.

Похожие вопросы

Обсуждают сегодня

Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
привет всем. Народ, кто-нибудь работал с мультипоточностью? Где посмотреть/ что почитать посоветуете? В идеале чтоб материал был максимально сжатый, времени читать например в...
Serg Vish
18
Всем привет! Скажите, никто не пытался уменьшить размер процесса ssl, которые ассоциируется с открытым соединением (не помню точное название этого процесса, но там была какая-...
Алексей
20
now Linux kernel development is becoming a dictatorship group: https://www.youtube.com/watch?v=xPF2NSFvNCc
Sharuzzaman Ahmat Raslan
23
This is a big issue. Just by being a citizen of a country, you are denied to contribute to Open Source software: https://youtu.be/L5Ec5jrpLVk?si=1iIuHnMPbCB4anV-
Sharuzzaman Ahmat Raslan
72
а проверьте, собирается ли у кого сейчас транк лазаря через делюкс? у меня вот: fpcupdeluxe: info: Lazarus Native Installer (BuildModuleCustom: UserIDE): LazBuild: building Us...
Iluha Companets
20
добрый день. возможно ли изменить цвет окон лазаруса? Как?
Budemposmotret
35
А какие существуют способы обработки ошибок выделения памяти в ядре? Т.е., допустим, есть функция, которая возвращает адрес свободной страницы в физической памяти и диапазон в...
disba1ancer
51
Мне тут приспичило встроить в программу форматировние текста SQL, расставить переносы строк и отступы так, чтобы лучше читалось. Я что-то свое изобразил, оно после ключевых сл...
Sergey Bodrov
11
Карта сайта