![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу. Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста". Название темы слишком короткое или не отражает сути вашего вопроса. Тема исчерпала себя, помните, один вопрос - одна тема Прочитайте правила и заново правильно создайте тему. |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 26.02.2009
Сообщений: 3
|
![]()
Есть цикл, в котором нужно запускать два паралельных одинаковых потока (с разными параметрами). После их реализации нужно вернуться в главную програму. Потом цикл повторяется.
Как сделать так, чтобы поток не создавать и удалять каждый раз в цыкле? Тоесть, чтобы объявить его перед цыклом один раз и удалить после него... Пробывал с ф-цией waitfor, но она ожидает пока поток закончится и я не знаю, как запустить поток потом обратно(только через Create, который со временем без уничтожения Destroy выдает нехватку памяти)... Тоесть мне нужно либо ф-ция типа waitfor, которая ждет то остановки потока(suspend), или как можно запускать повторно поток. Это все связанно с тем, чтобы увеличить быстродействие, а при каждом создании и уничтажении в цикле программа работает даже дольше чем без потоков... Огромная просьба помочь с этой проблемой. Спасибо. |
![]() |
![]() |
#2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
Насколько я знаю (поправьте меня) Когда поток завершается то сам "удаляет" себя
I'm learning to live...
|
![]() |
![]() |
#3 | |
Регистрация: 26.02.2009
Сообщений: 3
|
![]() Цитата:
T1:=TT1.Create(true); //создание 1 потока T1.FreeOnTerminate:=false; T1.Priority:=TpNormal; T2:=TT1.Create(true); //создание 2 потока T2.FreeOnTerminate:=false; T2.Priority:=TpNormal; цикл начинается T1.Resume; T2.Resume; s:=T1.WaitFor; s:=T2.WaitFor; T1:=TT1.Create(true); T2:=TT1.Create(true); ...какоето действие цикл заканчивается А если после waitfor удалить их(Free), то не выдает... Это еще связанно с тем, что я указал FreeOnTerminate:=false; - это для того, чтобы работала ф-ция waitfor.... Последний раз редактировалось VALERO; 26.02.2009 в 15:32. |
|
![]() |
![]() |
#4 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
а-а-а так ты VCL'ными потоками...
Я про WinAPI'шные говорил...
I'm learning to live...
|
![]() |
![]() |
#5 |
Регистрация: 26.02.2009
Сообщений: 3
|
![]()
Класс TT1 у меня вот какой (не судите строго, просто разбивал на несколько ядер цикл) :
type TT1 = class(TThread) constructor Create(x : integer); private { Private declarations } protected procedure Execute; override; public Nom : integer; end; implementation uses unit2, ownlibr; constructor TT1.Create(x : integer); begin inherited Create(true); Nom:=x; end; procedure TT1.Execute; var I,J,K,l,r: Integer; begin l:=trunc(Imax/Jadra)*(Nom-1)+1; if Nom=Jadra then r:=Imax Else r:=trunc(Imax/Jadra)*Nom; for I:=l to r do for J:=1 to Jmax do EG[I,J]:=0; end; ...... И вызов вот такой : T1 := TT1.Create(1); T2 := TT1.Create(2); T1.FreeOnTerminate := false; T1.Priority := tpNormal; T2.FreeOnTerminate := false; T2.Priority := tpNormal; начало цикла T1.Resume; T2.Resume; s1:=T1.WaitFor; s2:=T2.WaitFor; T1.Free; T2.Free; T1 := TT1.Create(1); T2 := TT1.Create(2); конец цикла Если кто знает как в главной программе проверять остановку потока(Suspended) или еще что-то, то советуем не стесняемся ![]() |
![]() |
![]() |
#6 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
Ну попробуй создай отдельный поток который будет проверять состояние остальных...
I'm learning to live...
|
![]() |
![]() |
#7 |
Пользователь
Регистрация: 02.02.2009
Сообщений: 54
|
![]()
у меня малость другая задача. но в тему.
есть поток Код:
TMyThread.Create(_Link,_File); так вот: есть некий цикл который 500 раз пишет TMyThread.Create(_Link,_File); со значениями и за одно мгновение запускает 500 потоков. вопрос: как сделать очерёдность чтобы цикл запустился запустил первый поток дождался его завершения, присвоил некоей переменной значение _ThreadResult которая говорит об успешности(или нет) выполнения кода скачивания, и лишь после этого заустился второй по очеди поток и всё повторилось пока цикл for не окончился. спасибо. |
![]() |
![]() |
#8 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
делай вложенный While цикл который проверяет состояние потока
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 02.02.2009
Сообщений: 54
|
![]()
а как его проверить? каким методом?
|
![]() |
![]() |
#10 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
если не ошибаюсь то проверяй свойство Suspended у потока
(если true, то он спит;иначе работает) еще глянь как автор топика делает Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Использование потоков | Repz | Общие вопросы Delphi | 6 | 25.01.2008 14:20 |
Несколько потоков | Adm | Общие вопросы Delphi | 13 | 18.01.2008 20:04 |
Перенаправление потоков | Carbon | Win Api | 5 | 25.11.2007 14:46 |
Дескрипторы потоков - Для каждого элемента списка необходимо создать поток, выполняющий требуемые функции | kdv0403 | Общие вопросы Delphi | 2 | 09.06.2007 11:12 |