代碼如下
ULONG _stdcall ThreadFunc1( LPVOID lpParam ) {
AfxMessageBox(_T("ThreadFunc1"));
static int nCount; //產生事件的次數
while(g_keepRunning)
{
//只要事件串列中有一個事件有信號,就結束等待
ULONG RetForWait = 0xffffffff;
RetForWait = WaitForSingleObject(g_hEventSFIFO,INFINITE);
if( RetForWait == WAIT_OBJECT_0 )
{
CString tempStr;
CSFDJController1Dlg* curDlg;
curDlg = (CSFDJController1Dlg*)AfxGetApp()->m_pMainWnd;
//顯示進入事件的次數
nCount++;
tempStr.Format(_T("事件次數: %d"), nCount);
// curDlg->SetDlgItemText( IDC_LBL_COUNT, tempStr );
long retCount; //,i;
//還是要判斷一下才能讀,因為此時真正的資料個數可能不到需要的數
tempStr.Format(_T("SFIFO中資料個數: %d"), ZT8348_GetSFifoDataCount(g_cardNO,1));
//curDlg->SetDlgItemText( IDC_LBL_DATA_COUNT, tempStr );
//ZT8348_GetSFifoDataCount得到驅動緩沖區(SFIFO)中當前有效資料的個數
if( ZT8348_GetSFifoDataCount(g_cardNO,1) >= g_wantCount )
{
//ZT8348_AISFifo定時啟動AD或外觸發啟動AD時,從驅動緩沖區(SFIFO)中讀一批數 g_wantCount希望得到的個數
retCount = ZT8348_AISFifo(g_cardNO, 0, g_resultArr, g_wantCount);//g_resultArr采集結果
//顯示前8個數
//g_resultArr[i] = 1000.0;
//每次求平均值個數為30000個,每次間隔100個值
ZT8348_AISFifoChAver(g_cardNO, 0,g_resultArr,30000,100);
//ZT8348_AISFifoChAver函式只支持單通道 ,目前狀態是1通道值為0,使用2通道,求平均值的時候就需要乘以兩倍
float gaiv = (g_resultArr[1]*2)/(float)1000;//轉換單位 將mv轉換為v
float gaimv = (g_resultArr[1]*2);
tempStr.Format(_T("%7.3f v"), gaimv);//總共七位 其中兩位小數點
curDlg->SetDlgItemText(IDC_LBL_AD1+0, tempStr);
float kg = 38.18*gaiv;//36.28五個點位求出的平均值
tempStr.Format(_T("%7.2f KG"), kg);//總共七位 其中兩位小數點
curDlg->SetDlgItemText(IDC_LBL_AD0+0, tempStr);
PYali=g_resultArr[1];
/*如果 壓力值減去標準值是區間范圍*/
float ca = PYali-chazhi;
if(ca<=2){
// AfxMessageBox(_T("獲取穩定壓力值的次數 "));
countaaa++;
}
if(countaaa>3){
// PYalir=PYali;
PYalia(kg);
}
chazhi=PYali;
}
}
}
return 0;
}
float StartCaijiwd(){
cunya=0;
// AfxMessageBox(_T("開始采集無引數"));
//新建檔案
if( (g_fp=(fopen("wending.dat","wb")))==NULL)
{
AfxMessageBox(_T("open file failed"));
return -1;
}
// AfxMessageBox("PYali");
//建立一個執行緒監視事件
DWORD dwThreadId;
HANDLE hThread;
g_keepRunning = 1;
hThread = CreateThread(NULL,0,ThreadFunc1,NULL,0,&dwThreadId);
if (hThread == NULL)
{
AfxMessageBox(_T("CreateThread failed\n"));
}
else
{
CloseHandle( hThread );
}
//啟動AD
ZT8348_DisableAD(g_cardNO); //停止定時AD
ZT8348_ClearHFifo(g_cardNO, 1); //清空硬體FIFO(HFIFO)
ZT8348_ClearSFifo(g_cardNO, 1); //清空軟體FIFO(SFIFO)
if( ZT8348_GetSFifoSize(g_cardNO, 1) != 2000 )
{
if( ZT8348_SetSFifoSize(g_cardNO, 1, 2000) != 2000 )
{
CString tempStr1;
tempStr1.Format(_T("g_cardNO: %d"), g_cardNO);
AfxMessageBox(tempStr1);
AfxMessageBox(_T("未申請到足夠的緩沖區"));
CString tempStr;
tempStr.Format(_T("錯誤號: %d"), ZT8348_GetLastErr());
AfxMessageBox(tempStr);
return -1;
}
}
g_wantCount = 1024000;//200000;
ZT8348_SetSFifoThreshold(g_cardNO, 1, g_wantCount); //設定SFIFO閥值
//打開中斷,注意HFIFO超過半滿時打開中斷會死機
//建立一個事件
g_hEventSFIFO = CreateEvent(NULL,false,false,NULL);
if( (HANDLE)g_hEventSFIFO != NULL )
ZT8348_OpenIRQ(g_cardNO, (long)g_hEventSFIFO, 0); //打開中斷
ULONG AIRangeArr[8];
ULONG ampInxArr[8];
//不能用,因為并未把所有元素初始化為2,ULONG AIRangeArr[8] = {2};
//ULONG ampInxArr[8] = {0};
//公式:采樣頻率= 16000000Hz/(分頻系數+1)
const ULONG ADinClock = 16000000;
ULONG ADfreq = 500000;//分頻系數
ULONG ADstartModeWord = 1; //定時啟動
ULONG i;
//量程為 -10~+10V
for(i=0; i<8; i++)
{//2 : 0-- +10000mV
AIRangeArr[i] = 2;// 6;//按照 -10000 -- +10000mV 量程裝入零 點和滿度值,必須與板卡的實際跳線相一致
ampInxArr[i] = 0;
}
ZT8348_AIinit(g_cardNO, 0, 2, AIRangeArr, ampInxArr, ADstartModeWord, ADinClock / ADfreq - 1, 0, 0);
ZT8348_EnableAD(g_cardNO); //啟動定時AD
//回傳函式執行的狀態
CString tempStr;
tempStr.Format(_T("錯誤號: %d"), ZT8348_GetLastErr());
/*PYali是在取值區間范圍內回傳觸發停止采集*/
//AfxMessageBox("2333333");
// float att = 5000;
// Sleep(3000);
while(0.02){
Sleep(6000);
if(cunya>0){
// AfxMessageBox(_T("成功獲取壓力值"));
return cunya;
}
// AfxMessageBox(_T("等待2秒獲取穩定壓力值"));
}
// return 0;
}
void StopCaiji(){
//停止采集
fclose(g_fp);//關閉
ZT8348_CloseIRQ(g_cardNO); //關閉中斷
//回傳函式執行的狀態
CString tempStr;
tempStr.Format(_T("錯誤號: %d"), ZT8348_GetLastErr());
g_keepRunning = 0;
if( (HANDLE)g_hEventSFIFO != NULL )
{
if( CloseHandle( g_hEventSFIFO ) != 0L )
{
g_hEventSFIFO = NULL;
AfxMessageBox(_T("關閉采集"));
}
}
return ;
}
使用MFC按鈕功能呼叫StartCaiji(a)函式,呈現卡死狀態,使用彈框發現創建第一個執行緒ThreadFunc并沒有被執行,然后一直走下面的while(a)方法,在while(a)方法上sleep也不能讓ThreadFunc函式執行,不知道要怎么解決,請問有什么解決辦法嗎?
uj5u.com熱心網友回復:
有一個想法,判斷ThreadFunc1這個執行緒是否在運行,運行在執行執行緒while(a),不知道有沒有這個函式可以去做判斷,我沒有在網上搜到轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/285105.html
標籤:C語言
上一篇:快速存盤影像
下一篇:陣列重新排序問題