this slowpoke moves

Create Api Thread & Terminate

private
    { Private declarations }
    protected
    procedure WndProc(var Message: TMessage); override;
    
type
  PThreadParams = ^TThreadParams;
  TThreadParams = record
    ParentHandle: THandle;
  end;

const
  CM_STATUS = WM_USER + 1;
  CM_FINISHED = WM_USER + 2;
  CM_ABORT = WM_USER + 3;

var
  Form1: TForm1;
  Terminate: Boolean;
  
//

procedure TForm1.WndProc(var Message: TMessage);
begin
  inherited;
  case Message.Msg of
    CM_STATUS:
    begin
      Label1.Caption := PChar(Message.WParam) + ' ' + IntToStr(Message.LParam);
    end;
    CM_FINISHED:
    begin
      Label1.Caption := 'Thread fertig';
    end;
    CM_ABORT:
    begin
      label1.Caption := 'Abbruch durch Benutzer';
    end;
  end;
end;

function DemoThread(p: Pointer): Integer;
var
  i: Integer;
  ParentHandle: THandle;
  label CLEANUP;
begin
  ParentHandle := PThreadParams(p)^.ParentHandle;
  for i := 0 to 9 do
  begin
    if Terminate then
    begin
      SendMessage(ParentHandle, CM_ABORT, 0 , 0);
      goto CLEANUP;
    end;
    SendMessage(ParentHandle, CM_STATUS, Integer(PChar('Durchlauf:')), i);
    Sleep(500);
  end;
  SendMessage(ParentHandle, CM_FINISHED, 0, 0);
CLEANUP:
  Dispose(p);
  Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Terminate := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  ThreadID: Cardinal;
  ThreadParams: PThreadParams;
begin
  Terminate := False;
  New(ThreadParams);
  ThreadParams.ParentHandle := Self.Handle;
  CloseHandle(BeginThread(nil, 0, @DemoThread, ThreadParams, 0, ThreadID));
end;

Keine Kommentare:

Kommentar veröffentlichen

Beliebte Posts

Translate