AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread Terminate

Ein Thema von schweindi · begonnen am 14. Mär 2010 · letzter Beitrag vom 14. Mär 2010
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz