1,222
社区成员




//启动计数器
int n_Chd_CCD;
Form_Main->AC_CStart( Form_Main->h_ACCard, 0, 2 );
int aaa;
do
{
aaa = Form_Main->AC_CRead( Form_Main->h_ACCard, 0, &n_Chd_CCD );
}
while( aaa == 0 );
while( 1 )
{
//启动计数器
int n_Chd_CCD;
Form_Main->AC_CStart( Form_Main->h_ACCard, 0, 2 );
int aaa;
do
{
aaa = Form_Main->AC_CRead( Form_Main->h_ACCard, 0, &n_Chd_CCD );
}
while( aaa == 0 );
}
while( 1 )
{
//启动计数器
int n_Chd_CCD;
Form_Main->AC_CStart( Form_Main->h_ACCard, 0, 2 );
Sleep( 1 );
Form_Main->AC_CRead( Form_Main->h_ACCard, 0, &n_Chd_CCD );
}
改成了
while( 1 )
{
//启动计数器
int n_Chd_CCD;
Form_Main->AC_CStart( Form_Main->h_ACCard, 0, 2 );
int aaa;
do
{
aaa = Form_Main->AC_CRead( Form_Main->h_ACCard, 0, &n_Chd_CCD );
}
while( aaa == 0 );
}
而已,多了一个do...while循环,就出现这个问题。。。
难道要检查线程阻塞? while( 1 )
{
if( b_Exit )
{
break;
}
Application->ProcessMessages();
MyTrd->GetData();
}
其中 GetData()就是那个过程
void __fastcall MyThread::GetData()
{
//启动计数器
int n_Chd_Data;
Form_Main->AC_CStart( Form_Main->h_ACCard, 0, 2 );
int aaa;
do
{
aaa = Form_Main->AC_CRead( Form_Main->h_ACCard, 0, &n_Chd_Data);
}
while( aaa == 0 );
Form_Main->n_Count++;
Form_Main->D_End = GetTickCount();
if( Form_Main->D_End - Form_Main->D_Begin > 999 )
{
Form_Main->RzCB_ReadSpeed->Caption = "读取频率:"+FormatFloat( "0", Form_Main->n_Count * 1000 / ( Form_Main->D_End - Form_Main->D_Begin ) )+" Hz";
Form_Main->n_Count = 0;
Form_Main->D_Begin = GetTickCount();
}
if( !Form_Main->b_PinLv )
{
Form_Main->RzPnl_Count[0]->Caption = "I1 = " + IntToStr( n_Chd_Data);
}
}
这样的话,就是CPU占用率太高,不是很理想 while( 1 )
{
for(int i=0; i<16; i++)
{
//启动计数器
Form_Main->AC_CStart( Form_Main->h_ACCard, i, 2 );
}
Sleep( 1 );
for(int i=0; i<16; i++)
{
Form_Main->AC_CRead( Form_Main->h_ACCard, i, &n_Chd_Count[i] );
}
Synchronize( TypeGather );
这样的采集倒是没什么问题,只是采集频率达不到要求。
修改后,用do...while读取计数器状态后, 采集频率倒是可以达到要求,就是停止线程的时候,会出现程序卡死的状况 while( 1 )
{
for(int i=0; i<16; i++)
{
//启动计数器
Form_Main->AC_CStart( Form_Main->h_ACCard, i, 2 );
}
Sleep( 1 );
for(int i=0; i<16; i++)
{
Form_Main->AC_CRead( Form_Main->h_ACCard, i, &n_Chd_Count[i] );
}
Synchronize( TypeGather );
}
这个就是在这个工作线程中,进行初始化及采集十六个通道的过程。
while( 1 )
{
//启动计数器
int n_Chd_CCD;
Form_Main->AC_CStart( Form_Main->h_ACCard, 0, 2 );
int aaa;
do
{
aaa = Form_Main->AC_CRead( Form_Main->h_ACCard, 0, &n_Chd_CCD );
}
while( aaa == 0 );
Synchronize( TypeGather );
}
加上一个do...while就是新开了线程么?
这里的Synchronize( TypeGather );的确只是界面元素同步
整个采集过程是:
1、AC_CStart启动计数器。这个函数会复位计数器的值为0,设置模式,启动计数器开始工作。
2、用AC_CRead函数读出计数器数据,此函数返回计数器停止计数标志。0-正在计数;1-计数完成。
3、若AC_CRead返回1,则结束do...while,进入到下面的显示过程。