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