Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2010, 14:53   #1
Федеор
 
Регистрация: 30.10.2010
Сообщений: 5
По умолчанию Вопрос по TThread

Добрый день!
Пытаюсь для ускорения вычислений независимые друг от друга расчеты произвести в разных потока, рассчитывая на выигрыш за счет многоядерности процессора. Вот что я написал:

Код:
TMyThread1 = class(TThread)
 private
   { Private declarations }
 protected
    nI:integer;
   procedure Execute; override;
 end;

TMyThread2 = class(TThread)
 private
   { Private declarations }
 protected
    nI:integer;
   procedure Execute; override;
 end;

procedure TMyThread1.Execute;
 begin
   U[ni].Wx0 := U[ni].Fx / U[ni].m1;
   U[ni].Vx := U[ni].Vx + dt24*(55*U[ni].Wx0 - 59*U[ni].Wx1 + 37*U[ni].Wx2 - 9*U[ni].Wx3);
   U[ni].x := U[ni].x + U[ni].Vx*dt + dt2_360*(323*U[ni].Wx0 - 264*U[ni].Wx1 + 159*U[ni].Wx2 - 38*U[ni].Wx3);

 end;

 procedure TMyThread2.Execute;
 begin
   U[ni].Wy0 := U[ni].Fy / U[ni].m1;
   U[ni].Vy := U[ni].Vy + dt24*(55*U[ni].Wy0 - 59*U[ni].Wy1 + 37*U[ni].Wy2 - 9*U[ni].Wy3);
   U[ni].y := U[ni].y + U[ni].Vy*dt + dt2_360*(323*U[ni].Wy0 - 264*U[ni].Wy1 + 159*U[ni].Wy2 - 38*U[ni].Wy3);
 end;

T1 := TMyThread1.Create(True);
T2 := TMyThread2.Create(True);

в нужны момент запускаю:
 begin
          if i=1 then T1.Resume;
          T1.nI :=i;
          T1.Execute;

          if i=1 then T2.Resume;
          T2.nI :=i;
          T2.Execute;
 end;
Будут ли в моем случае потоки выполняться параллельно?
Спасибо

Последний раз редактировалось Федеор; 14.11.2010 в 15:49.
Федеор вне форума Ответить с цитированием
Старый 14.11.2010, 15:12   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Думаю да, правда какой то запуск замысловатый.
BOBAH13 вне форума Ответить с цитированием
Старый 14.11.2010, 15:44   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

где создание потоков?
что за вызов Execute?(этот метод выполняет поток, вы его вообще вызывать не должны)
Resume поидее достаточно(если поток был создан через TThread.Create(True))
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.11.2010, 15:45   #4
Федеор
 
Регистрация: 30.10.2010
Сообщений: 5
По умолчанию

После создания потока я его не сразу запускаю, т.к. не готовы некоторые исходные данные, необходимые для расчетов внутри потока.
Поэтому я сначала создаю приостановленный поток, получаю исходные данные, после чего я его возобновляю и запускаю Exeсute. Может быть я что-то неправильно понимаю?

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
где создание потоков?
что за вызов Execute?(этот метод выполняет поток, вы его вообще вызывать не должны)
Resume поидее достаточно(если поток был создан через TThread.Create(True))
я сделал:
Код:
T1 := TMyThread1.Create(True);
T2 := TMyThread2.Create(True);
Без вызова T1.Execute почему-то поток не запускается.
UP
понял в чем дело:
мне необходимо, чтобы на каждой итерации расчета в уже запущенном потоке выполнялся код, описанный в Execute. Поэтому я его вручную поместил в итерационный цикл.

Последний раз редактировалось Stilet; 14.11.2010 в 16:09.
Федеор вне форума Ответить с цитированием
Старый 14.11.2010, 16:12   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
мне необходимо, чтобы на каждой итерации расчета в уже запущенном потоке выполнялся код, описанный в Execute. Поэтому я его вручную поместил в итерационный цикл.
А потоки то тут зачем? Они выгоду не дают если ты в них поместил код, который выполняется быстро...
Может тебе нужно поместить цикл в потоки?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.11.2010, 16:41   #6
Федеор
 
Регистрация: 30.10.2010
Сообщений: 5
По умолчанию

понял, так мне и нужно сделать
и еще вопрос - у меня есть общий цикл с вложенными циклами
вложенные циклы я хочу выполнять в отдельных потоках
возможно ли создать поток для выполнения этого вложенного цикла только один раз? (чтобы на каждой итерации главного цикла не создавать/уничтожать потоки)
Федеор вне форума Ответить с цитированием
Старый 14.11.2010, 16:52   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

М.м.м по-моему можно.
Создай один раз, а потом запускай его много раз, но...
Ты учти - если поток в цикле запустишь, то он не приостановит цикл, который пойдет на следующую итерацию.
Не стоит разрывать циклы так.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с TThread pesi Общие вопросы Delphi 2 09.08.2010 14:12
TThread в С++ Builder alun C++ Builder 7 02.06.2010 21:55
TThread Vladislav_I Общие вопросы Delphi 0 30.04.2010 19:47
TThread в Дельфи ImmortalAlexSan Помощь студентам 2 23.04.2010 16:24
TThread и GUI Freezer Общие вопросы Delphi 8 05.08.2009 11:50