📄 frmmain.cpp
字号:
// Using THREAD_PRIORITY_TIME_CRITICAL for interrupt event handling routine,
// you can get about 20 KHz response ratio by using PENTIUM 200 MMX PC.
pEventThread = new EventThread(true);
pEventThread->Priority = tpTimeCritical;
pEventThread->Resume();
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::btnDisable1Click(TObject *Sender)
{
PT_EnableEvent EventSetting;
BOOL flag = FALSE;
m_bIDI0Flag = FALSE;
if ( !(m_bDI0Flag || m_bDI1Flag || m_bIDI0Flag || m_bIDI1Flag ))
{
KillThread();
if ( !m_StartFlag )
{
btnSelDev->Enabled = TRUE;
}
}
usStartFlag = 0;
while ( !flag )
{
btnDisable1->Enabled = FALSE;
btnEnable1->Enabled = TRUE;
EventSetting.EventType = ADS_EVT_INTERRUPT_IDI0;
EventSetting.Enabled = FALSE;
m_ErrCde = DRV_EnableEvent( m_DriverHandle, &EventSetting );
if ( m_ErrCde != 0 )
{
DRV_GetErrorMessage( m_ErrCde, (LPSTR)m_szErrMsg );
MessageBox(Handle, (LPCSTR)m_szErrMsg, "Driver Message", MB_OK );
return;
}
flag = TRUE;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::btnDisable2Click(TObject *Sender)
{
PT_EnableEvent EventSetting;
BOOL flag = FALSE;
m_bIDI1Flag = FALSE;
if ( !(m_bDI0Flag || m_bDI1Flag || m_bIDI0Flag || m_bIDI1Flag ))
{
KillThread();
if ( !m_StartFlag )
{
btnSelDev->Enabled = TRUE;
}
}
usStartFlag = 0;
while ( !flag )
{
btnDisable2->Enabled = FALSE;
btnEnable2->Enabled = TRUE;
EventSetting.EventType = ADS_EVT_INTERRUPT_IDI1;
EventSetting.Enabled = FALSE;
m_ErrCde = DRV_EnableEvent( m_DriverHandle, &EventSetting );
if ( m_ErrCde != 0 )
{
DRV_GetErrorMessage( m_ErrCde, (LPSTR)m_szErrMsg );
MessageBox(Handle, (LPCSTR)m_szErrMsg, "Driver Message", MB_OK );
return;
}
flag = TRUE;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::btnDisable3Click(TObject *Sender)
{
PT_EnableEvent EventSetting;
BOOL flag = FALSE;
m_bDI0Flag = FALSE;
if ( !(m_bDI0Flag || m_bDI1Flag || m_bIDI0Flag || m_bIDI1Flag ))
{
KillThread();
if ( !m_StartFlag )
{
btnSelDev->Enabled = TRUE;
}
}
usStartFlag = 0;
while ( !flag )
{
btnDisable3->Enabled = FALSE;
btnEnable3->Enabled = TRUE;
EventSetting.EventType = ADS_EVT_INTERRUPT_DI0;
EventSetting.Enabled = FALSE;
m_ErrCde = DRV_EnableEvent( m_DriverHandle, &EventSetting );
if ( m_ErrCde != 0 )
{
DRV_GetErrorMessage( m_ErrCde, (LPSTR)m_szErrMsg );
MessageBox(Handle, (LPCSTR)m_szErrMsg, "Driver Message", MB_OK );
return;
}
flag = TRUE;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::btnDisable4Click(TObject *Sender)
{
PT_EnableEvent EventSetting;
BOOL flag = FALSE;
m_bDI1Flag = FALSE;
if ( !(m_bDI0Flag || m_bDI1Flag || m_bIDI0Flag || m_bIDI1Flag ))
{
KillThread();
if ( !m_StartFlag )
{
btnSelDev->Enabled = TRUE;
}
}
usStartFlag = 0;
while ( !flag )
{
btnDisable4->Enabled = FALSE;
btnEnable4->Enabled = TRUE;
EventSetting.EventType = ADS_EVT_INTERRUPT_DI1;
EventSetting.Enabled = FALSE;
m_ErrCde = DRV_EnableEvent( m_DriverHandle, &EventSetting );
if ( m_ErrCde != 0 )
{
DRV_GetErrorMessage( m_ErrCde, (LPSTR)m_szErrMsg );
MessageBox(Handle, (LPCSTR)m_szErrMsg, "Driver Message", MB_OK );
return;
}
flag = TRUE;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::btnCloseClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
PT_EnableEvent EventSetting;
DWORD ExitCode;
m_bContinue = FALSE;
if( usStartFlag == 1 )
{
usStartFlag = 0;
EventSetting.EventType = ADS_EVT_INTERRUPT_IDI0;
EventSetting.Enabled = FALSE;
m_ErrCde = DRV_EnableEvent( m_DriverHandle, &EventSetting );
EventSetting.EventType = ADS_EVT_INTERRUPT_IDI1;
m_ErrCde = DRV_EnableEvent( m_DriverHandle, &EventSetting );
EventSetting.EventType = ADS_EVT_INTERRUPT_IDI16;
m_ErrCde = DRV_EnableEvent( m_DriverHandle, &EventSetting );
EventSetting.EventType = ADS_EVT_INTERRUPT_IDI17;
m_ErrCde = DRV_EnableEvent( m_DriverHandle, &EventSetting );
if ( m_ErrCde != 0 )
{
DRV_GetErrorMessage( m_ErrCde, (LPSTR)m_szErrMsg );
MessageBox(Handle, (LPCSTR)m_szErrMsg, "Driver Message", MB_OK );
return;
}
}
if(pEventThread)
{
pEventThread->Terminate();
GetExitCodeThread((void *)(pEventThread->Handle), &ExitCode);
if(ExitCode==STILL_ACTIVE)
TerminateThread((void *)(pEventThread->Handle), ExitCode);
}
Sleep(50L);
if ( m_DriverHandle != NULL )
DRV_DeviceClose( &m_DriverHandle );
}
//---------------------------------------------------------------------------
void TMainForm::CheckEvent()
{
INT i;
DWORD dwStartTime;
DWORD dwCurrentTime;
DWORD dwTime;
float fEventCount_IDI[4];
float ratio_IDI[ 4 ];
char szBuf_IDI[4][20];
USHORT usEventType;
for ( i = 0; i < 4; i++ )
{
fEventCount_IDI[ i ] = 0.0;
}
ptCheckEvent.EventType = &usEventType;
ptCheckEvent.Milliseconds = 1000;
dwStartTime = GetTickCount();
while ( m_bContinue )
{
m_bFlag = TRUE;
if ( DRV_CheckEvent( m_DriverHandle, &ptCheckEvent ) == SUCCESS)
{
if ( *ptCheckEvent.EventType == ADS_EVT_INTERRUPT_IDI0 )
{
fEventCount_IDI[ 0 ]++;
}
if ( *ptCheckEvent.EventType == ADS_EVT_INTERRUPT_IDI1 )
{
fEventCount_IDI[ 1 ]++;
}
if ( *ptCheckEvent.EventType == ADS_EVT_INTERRUPT_DI0 )
{
fEventCount_IDI[ 2 ]++;
}
if ( *ptCheckEvent.EventType == ADS_EVT_INTERRUPT_DI1 )
{
fEventCount_IDI[ 3 ]++;
}
}
dwCurrentTime = GetTickCount();
if ( ( dwTime = dwCurrentTime - dwStartTime ) >= 1000 )
{
for ( i = 0; i < 4; i++ )
{
ratio_IDI[i] = ((fEventCount_IDI[i] / (float)dwTime) * 1000.0);
sprintf( szBuf_IDI[i], "%.3f", ratio_IDI[i] );
fEventCount_IDI[i] = 0.0;
}
editIntCount_IDI0->Text = szBuf_IDI[0];
editIntCount_IDI1->Text = szBuf_IDI[1];
editIntCount_DI0->Text = szBuf_IDI[2];
editIntCount_DI1->Text = szBuf_IDI[3];
dwStartTime = GetTickCount();
}
}
}
void TMainForm::KillThread()
{
DWORD ExitCode;
m_bContinue = FALSE;
m_bFlag = FALSE;
pEventThread->Terminate();
GetExitCodeThread((void *)(pEventThread->Handle), &ExitCode);
if(ExitCode==STILL_ACTIVE)
TerminateThread((void *)(pEventThread->Handle), ExitCode);
}
//---------------------------------------------------------------------------
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall EventThread::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------------------------------------------
__fastcall EventThread::EventThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall EventThread::Execute()
{
//---- Place thread code here ----
MainForm->CheckEvent();
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -