'Communication Event' zur Flankenentdeckung
Vorab: Es hat sich herausgestellt, dass Starten und Stoppen eines Threads für die Kollisionserkennung anscheinend zu
langsam ist! Für andere Gelegenheiten kann es nützlich sein, Polling durch eine Interruptbehandlung zu ersetzen.
NetzHwEreignis.zip
Quelltext-Auszug
....
type
TEreignisThread = class(TThread)
private
port : integer;
public
procedure execute; override;
procedure setPort(pHandle : integer);
procedure update;
end;
TForm1 = class(TForm)
....
private
NetzHW : TNetzHW;
monitor : TEreignisThread;
procedure updateLed;
public
{ Public-Deklarationen }
end;
.....
procedure TEreignisThread.execute;
var
dummy : dword;
begin
while not Terminated do
begin
if WaitCommEvent(port,dummy,nil)
then form1.updateLED; //synchronize(update);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
NetzHW := TNetzHW.Create;
netzHW.Start(1);
updateLED;
setCommMask(netzHW.GetHandle,EV_CTS);
monitor := TEreignisThread.Create(true);
monitor.FreeOnTerminate := true;
monitor.setPort(netzHW.GetHandle);
monitor.Resume;
end;
....