Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Технология работы процедуры   Найти похожие ветки 

 
allrussia   (2010-03-19 00:54) [0]

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

for i:= 0 to 1000 do
запуск_и_ожидание_завершения_работы_программы


в этом случае каждая следующая программа запустится только при завершении предыдущей

а мне нужно чтобы запустились все сразу и все сразу ожидали бы завершения

Спасибо


 
Германн ©   (2010-03-19 01:02) [1]

http://delphimaster.ru/cgi-bin/faq.pl?look=1&id=988621841&n=15


 
Германн ©   (2010-03-19 01:06) [2]

Блин невнимательно прочитал сабж.


 
Германн ©   (2010-03-19 01:10) [3]

Тогда, имхо, [1] в отдельном потоке.


 
Игорь Шевченко ©   (2010-03-19 01:29) [4]


> а мне нужно чтобы запустились все сразу и все сразу ожидали
> бы завершения


чьего завершения ?


 
allrussia   (2010-03-19 01:38) [5]

Игорь Шевченко

своего
причем можно было бы управлять отдельно каждой процедурой

ну например менеджер закачек
каждая процедура закачки независима от всех остальных
при этом, являясь  по сути, одной и той же процедурой для всех закачек


 
allrussia   (2010-03-19 01:41) [6]

Германн
пробовал, глючит

th: cardinal;

...
procedure NG;
begin
doing something...
end;

for i:= 0 to 1000 do
BeginThread(0,1024,@NG,nil,0,th);


понимаю, надо как то по другому
меня смущает один и тот же th  для всех потоков

как надо? :)


 
Германн ©   (2010-03-19 02:12) [7]


> allrussia   (19.03.10 01:41) [6]
>
> Германн
> пробовал, глючит
>

Отмазка.

Чем Дельфийский класс TThread не устроил?


 
allrussia   (2010-03-19 02:30) [8]

пробовал - не могу разобраться в глюке


...
TMyThread = class(TThread)
private
  FUrl: string;
public
  constructor Create(CreateSuspended: Boolean; AUrl: string);
protected
  procedure Execute; override;
  procedure UpdateCaption;
end;

var
 Form1: TForm1;
 n: integer;

implementation

{$R *.dfm}

constructor TMyThread.Create(CreateSuspended: Boolean;AUrl: string);
begin
inherited Create(CreateSuspended);
FUrl := AUrl;
FreeOnTerminate := true;
end;

procedure TMyThread.Execute;
begin
FUrl := FUrl + "0";
Synchronize(UpdateCaption);
end;

procedure TMyThread.UpdateCaption;
begin
with Form1.ListBox1.Items do
begin
  Strings[n]:=FUrl;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
n:=0;
for i := 0 to 1000 do
ListBox1.Items.Add(inttostr(i))

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i: integer;
begin
for i:= ListBox1.Items.Count - 1 downto 0 do
 if  Pos("1", ListBox1.Items.Strings[i]) > 0 then
 begin
   n:= i;
   TMyThread.Create(False,ListBox1.Items.Strings[n]);
 end;
end;


 
Юрий Зотов ©   (2010-03-19 02:31) [9]

> allrussia   (19.03.10 00:54)  

Запуск и ожидание завершения работы программы делаются через вызовы CreateProcess и WaitForSingleObject (ссылку Вам дали). А чтобы они запустились все сразу, эти вызовы надо поместить в метод Execute потока (Вашего потомка TThread) - и тогда останется только запустить сколько Вам нужно таких потоков в цикле for.


 
allrussia   (2010-03-19 02:32) [10]

почему у n - всегда первое где есть "1" значение списка, не могу понять хоть убей


 
allrussia   (2010-03-19 02:34) [11]

Юрий Зотов

Спасибо, Юрий. Запуск внешней программы - всего лишь пример. Про это я знаю.
А вот с потоками нужна помощь. Посмотрите мой пример (8), пожалуйста.


 
allrussia   (2010-03-19 02:42) [12]

кажется, разобрался
поправьте если чего не так

TMyThread = class(TThread)
private
  FUrl: string;
     n: integer;
public

  constructor Create(CreateSuspended: Boolean; AUrl: string; nn: integer);
protected

  procedure Execute; override;
  procedure UpdateCaption;
end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

constructor TMyThread.Create(CreateSuspended: Boolean;AUrl: string; nn: integer);
begin
inherited Create(CreateSuspended);
FUrl := AUrl;
n:= nn;
FreeOnTerminate := true;
end;

procedure TMyThread.Execute;
begin
FUrl := FUrl + "0";
Synchronize(UpdateCaption);
end;

procedure TMyThread.UpdateCaption;
begin
with Form1.ListBox1 do
begin
   Items[n]:= FUrl;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin

for i := 0 to 1000 do
ListBox1.Items.Add(inttostr(i))

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i: integer;
begin
for i:= 0 to ListBox1.Items.Count-1 do
 if  Pos("1", ListBox1.Items.Strings[i]) > 0 then
 begin
   TMyThread.Create(False,ListBox1.Items.Strings[i],i);
 end;
end;


 
Германн ©   (2010-03-19 04:19) [13]


> allrussia   (19.03.10 02:42) [12]
>
> кажется, разобрался
> поправьте если чего не так
>
>

А всё не так.
На кой хрен нужен доппоток, если он ничего не делает, кроме
FUrl := FUrl + "0";?


 
Германн ©   (2010-03-19 05:05) [14]

P.S.
Метод Synchronize в TThread  введен для троешников!
Имхо, с которым наверно многие не согласятся.


 
allrussia   (2010-03-19 05:43) [15]

Германн
На кой хрен нужен доппоток, если он ничего не делает, кроме
FUrl := FUrl + "0";?


Это всего лишь пример


 
Anatoly Podgoretsky ©   (2010-03-19 08:48) [16]

> allrussia  (19.03.2010 05:43:15)  [15]

Это кривой Архангельский пример


 
allrussia   (2010-03-19 15:57) [17]

вопрос по поводу [12]:

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

Anatoly Podgoretsky

Тогда приведите "прямой" Подгорецкий :)


 
Anatoly Podgoretsky ©   (2010-03-19 16:07) [18]

Поиск на любом форуме, если отклонить Архангельские методы даст уйму информации. Не должно быть только Synchronize в Execute


 
Дмитрий С ©   (2010-03-19 16:42) [19]

WaitForMultipleObjects
?


 
Дмитрий С ©   (2010-03-19 16:47) [20]

Или
 for i:= 0 to 1000 do
   запуск_и_складывание_hProcess_в_массив_hProcesses;

 for i:= 0 to 1000 do
   WaitForSingleObject(hProcesses[i]);

ЗЫ.
на 1000 процессов, скорее всего, не хватит ресурсов (судя по результатам исследования мощности компьютера в калькуляторах:))



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.046 c
15-1264800605
Юрий
2010-01-30 00:30
2010.08.27
С днем рождения ! 30 января 2010 суббота


15-1266998875
Квартирант
2010-02-24 11:07
2010.08.27
Поиск работы


9-1185113429
AlexanderMS
2007-07-22 18:10
2010.08.27
Ограждение округлой формы.


2-1274965464
integer
2010-05-27 17:04
2010.08.27
подключитсо к nokia через usb и получить текст всех СМС


15-1260451155
Nootr
2009-12-10 16:19
2010.08.27
Где в ADO указывается адрес сервера?