mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-06 18:24:26 +08:00

See * http://www.delphipraxis.net/70989-komponente-fuer-ssh-verbindung-6.html * http://www.heidisql.com/forum.php?t=15206 * issue #2902
64 lines
1.4 KiB
ObjectPascal
64 lines
1.4 KiB
ObjectPascal
unit UPipeThread;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Classes;
|
|
|
|
type
|
|
TPipeThread = class(TThread)
|
|
private
|
|
FReadPipeData: TThreadMethod;
|
|
FProcessHandle: THandle;
|
|
FWillSuspend : Boolean;
|
|
protected
|
|
procedure Execute; override;
|
|
public
|
|
procedure Resume; reintroduce;
|
|
property ProcessHandle : THandle
|
|
read FProcessHandle write FProcessHandle;
|
|
property ReadPipeData: TThreadMethod
|
|
read FReadPipeData write FReadPipeData;
|
|
property WillSuspend : Boolean
|
|
read FWillSuspend write FWillSuspend;
|
|
end;
|
|
|
|
implementation
|
|
|
|
{ Wichtig: Methoden und Eigenschaften von Objekten in visuellen Komponenten dürfen
|
|
nur in einer Methode namens Synchronize aufgerufen werden, z.B.
|
|
|
|
Synchronize(UpdateCaption);
|
|
|
|
und UpdateCaption könnte folgendermaßen aussehen:
|
|
|
|
procedure TPipeThread.UpdateCaption;
|
|
begin
|
|
Form1.Caption := 'Aktualisiert in einem Thread';
|
|
end; }
|
|
|
|
{ TPipeThread }
|
|
|
|
procedure TPipeThread.Execute;
|
|
begin
|
|
FWillSuspend := false;
|
|
while (WaitForSingleObject(ProcessHandle,1) <> WAIT_OBJECT_0)
|
|
and not Terminated do
|
|
begin
|
|
if Assigned(FReadPipeData) then
|
|
Synchronize(FReadPipeData);
|
|
if FWillSuspend then
|
|
Suspend
|
|
else
|
|
Sleep(1);
|
|
end;
|
|
end;
|
|
|
|
procedure TPipeThread.Resume;
|
|
begin
|
|
FWillSuspend := false;
|
|
inherited;
|
|
end;
|
|
|
|
end.
|