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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 26.02.2009, 14:28   #1
VALERO
 
Регистрация: 26.02.2009
Сообщений: 3
По умолчанию Запуск потоков в цикле

Есть цикл, в котором нужно запускать два паралельных одинаковых потока (с разными параметрами). После их реализации нужно вернуться в главную програму. Потом цикл повторяется.

Как сделать так, чтобы поток не создавать и удалять каждый раз в цыкле? Тоесть, чтобы объявить его перед цыклом один раз и удалить после него... Пробывал с ф-цией waitfor, но она ожидает пока поток закончится и я не знаю, как запустить поток потом обратно(только через Create, который со временем без уничтожения Destroy выдает нехватку памяти)... Тоесть мне нужно либо ф-ция типа waitfor, которая ждет то остановки потока(suspend), или как можно запускать повторно поток. Это все связанно с тем, чтобы увеличить быстродействие, а при каждом создании и уничтажении в цикле программа работает даже дольше чем без потоков...

Огромная просьба помочь с этой проблемой. Спасибо.
VALERO вне форума
Старый 26.02.2009, 15:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Насколько я знаю (поправьте меня) Когда поток завершается то сам "удаляет" себя
I'm learning to live...
Stilet вне форума
Старый 26.02.2009, 15:26   #3
VALERO
 
Регистрация: 26.02.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Насколько я знаю (поправьте меня) Когда поток завершается то сам "удаляет" себя
Ну вот таким образом через некоторое время выскакивает недостаточно памяти

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.
VALERO вне форума
Старый 26.02.2009, 16:09   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

а-а-а так ты VCL'ными потоками...
Я про WinAPI'шные говорил...
I'm learning to live...
Stilet вне форума
Старый 26.02.2009, 16:22   #5
VALERO
 
Регистрация: 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) или еще что-то, то советуем не стесняемся
VALERO вне форума
Старый 26.02.2009, 16:54   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну попробуй создай отдельный поток который будет проверять состояние остальных...
I'm learning to live...
Stilet вне форума
Старый 26.02.2009, 18:45   #7
ZeitGeist7
Пользователь
 
Регистрация: 02.02.2009
Сообщений: 54
По умолчанию

у меня малость другая задача. но в тему.
есть поток
Код:
unit DownloadTread;

interface

uses
  Classes , Windows , wininet ;

//--------------------поток---------------------------
//---------------создание--потока---------------------
type
TMyThread = class(TThread)
  private
    _ThreadLink, _ThreadFile : string;
    F: File;
    BufferLen,SumSize: DWORD;
    hSession, hURL: HInternet;
    Buffer: array[1..1024] of Byte;
    err: boolean;

  protected

    procedure Execute; override;
   public
    constructor Create(const ThreadLink: string; const ThreadFile: string );
  end;

implementation
//uses MainUnit;
 // Synchronize(ThreadBoolUpdate);
//---------------создание--потока---------------------

constructor TMyThread.Create(const ThreadLink: string; const ThreadFile: string );
begin
  _ThreadLink := ThreadLink;
  _ThreadFile := ThreadFile;
  inherited Create(False);
end;
//--------------для-синхронизации-результата-выполнения-потока-------
procedure ThreadBoolUpdate;
begin
//
end;
//--------------для-синхронизации-результата-выполнения-потока-------
//---------------код--потока--------------------------
procedure TMyThread.Execute;
begin
FreeOnTerminate := True;
try
  SumSize:=0;                         //_ThreadLink, _ThreadFile
//  ResumePos:=0;   //Инициализируемся
  AssignFile (F,_ThreadFile);  //Свяжемся с файлом
  ReWrite(f,1);  //А раз нет, так создадим
//Открыли сессию
  hSession:= InternetOpen('X-Kachalka',PRE_CONFIG_INTERNET_ACCESS,nil,nil,0);
//И наш УРЛ
  hURL := InternetOpenURL(hSession,PChar(_ThreadLink),nil,0,0,0);
  InternetQueryDataAvailable(hURL, SumSize,0,0);
  REPEAT //Качаем
    err:= InternetReadFile(hURL, @Buffer,SizeOf(Buffer),BufferLen); //Читаем буфер
    IF err= false or terminated then //Ошибка чтения
       begin
          InternetCloseHandle(hURL);
          Closefile(f);
 //         _ThreadResult := false;
          exit;
          terminate;
       end;
     BlockWrite(f, Buffer, BufferLen); //Пишем в файл
  UNTIL (BufferLen= 0);
   begin
      InternetCloseHandle(hURL);
//      _ThreadResult := true;
      Closefile(f);
      terminate;
   end;
except
 begin
//  _ThreadResult := false;
  InternetCloseHandle(hURL);

 end;
terminate;
end;
end;
//---------------код--потока--------------------------
//--------------------поток---------------------------

end.
запускается строкой
TMyThread.Create(_Link,_File);

так вот: есть некий цикл который 500 раз пишет TMyThread.Create(_Link,_File); со значениями и за одно мгновение запускает 500 потоков.
вопрос: как сделать очерёдность чтобы цикл запустился запустил первый поток дождался его завершения, присвоил некоей переменной значение _ThreadResult которая говорит об успешности(или нет) выполнения кода скачивания, и лишь после этого заустился второй по очеди поток и всё повторилось пока цикл for не окончился.
спасибо.
ZeitGeist7 вне форума
Старый 26.02.2009, 19:34   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

делай вложенный While цикл который проверяет состояние потока
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума
Старый 27.02.2009, 08:03   #9
ZeitGeist7
Пользователь
 
Регистрация: 02.02.2009
Сообщений: 54
По умолчанию

а как его проверить? каким методом?
ZeitGeist7 вне форума
Старый 27.02.2009, 12:15   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если не ошибаюсь то проверяй свойство Suspended у потока
(если true, то он спит;иначе работает)
еще глянь как автор топика делает
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование потоков 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