Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

В отдельном потоке


Страницы:   1 2

Doom-2 ©   (2007-05-10 16:53:00) 

Запускаю несколько процедур подряд в отдельном потоке так:

RunProc([DeleteDirTree('F:\NEW'),
               DeleteDirTree('F:\TEMP'),
                    ExecAndWait(C:\game.exe, SW_SHOWNORMAL),
                         CopyFiles( Handle, dir, 'C:\Temp', True, True ),
                           CopyFiles( Handle, dir, 'C:\Temp', True, True ),
                              CopyFiles( Handle, dir, 'C:\Temp', True, True )],
                                 Otchet);

Использую Unit:
unit ThreadUnit;
interface
uses
 Classes;
type
 TCallArray=array of TThreadMethod;
 TProcCaller = class(TThread)
 private
   { Private declarations }
   CallBackProc:TThreadMethod;
   Procs:TCallArray;
 protected
   procedure Execute; override;
   constructor Create(const AProcs:TCallArray;ACallBackProc:TThreadMethod);
 end;

procedure RunProc(const AProcs:TCallArray;ACallBackProc:TThreadMethod=nil);
implementation
procedure RunProc(const AProcs:TCallArray;ACallBackProc:TThreadMethod=nil);
begin
TProcCaller.Create(AProcs,ACallBackProc);
end;

{ TProcCaller }
constructor TProcCaller.Create(const AProcs:TCallArray;ACallBackProc:TThreadMethod);
begin
 inherited Create(true);
 Procs:=AProcs;
 CallBackProc:=ACallBackProc;  
 Resume;
end;

procedure TProcCaller.Execute;
var i:integer;
begin
for i:=0 to Length(Procs) do begin
 Procs[i];
end;
if Assigned(CallBackProc) then Synchronize(CallBackProc);
Free;
end;

end.

Как исправить ошибки:

[Ошибка] Unit1.pas(437): Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'Boolean'
[Ошибка] Unit1.pas(438): Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'Integer'
[Ошибка] Unit1.pas(439): Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'Integer'
[Ошибка] Unit1.pas(440): Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'Integer'


Doom-2   (2007-05-11 15:04:00) [1]

Всё спасибо!
Разобрался!


iXT   (2007-05-11 14:34:00) [2]

Косяк получился :) Тебе(Вам) была первая строчка :)
Вторая автору


clickmaker   (2007-05-11 14:22:00) [3]


> [26] iXT ©   (11.05.07 14:15)

так это не ко мне. это к автору


iXT   (2007-05-11 14:15:00) [4]


> [25] clickmaker ©   (11.05.07 14:10)
>
> > game.exe - твоя?
>
> нет. я только разместил код -)

???
Я про это:
ExecAndWait(C:\game.exe, SW_SHOWNORMAL)


clickmaker   (2007-05-11 14:10:00) [5]


> game.exe - твоя?

нет. я только разместил код -)


iXT   (2007-05-11 13:09:00) [6]

> [23] clickmaker ©   (11.05.07 13:01)

Да не нужно ему это все ИМХО. Поэтому и [17] написал :)

game.exe - твоя?


clickmaker   (2007-05-11 13:01:00) [7]


> [16] Doom-2   (11.05.07 12:38)

что ты зациклился? понимаешь разницу между указателем на процедуру и результатом ее выполнения?
Обрати внимание, вот процедура
procedure TForm1.CopyFiles(const AParams: Variant);
а здесь в элемент массива записывается указатель на точку входа в нее
Procs[1] := CopyFiles;

если нужно как-то реагировать на возвращаемое значение, объяви так
TMyMethod = procedure(const AParams: Variant; var Res: Variant) of object;

 TCallArray=array of TMyMethod;

вызов в потоке
for i:=0 to Length(Procs)-1 do begin
  Procs[i](Params[i], Res);
  MessageBox(0, PChar('Result = ' + VarToStr(Res)), pchar('Proc '+IntToStr(i)), 0);
end;


Doom-2   (2007-05-11 13:00:00) [8]

Хорошо!
Тогда подскажите, пожалуйста:
Как запустить из своей программы внешнее приложение и знать, когда оно завершит свою работу? с программой при этом можно было бы работать (не "завмсвния" до выхода из game.exe)


Doom-2   (2007-05-11 12:57:00) [9]

конкретно
ExecAndWait(C:\game.exe, SW_SHOWNORMAL);
- на время работы game.exe ВИСНЕТ!!!!!!
а знать, когда game.exe закроют мне необходимо!


ЮЮ   (2007-05-11 12:57:00) [10]

>1. Запустить несколько процедур ПОДРЯД (не сразу все скопом)

Обычно код так и выполняется: подряд, строчка за строчкой.

>При выполнении данной последовательности процедур программа не подвисала.

Так она ещё не выполнила одну из процедур. Зачем её быть "не подвисшей"? Чтобы скопом ещё запустить пакат процедур?

ExecAndWait(C:\game.exe, SW_SHOWNORMAL) - а здесь разве по смыслу не требуется именно "завмсвния" до выхода из game.exe?


iXT   (2007-05-11 12:54:00) [11]

[15] читал? На какого ты геморой на свою голову создаешь?


Doom-2   (2007-05-11 12:48:00) [12]

1. Запустить несколько процедур ПОДРЯД (не сразу все скопом)
2. При выполнении данной последовательности процедур программа не подвисала


iXT   (2007-05-11 12:42:00) [13]

Ни каких конфликтов.

Давай с самого начала, что тебе надо сделать? (Полностью озвучь)


Doom-2   (2007-05-11 12:38:00) [14]

Мне нужно дождаться завершения процедуры, но чтобы при этом компьютере не зависал!

DeleteDirTree('F:\NEW');
DeleteDirTree('F:\TEMP');
ExecAndWait(C:\game.exe, SW_SHOWNORMAL);


Я так и делаю! Но результатом выполнения ExecAndWait, например является ): boolean;и видимо из-за этого в коде происходит какой-то конфликт?!?!?!


ЮЮ   (2007-05-11 12:26:00) [15]

>как это учесть?

передавать в RunProc имена процедур(методов) и значения параметров и уже там их выполнять.
Ты же фактически выполняешь эти методы, указав их в качестве фактических параметров, прежде чем вызыввакшь RunProc. Это анвлогично просто

DeleteDirTree('F:\NEW');
DeleteDirTree('F:\TEMP');
ExecAndWait(C:\game.exe, SW_SHOWNORMAL);
...
Otchet;

зачем здксь какой-то  RunProc, если всё и так выполнится до его исполнения?


Doom-2   (2007-05-11 12:11:00) [16]

ExecAndWait(C:\game.exe, SW_SHOWNORMAL): boolean;
CopyFiles( Handle, dir, 'C:\Temp', True, True ): integer;
- как это учесть?


Doom-2   (2007-05-11 12:06:00) [17]

На строчках:

Procs[0] := ExecAndWait; - Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'Boolean'
Procs[1] := CopyFiles;     - Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'Integer'

8-)           Блин! Что-же делать??????


clickmaker   (2007-05-11 11:33:00) [18]

 TMyMethod = procedure(const AParams: Variant) of object;

 TCallArray=array of TMyMethod;

 TProcCaller = class(TThread)
 private
  { Private declarations }
  CallBackProc: TThreadMethod;
  Procs: TCallArray;
  Params: Variant;
protected
  procedure Execute; override;
  constructor Create(const AProcs:TCallArray; const AParams: Variant;
       ACallBackProc:TThreadMethod);
end;

procedure TForm1.CopyFiles(const AParams: Variant);
begin
 MessageBox(Handle, PChar(VarToStr(APArams[0])+';'+VarToStr(AParams[1])), 'CopyFiles', 0);
end;

procedure TForm1.ExecAndWait(const AParams: Variant);
begin
 MessageBox(Handle, PChar(VarToStr(APArams[0])+';'+VarToStr(AParams[1])), 'ExecAndWait', 0);
end;

procedure RunProc(const AProcs:TCallArray; const AParams: Variant; ACallBackProc:TThreadMethod=nil);
begin
 TProcCaller.Create(AProcs,AParams,ACallBackProc);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 ParamArray: Variant;
 Params: Variant;
 Procs: TCallArray;
begin
 ParamArray := VarArrayCreate([0, 1], varVariant);
 Params := VarArrayCreate([0, 1], varVariant);
 Params[0] := 'C:\game.exe';
 Params[1] := SW_SHOWNORMAL;
 ParamArray[0] := Params;
 Params := VarArrayCreate([0, 4], varVariant);
 Params[0] := Handle;
 Params[1] := 'C:\';
 Params[2] := 'D:\';
 Params[3] := True;
 Params[4] := True;
 ParamArray[1] := Params;
 SetLength(Procs, 2);
 Procs[0] := ExecAndWait;
 Procs[1] := CopyFiles;
 RunProc(Procs, ParamArray, nil);
end;

{ TProcCaller }
constructor TProcCaller.Create(const AProcs:TCallArray; const AParams: Variant; ACallBackProc:TThreadMethod);
begin
inherited Create(true);
Procs:=AProcs;
Params := AParams;
CallBackProc:=ACallBackProc;
FreeOnTerminate := true;
Resume;
end;

procedure TProcCaller.Execute;
var i:integer;
begin
for i:=0 to Length(Procs)-1 do begin
  Procs[i](Params[i]);
end;
if Assigned(CallBackProc) then Synchronize(CallBackProc);
end;


Doom-2   (2007-05-11 11:06:00) [19]

Как делал?
- и так: ExecAndWaitParams= VarArrayOf([C:\game.exe, SW_SHOWNORMAL]);
- и так: ExecAndWaitParams= VarArrayOf([(C:\game.exe, SW_SHOWNORMAL): true]);
.............. - по всякому!
Да! передать в поток список функций для исполнения
- unit ThreadUnit запускает эти процедуры по порядку в отдельном потоке:

использовать вот так
RunProc([Копирование,Поиск,Архивирование]);
или так, если нужно что то сделать по завершении
RunProc([Копирование,Поиск,Архивирование],МетодЗавершения);


clickmaker   (2007-05-11 10:38:00) [20]


> [9] Doom-2   (11.05.07 10:34)
> clickmaker ©   (10.05.07 17:23) [7]
>
> К сожалению, не помогло!

а как делал?
задача-то в чем? передать в поток список функций для исполнения?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо