Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как заставить поток подождать выполнения остальных


Автор: Firion 21.6.2005, 11:08
Такая задача:
реализовать с помощью потоков выполнение следующих действий с матрицами A, B и C:
(А^2 - 2*A*B + C^2)
Я в основном модуле Unit1 генерирую матрицы А, В, С.
Во втором модуле Unit2 (созданном как File->New->Other...->Thread Object) описываю 4 новых дочерних класса TThread для 4х потоков и объявляю 4 новые переменные, соответствующие этим четырём классам (t1, t2, t3, t4); 3 из них я запускаю сразу же, так как они не должны мешать работе друг друга - первый умножает матрицу А саму на себя, второй делает 2*А*В, третий возводит С в квадрат(все промежуточные результаты заносятся в глобальные переменные: P1=A^2, P2=2*A*B, P3=C^2). Эти три потока будут выполняться одновременно. Четвёртый поток должен дождаться, пока завершат работу первые три потока, и уже после этого начнёт свои действия: S1:=P1-P2; S2:=S1+P3;
Но как заставить поток №4 ждать завершения остальных?

P.S. Знаю о функции WaitFor, но нигде не нашёл, как именно её следует применять, и что она возвращает. И есть ли ещё какие-нибудь не слишком замысловатые способы?

Автор: _hunter 21.6.2005, 11:19
простой -- бери 4 мьютекса и в каждом потоке устанавливай свой.
жлать WaitForSingleObject

Автор: Poseidon 21.6.2005, 12:43
Цитата(Firion @ 21.6.2005, 11:08)
Знаю о функции WaitFor, но нигде не нашёл, как именно её следует применять, и что она возвращает.
function WaitFor: Integer;

Метод WaitFor предназначен для синхронизации и позволяет одному потоку дождаться момента, когда завершится другой поток. Если ты внутри потока FirstThread напишешь код
Код
Code := SecondThread.WaitFor;

то это означает, что поток FirstThread останавливается до момента завершения потока SecondThread. Метод WaitFor возвращает код завершения ожидаемого потока


Автор: Петрович 21.6.2005, 15:50
Рекомендую почитать http://mbo88.narod.ru/ToC.html
Что же касается твоей задачи, то напиши в начале тела t4:
Код

  t1.WaitFor;
  t2.WaitFor;
  t3.WaitFor;

Автор: Firion 22.6.2005, 13:00
Всем огромное спасибо!
Теперь всё работает!:D

Автор: bel_nikita 22.6.2005, 13:35
вообще WinAPI: Sleep(0) переключит потоки, т.е. поставит текущий поток в очередь последним

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)