powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Языки программирования семейства Pascal [закрыт для гостей] / Про многопоточность подскажите
5 сообщений из 30, страница 2 из 2
Про многопоточность подскажите
    #1222042
Гарыныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей кроме]
[spoiler][size=4][b]Клоп и Сталкер, жидки вы обоссаные, просто пройдите нахуй![/b][/size] [:nahui][/spoiler]
Гарыныч  27.11.2024, 13:48
[игнорируется]
Цитата 
[игнорируется]
WaitingToRun (задача ожидает окончания выполнения другого процесса)
Просто Трёп  28.11.2024, 17:14
[игнорируется]
Гарыныч  27.11.2024, 13:48
[игнорируется]
Цитата 
[игнорируется]
WaitingToRun (задача ожидает окончания выполнения другого процесса)
Какого такого процесса?
другого

http://www.proghouse.ru/programming/36-delphi-xe7-ppl
Цитата 
[игнорируется]
А теперь попробуем выполнить несколько задач параллельно. Для этого нужно создать массив задач, запустить задачи и ждать когда они выполнятся. Для ожидания есть две статические функции класса TTask: WaitForAll (ожидать выполнения всех задач) и WaitForAny (ожидать выполнения хотя бы одной из задач).

uses System.Threading, System.SyncObjs;

procedure TForm1.Button2Click(Sender: TObject);
var
tasks: array of ITask;
task: ITask;
value: integer;

procedure CreateTasks;
begin
value := 0;
tasks := [
TTask.Create(procedure()
begin
//Выполняем задачу 5 секунд.
Sleep(5000);
//Добавляем к результату 5000.
TInterlocked.Add(value, 5000);
end
),
TTask.Create(procedure()
begin
//Выполняем задачу 3 секунды.
Sleep(3000);
//Добавляем к результату 3000.
TInterlocked.Add(value, 3000);
end
)
];
end;

begin
//Создаём задачи и инициализируем переменную value.
CreateTasks;
//Запускаем все задачи в массиве.
for task in tasks do
task.Start;
//Ждём выполнение всех задач.
TTask.WaitForAll(tasks);
//Результат будет 8000.
ShowMessage('Все задания выполнены. Результат: ' + IntToStr(value));
//Создаём задачи и инициализируем переменную value.
CreateTasks;
//Запускаем все задачи в массиве.
for task in tasks do
task.Start;
//Ждём выполнение любой из задач.
TTask.WaitForAny(tasks);
//Результат будет 3000.
ShowMessage('Все задания выполнены. Результат: ' + IntToStr(value));
end;
И напоследок, ещё один пример, в котором я покажу, как обращаться к свойствам и контролам формы из процедуры задачи, как проверять статус задачи и как отменить её выполнение.
...
Гарыныч :
Клоп-жидок, тебе в 1991 году сколько годиков было? 19?
Изменено: 28.11.2024, 17:27 - Гарыныч
Рейтинг: 0 / 0
Про многопоточность подскажите
    #1223372
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто Трёп  28.11.2024, 17:13
[игнорируется]
s62  27.11.2024, 13:51
[игнорируется]
Просто Трёп  27.11.2024, 13:20
[игнорируется]
TTask - это фоновое задание? Как в 1С?
TTask - Это класс, который позволяет выполнить передаваемую процедуру в фоновом потоке.
Просто в другом потоке? А синхронизации данных вообще никакой? Ну, я выдал ей какие-то данные, запустил и жду, пока она их обработает. К данным не обращаюсь, пока она не закончит. Так?
Читай доки! )
...
Рейтинг: 0 / 0
Про многопоточность подскажите
    #1225977
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из старой книжки (Тексейра и Пачеко, Делфи 5 руководство разработчика).
CritSecMutexes.png
...
Изменено: 29.11.2024, 14:32 - s62
Рейтинг: 0 / 0
Про многопоточность подскажите
    #1228557
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62  28.11.2024, 23:10
[игнорируется]
Просто Трёп  28.11.2024, 17:13
[игнорируется]
s62  27.11.2024, 13:51
[игнорируется]
Просто Трёп  27.11.2024, 13:20
[игнорируется]
TTask - это фоновое задание? Как в 1С?
TTask - Это класс, который позволяет выполнить передаваемую процедуру в фоновом потоке.
Просто в другом потоке? А синхронизации данных вообще никакой? Ну, я выдал ей какие-то данные, запустил и жду, пока она их обработает. К данным не обращаюсь, пока она не закончит. Так?
Читай доки! )
С одной стороны документацию читать вообще полезно. ) С другой - я сам про эти классы и интерфейсы знаю в основном из документации, по-моему ни разу не пользовался. Как-то больше по-старинке через класс TThread делал. Хотя в принципе понятно, где бы можно было применить TTask. Вот например в одной из программ, которой сейчас занимаюсь, есть потоки которые живут в принципе всё время, пока работает программа - дополнительные рабочие потоки, в которых идет обмен по сети с устройствами измерительной установки. С одной установкой - один рабочий поток, плюс дополнительные могут стартовать. Программа может работать с несколькими установками, соответственно несколько таких рабочих потоков.
А например запись в лог делается из доп. потока, которому передается строка, имя файла лога (или может писаться в лог по-умолчанию), поток создается, открывает файл, дописывает в конце строку, закрывает файл и прекращает свою работу и уничтожается. Делается через критическую секцию, на случай коллизий. Вот тут наверное можно было бы сделать через TTask. Описать процедуру и запустить её через TTask.
Кстати, один момент тут - TTask использует пул потоков.
Насчёт получения результата есть интерфейс IFuture, тоже по докам и примеру в доках знакОм. Там можно вызвать, позднее попытаться получить результат, и если он уже есть, то сразу получаем, если нет, то вызывающий поток ждет, пока будет. Есть ещё свойство Status, можно посмотреть, завершился таск или нет или в каком сейчас состоянии.
...
Изменено: 29.11.2024, 21:41 - s62
Рейтинг: 0 / 0
Про многопоточность подскажите
    #1228632
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62  29.11.2024, 21:39
[игнорируется]
Там можно вызвать
Неточно написал, имел в виду запустить задачу, вызвать метод Start.
...
Рейтинг: 0 / 0
5 сообщений из 30, страница 2 из 2
Форумы / Языки программирования семейства Pascal [закрыт для гостей] / Про многопоточность подскажите
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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