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

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

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

3 ответов

11 просмотров

да

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 делает процесс отмены задачи безопасным и позволяет избежать выполнения оставшихся операций, если задача была отменена. Это удобный механизм для управления долгими операциями.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта