📄 getevent.pas
字号:
unit GetEvent;
interface
uses
Classes, SysUtils, windows, MainForm, Global, Driver, Event, Paras;
type
TGetEvent = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure adTerminateEvent;
public
constructor Create();
end;
implementation
{ Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TGetEvent.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{*************************************************************
* Function: Handle the error code. If the input error code > 0,
* it means some error apperent. This function can
* show the error message to a message box and stop
* this application.
* Input: The error code.
* return: none
************************************************************* }
Function DoesErr(var lErrCode: LongInt): integer;
var
szErrMsg : string[100];
pszErrMsg : PChar;
begin
{Check the pressed error code}
If (lErrCode <> 0) Then
begin
pszErrMsg := @szErrMsg;
DRV_GetErrorMessage(lErrCode, pszErrMsg);
MessageBox(0, pszErrMsg, 'Thread Message', MB_OK);
DoesErr := 1;
end
else
DoesErr := 0;
end;
{ TGetEvent }
constructor TGetEvent.Create();
begin
inherited Create(False);
end;
procedure TGetEvent.Execute;
begin
{ Place thread code here }
{Prepare structure for checking conversion status}
pFdiStatus := @gdwFdiStatus;
pRetrieved := @gdwRetrieved;
{Cyclic get deiver's event}
while (usThreadLoop = 1) do
begin
{1. Get the Device event}
if DRV_CheckEvent(ghDev, ptCheckEvent) <> 0 then
begin
{If cannot get event close and terminate thread}
MessageBox(0,'Check Event Error !','Thread Message',MB_OK);
exit;
end;
{2. Does it contain the Interrupt event?}
if (usEventType = ADS_EVT_DI_LOBUFREADY) then
begin
{process buffer change event}
gdwDIBufferChangeCounter := gdwDIBufferChangeCounter + 1;
lErrCde := DRV_ClearFlag(ghDev, ADS_EVT_DI_OVERRUN);
lErrCde := DRV_FDICheck( ghDev, pFdiStatus, pRetrieved);
frmMain.txtBuffName.Text :='Lower half buffer';
if( DoesErr(lErrCde) = 1 ) then
Exit;
end;
{3. Does it contain the buffer change event?}
if (usEventType = ADS_EVT_DI_HIBUFREADY) then
begin
{process buffer change event}
gdwDIBufferChangeCounter := gdwDIBufferChangeCounter + 1;
lErrCde := DRV_ClearFlag(ghDev, ADS_EVT_DI_OVERRUN);
frmMain.txtBuffName.Text :='Higher half buffer';
if( DoesErr(lErrCde) = 1 ) then
Exit;
end;
{4. Does it contain Overrun event?}
if (usEventType = ADS_EVT_DI_OVERRUN) then
begin
{process overrun event}
gdwDIOverRunCounter := gdwDIOverRunCounter + 1;
lErrCde := DRV_ClearFlag(ghDev, ADS_EVT_DI_OVERRUN);
if( DoesErr(lErrCde) = 1 ) then
Exit;
end;
{5. Does it contain terminate event?}
if (usEventType = ADS_EVT_DI_TERMINATED) then
begin
{process terminate event}
gdwDITerminateCounter := gdwDITerminateCounter + 1;
usThreadLoop := 0;
frmMain.EditTerminate.Text := IntToStr( gdwDITerminateCounter );
adTerminateEvent();
frmMain.BtStop.Click ;
lErrCde := DRV_ClearFlag(ghDev, ADS_EVT_DI_OVERRUN);
if( DoesErr(lErrCde) = 1 ) then
Exit;
exit;
end;
frmMain.EditBufferChange.Text := IntToStr( gdwDIBufferChangeCounter );
frmMain.EditOverrun.Text := IntToStr( gdwDIOverRunCounter );
frmMain.EditTerminate.Text := IntToStr( gdwDITerminateCounter );
end;
end;
procedure TGetEvent.adTerminateEvent();
begin
{Close the converting form and make it to retrieved convered data}
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -