Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.066 c
2-1265626291
Petr
2010-02-08 13:51
2010.08.27
Работа с Вложенными циклами


2-1267885769
Mer01
2010-03-06 17:29
2010.08.27
Как задать массив Record при инициализации?


2-1268379069
Б
2010-03-12 10:31
2010.08.27
Имя файла в TOpenDialog.


11-1219867277
Лотос
2008-08-28 00:01
2010.08.27
Аттрибуты для NewDirList


2-1271426478
davinchi
2010-04-16 18:01
2010.08.27
Как получить TEvent.WaitFor(<timeout>) с результатом wrError?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский