![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
В отдельном потоке
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]
>
> К сожалению, не помогло!
а как делал?
задача-то в чем? передать в поток список функций для исполнения?