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 10:34:00) [21]

clickmaker ©   (10.05.07 17:23) [7]

К сожалению, не помогло!
Тут всётаки проблема видимо:
ExecAndWait(C:\game.exe, SW_SHOWNORMAL): boolean;
На те функции, которые без "Result"-а Delphi не ругается

Может, разгадка где-то тут:
iXT ©   (10.05.07 17:07) [5]
что возвращают функции в 437-400 ??????
...
Сдается мне что в качестве параметров нужен указатель, а ты передаешь Bool, Int, Int, Int!

Тупо убрать ): boolean;нельзя, - он используется в коде самой функции!

Что же тут можно сделать?


iXT   (2007-05-10 17:33:00) [22]

"Вы же так не убьетесь"


clickmaker   (2007-05-10 17:23:00) [23]

CopyFilesParams= VarArrayOf([Handle, dir, 'C:\Temp', True, True]);
RunProc([CopyFiles, ... ], VarArrayOf([CopyFilesParams, ...]))


Doom-2   (2007-05-10 17:09:00) [24]

clickmaker ©   (10.05.07 17:05) [4]

Подскажи, пожалуйста - как это сделать на примере одной из функций!


iXT   (2007-05-10 17:07:00) [25]

Ну и.......
RunProc( - какие параметры
и
что возвращают функции в 437-400 ??????

[Ошибка] 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'

Сдается мне что в качестве параметров нужен указатель, а ты передаешь Bool, Int, Int, Int


clickmaker   (2007-05-10 17:05:00) [26]

в RunProc ты фактически передаешь результаты выполнения функций. Если требуется именно запуск, то указатель на функцию передавай отдельно, ее параметры - отдельно


Doom-2   (2007-05-10 16:59:00) [27]

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


iXT   (2007-05-10 16:57:00) [28]

Они в 437 - 440 строках :)


Doom-2   (2007-05-10 16:56:00) [29]

Я понимаю, что это из-за:
например, ExecAndWait(C:\game.exe, SW_SHOWNORMAL): boolean;

Неужели придётся переделывать весь код?!


Страницы:   1 2

Наверх

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