Можно ли в Делфи создавать потоки в режиме выполнения не
объявляя предварительно класс-наследник TThread?
т.е.
не вот так
сначала
........
unit TCPIO;
interface
uses
Classes,IdTCPClient,IdGlobal,SysUtils;
type
ReadThread = class(TThread)
protected
procedure Execute; override;
public
ReadBuf:TStringList;
TCPClient:TIDTCPCLient;
end;
...........
implementation
procedure ReadThread.Execute;
begin
while not self.Terminated do
begin
try
self.ReadBuf.Add (self.TCPClient.ReadLn);
except on E:Exception do
self.Terminate ;
end;
end;
end;
end.
.....
а потом
implementation
Procedure MyMainClass.Main;
var MyThread:ReadThread;
Begin
MyThread:=ReadThread.Create(true);
MyThread.TCPClient:=self;
MyThread.ReadBuf:=self.ReadBuffer;
MyThread.Resume;
............
и т.д.
End;
а вот так
[/pascal]
Procedure ReadFromSocket
begin
.......
здесь собсно что должно жить в потоке
.......
end;
Procedure MyMainClass.Main;
var MyThread:TThread;
Begin
MyThread:=TThread.Create(true);
MyThread.Execute:= ReadFromSocket;
MyThread.Resume;
............
и т.д.
End;
[/pascal]
к сожалению камрады из борланда запхали Execute в Protected раздел такая конструкция не катитъ
что можно посоветуете ?
Здравствуйте, par, Вы писали:
par>Можно ли в Делфи создавать потоки в режиме выполнения не
par>объявляя предварительно класс-наследник TThread?
[SKIP]
par>к сожалению камрады из борланда запхали Execute в Protected раздел такая конструкция не катитъ
par>что можно посоветуете ?
Легко — смотри на функцию CreateThread() WinAPI в MSDN. Только IsMultyThread в TRUE не забудь выставить, а то словишь глюку с диспетчером памяти
.
С уважением Михаил Копачев
... << RSDN@Home 1.1.4 @@subversion >>
Здравствуйте, par, Вы писали:
par>Можно ли в Делфи создавать потоки в режиме выполнения не
par>объявляя предварительно класс-наследник TThread?
А собственно, зачем? Ты хочешь подменять функцию потока на лету? Ну так сделай специального наследника:
type
THandlerO = procedure of object;
THandlerP = procedure;
THandlerThread = class(TThread)
public
constructor Create(handler: THandlerO); overload;
constructor Create(handler: THandlerP); overload;
protected
procedure Execute; override;
private
FHandlerP: THandlerP;
FHandlerO: THandlerO;
end;
implementation
constructor THandlerThread.Create(handler: THandlerO);
begin
inherited Create;
FHandlerO = handler;
end;
constructor THandlerThread.Create(handler: THandlerP);
begin
inherited Create;
FHandlerP = handler;
end;
procedure THandlerThread.Execute;
begin
if Assigned(FHandlerO)
FHandlerO
else if Assigned(FHandlerP)
FHandlerP;
end;
Ну и потом соответственно
MyThread:=THandlerThread.Create(ReadFromSocket);
... << RSDN@Home 1.1.4 beta 4 rev. 347>>
Здравствуйте, Sinclair,
Я баран , как сам не догдался не знаю ,
локальный затуп роизошел наверное