Thema: Delphi Thread Terminate

Einzelnen Beitrag anzeigen

schweindi

Registriert seit: 4. Feb 2010
60 Beiträge
 
#1

Thread Terminate

  Alt 14. Mär 2010, 14:31
hallo,
ich versuche gerade einen Thread "auszuschalten" und habe schon eigentlich alles ausprobiert (Destroy, Free, Suspend, Terminate) leider kam jedes Mal ein "Access Denied" Fehler. Jetzt bin ich draufgekommen, wieso.
Das ist mein Thread, den ich schließen will, und die Pfeile markieren die Schleife, die das Problem darstellt:

Delphi-Quellcode:
type
TMonThread = class(TThread)
  private
    procedure Input;
  protected
    procedure Execute; override;
  public
    Stopped : Boolean;
    constructor Create;
    destructor Destroy; override;
    procedure DoThread(Status : Boolean);
    procedure Stop;
  end;
{...}
procedure TMonThread.DoThread(status : Boolean);
var
  Overlapped: TOverlapped;
  Signaled : DWORD;
begin
Signaled:=0;
if ComPort2.InstanceActive then
  SetCommMask(ComPort2.Handle, EV_RXCHAR) else
    begin
    Form1.Memo_sms.Lines.Add('SetCommMask not set');
    exit;
    end;
//set waiting mask
  FillChar(Overlapped, SizeOf(Overlapped), 0);
  Overlapped.hEvent := CreateEvent(nil, True, True, nil);
  WaitCommEvent(ComPort2.Handle, Signaled , @Overlapped);
  repeat //<--------------------------------------
      sleep(readint);
      Form1.Memo_sms.Lines.Add(IntToStr(Signaled));
      Application.ProcessMessages;
  until (Signaled = EV_RXCHAR) or (Stopped = True); //<----------
  if (Signaled = EV_RXCHAR) then
    begin
    Form1.Memo_sms.Lines.Add('Input!');
    Input;
    end;
end;
{...}
procedure TMonThread.Stop;
begin
Form1.Memo_sms.Lines.Add('Thread Destroyed');
// clear buffers
SetCommMask(ComPort2.Handle, 0);
PurgeComm(ComPort2.Handle, PURGE_TXCLEAR or PURGE_RXCLEAR);
//stop thread
Stopped:= True;
end;

destructor TMonThread.Destroy;
begin
inherited Destroy;
end;
Und im Form1 (Heuptfenster) wird per Buttonklick das gemacht:

Delphi-Quellcode:
procedure TForm1.s_B_disconnectClick(Sender: TObject);
var
  InputThread : TMonThread;
begin
//stop Thread & destroy
InputThread.Stop; //<---------------------------------
//purge buffers of port
if ComPort2.InstanceActive then
begin
ComPort2.Flush;
ComPort2.CloseSocket;
end;
Wenn die procedure Stop Aufgerufen wird, dann ändert sie zwar Stopped = True aber die Schleife merkt das garnicht!
Ich dachte "Application.ProcessMessages;" sollte das lösen....

lg
  Mit Zitat antworten Zitat