Форум: "Начинающим";
Текущий архив: 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