📄 thread.pas
字号:
unit Thread;
Interface
Uses Windows, Classes, Dialogs, SysUtils, Graphics, Controls, Forms,
StdCtrls, Buttons, ExtCtrls, Driver;
Type
PT_ThreadData = Record
lDeviceHandle : Longint;
labPatternMatchCount : ^TStaticText;
labMatchChannel : ^TStaticText;
labMatchCount : ^TStaticText;
labOverflowChannel : ^TStaticText;
labOverflowCount : ^TStaticText;
labStatus : ^TStaticText;
labChannelNo : ^TStaticText;
labStatusCount : ^TStaticText;
RisingEventCount : ^Integer;
FallingEventCount : ^Integer;
PatternEventCount : ^Integer;
CountMatchEventCount : ^Integer;
CountOverflowEventCount : ^Integer;
End;
TWatchThread = class(TThread)
private
protected
procedure Execute; override;
public
EventType : Integer;
ReturnValue : Integer;
ptCheckEvent : PT_CheckEvent;
ptFDITransfer : PT_FDITransfer;
MData : PT_ThreadData;
constructor Create(TData: PT_ThreadData);
End;
Implementation
constructor TWatchThread.Create(TData: PT_ThreadData);
Begin
MData := TData;
inherited Create(False);
End;
Procedure TWatchThread.Execute;
var
lErrCde : Longint;
Begin
ptCheckEvent.EventType := @EventType;
ptCheckEvent.Milliseconds := 1000;
While not Terminated do
Begin
lErrCde := DRV_CheckEvent(MData.lDeviceHandle, ptCheckEvent);
if lErrCde <> 0 then
Exit;
Case EventType of
ADS_EVT_PATTERNMATCH: { Pattern Match Event }
Begin
ptFDITransfer.EventType := ADS_EVT_PATTERNMATCH;
ptFDITransfer.RetData := @ReturnValue;
lErrCde := DRV_FDITransfer(MData.lDeviceHandle, ptFDITransfer);
If lErrCde <> 0 Then
Begin
DRV_DeviceClose(MData.lDeviceHandle);
Exit;
End;
Inc(MData.PatternEventCount^);
MData.labPatternMatchCount.Caption := IntToStr(MData.PatternEventCount^);
End;
ADS_EVT_COUNTERMATCH:
Begin
ptFDITransfer.EventType := ADS_EVT_COUNTERMATCH;
ptFDITransfer.RetData := @ReturnValue;
lErrCde := DRV_FDITransfer(MData.lDeviceHandle, ptFDITransfer);
If lErrCde <> 0 Then
Begin
DRV_DeviceClose(MData.lDeviceHandle);
Exit;
End;
Inc(MData.CountMatchEventCount^);
MData.labMatchChannel.Caption := IntToStr(ReturnValue);
MData.labMatchCount.Caption := IntToStr(MData.CountMatchEventCount^);
End;
ADS_EVT_COUNTEROVERFLOW:
Begin
ptFDITransfer.EventType := ADS_EVT_COUNTEROVERFLOW;
ptFDITransfer.RetData := @ReturnValue;
lErrCde := DRV_FDITransfer(MData.lDeviceHandle, ptFDITransfer);
If lErrCde <> 0 Then
Begin
DRV_DeviceClose(MData.lDeviceHandle);
Exit;
End;
Inc(MData.CountOverflowEventCount^);
MData.labOverflowChannel.Caption := IntToStr(ReturnValue);
MData.labOverflowCount.Caption := IntToStr(MData.CountOverflowEventCount^);
End;
ADS_EVT_STATUSCHANGE:
Begin
ptFDITransfer.EventType := ADS_EVT_STATUSCHANGE;
ptFDITransfer.RetData := @ReturnValue;
lErrCde := DRV_FDITransfer(MData.lDeviceHandle, ptFDITransfer);
If lErrCde <> 0 Then
Begin
DRV_DeviceClose(MData.lDeviceHandle);
Exit;
End;
If (ReturnValue And $FF) > 0 Then
Begin
Inc(MData.FallingEventCount^);
MData.labStatus.Caption := 'Falling';
MData.labChannelNo.Caption := IntToStr(ReturnValue And $FF);
MData.labStatusCount.Caption := IntToStr(MData.FallingEventCount^);
End
Else If (ReturnValue And $FF00) > 0 Then
Begin
Inc(MData.RisingEventCount^);
MData.labStatus.Caption := 'Rising';
MData.labChannelNo.Caption := IntToStr(ReturnValue shr 8);
MData.labStatusCount.Caption := IntToStr(MData.RisingEventCount^);
End;
End;
End;
End;
End;
End.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -