Перейти к содержанию
Fire Monkey от А до Я
  • 0

Параллельные вычисления, System.Threading


Alex7wrt

Вопрос

В своей старой программе я использовал потоки TThread для параллельного вычисления с помощью всех ядер процессора. Но у меня возникали проблемы с синхронизацией после каждого завершенного потока.

Узнал, что существует модуль System.Threading, в котором есть всякие TTask иTParallel. И, что меня заинтересовало, TTask.WaitForAll. Вот только не пойму как это все использовать, 

В частности, мне нужен вывод на экран информации каждый раз после того, как все потоки завершат свою работу.

Например, есть 4-х ядерный процессор. Я создаю 4 потока и каждому из них подсовываю определенную процедуру для выполнения. 

Мне нужно, чтобы после того, как все потоки закончили вычисления, вывелась информация на экран и они снова начали работать над своими процедурами. И так, пока я не остановлю.

Есть метод TTask.WaitForAll, который дожидается выполнения всех потоков TTask, но если после вызова этого метода вставить строку вывода на экран, а затем сразу же снова запустить потоки, то ничего не выводится, программа подвисает, но при этом загрузка процессора ни 100% как должна быть, а где-то 30%.

И для чего нужен TParallel, iFuture? Будьте добры, подскажите, кто в теме.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Вкратце вот здесь можно почитать http://proghouse.ru/programming/36-delphi-xe7-ppl

38 минут назад, Alex7wrt сказал:

Мне нужно, чтобы после того, как все потоки закончили вычисления, вывелась информация на экран и они снова начали работать над своими процедурами. И так, пока я не остановлю.

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

42 минуты назад, Alex7wrt сказал:

Есть метод TTask.WaitForAll, который дожидается выполнения всех потоков TTask, но если после вызова этого метода вставить строку вывода на экран, а затем сразу же снова запустить потоки, то ничего не выводится, программа подвисает, но при этом загрузка процессора ни 100% как должна быть, а где-то 30%.

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

Ссылка на комментарий
  • 0

если у вас возникали проблемы с TThread то лучше понять источник проблем. Использование System.Threading ничем не отличается в этом плане. Те же потоки создаются. Та же синхронизация требуется.

Для меня TTask - это способ в лучшем случае сделать что-то "по-быстрому". Если серьезное что, с отладкой, лучше по-прежнему пользовать TThread.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...