我現在做一個專案,是需要實作這樣一個功能,
,然后在每個電機運動中進行呼叫一個執行緒,來顯示電機的運行情況;int CXYtable::OnXRun()
{
CSpiderDoc XSpider;
g_GlobalPara.x_dir=m_x_dir.GetCurSel();
g_GlobalPara.x_fre=GetPulse(IDC_X_FRE);
g_GlobalPara.x_pulse=GetPulse(IDC_X_PUL);
g_GlobalPara.StepDetectType=1;
CString X_tiaoshi;
if(StepMotorDetect(1,g_GlobalPara.StepDetectType,g_GlobalPara.x_dir,g_GlobalPara.x_fre,g_GlobalPara.x_pulse,0,0,0,0,0)==TRUE)
{
X_tiaoshi.Format("X電機進入除錯狀態:");
g_GlobalPara.m_pSideBar->AddMessage(X_tiaoshi);
if (g_GlobalPara.x_dir==0)
{
X_tiaoshi.Format("方向:正轉。");
g_GlobalPara.m_pSideBar->AddMessage(X_tiaoshi);
}
else
{
X_tiaoshi.Format("方向:反轉。");
g_GlobalPara.m_pSideBar->AddMessage(X_tiaoshi);
}
X_tiaoshi.Format(" 運動頻率為: %d (HZ)",int(g_GlobalPara.x_fre));
g_GlobalPara.m_pSideBar->AddMessage(X_tiaoshi);
X_tiaoshi.Format(" 運動脈沖為: %d (個)",g_GlobalPara.x_pulse);
g_GlobalPara.m_pSideBar->AddMessage(X_tiaoshi);
g_GlobalPara.m_pSideBar->AddMessage("-------------------------------------------");
g_GlobalPara.XY_DectXianCheng=TRUE;
GetDlgItem(ID_X_RUN)->EnableWindow(FALSE);
GetDlgItem(ID_Y_RUN)->EnableWindow(FALSE);
GetDlgItem(ID_Z_RUN)->EnableWindow(FALSE);
GetDlgItem(ID_R_RUN)->EnableWindow(FALSE);
g_GlobalPara.X_yundong=TRUE;
HANDLE WORKING_Hnd;
WORKING_Hnd=CreateThread(NULL,0,StepDetect,NULL,0,NULL);//在這里進入執行緒【注明】
CloseHandle(WORKING_Hnd);
}
return TRUE;
}
然后執行緒的具體程式是:
DWORD WINAPI CXYtable::StepDetect(LPVOID params)
{
// CMainFrame* pMF=(CMainFrame*)AfxGetApp()->m_pMainWnd; //先通過獲取當前框架指標
// CView * active = pMF->GetActiveView();//才能獲取當前視類指標
CXYtable XYtable;
PUCHAR inData = new UCHAR[512];
CCyUSBDevice *USBDevice =new CCyUSBDevice();
bool success=false;
OVERLAPPED inOvLap;
inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN");
for (;g_GlobalPara.XY_DectXianCheng;)
{
ZeroMemory(inData,512);
LONG inlen ;
inlen = 512;
UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inData,inlen,&inOvLap);
USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,2000);
USBDevice->BulkInEndPt->SetXferSize(512);
success=USBDevice->BulkInEndPt->FinishDataXfer(inData,inlen, &inOvLap,inContext);
if(success&&g_GlobalPara.XY_DectXianCheng)
{
CString huichuang;
if((inData[1]==0x59)&&(inData[3]==0x59)&&(inData[5]==0x59))
{
huichuang.Format("X軸電機除錯完成,時間為:");
g_GlobalPara.m_pSideBar->AddMessage(huichuang);
long ltime;
time( <ime );
huichuang.Format(" %s", ctime(<ime) );
huichuang.TrimRight();
g_GlobalPara.m_pSideBar->AddMessage(huichuang);
g_GlobalPara.m_pSideBar->AddMessage("-------------------------------------------");
g_GlobalPara.XY_DectXianCheng=FALSE;
Sleep(50000);
// if(active != NULL) //獲取了當前視類指標才能發送訊息
// active->PostMessage(WM_USERMESSAGE ,0,0); //使用PostMessage發送訊息
// CXYtable::SendMessage();
break;
}
else if((inData[1]==0x62)&&(inData[3]==0x62)&&(inData[5]==0x62))
{
huichuang.Format("Z軸電機除錯完成,時間為:");
g_GlobalPara.m_pSideBar->AddMessage(huichuang);
long ltime;
time( <ime );
huichuang.Format(" %s", ctime(<ime) );
huichuang.TrimRight();
g_GlobalPara.m_pSideBar->AddMessage(huichuang);
g_GlobalPara.m_pSideBar->AddMessage("-------------------------------------------");
g_GlobalPara.XY_DectXianCheng=FALSE;
Sleep(50000);
// C_Button.PostMessage(WM_USERMESSAGE,0,0);
break;
}
else if((inData[1]==0x63)&&(inData[3]==0x63)&&(inData[5]==0x63))
{
huichuang.Format("R軸電機除錯完成,時間為:");
g_GlobalPara.m_pSideBar->AddMessage(huichuang);
long ltime;
time( <ime );
huichuang.Format(" %s", ctime(<ime) );
huichuang.TrimRight();
g_GlobalPara.m_pSideBar->AddMessage(huichuang);
g_GlobalPara.m_pSideBar->AddMessage("-------------------------------------------");
g_GlobalPara.XY_DectXianCheng=FALSE;
Sleep(50000);
// C_Button.PostMessage(WM_USERMESSAGE,0,0);
break;
}
}
}
ZeroMemory(inData,512);
delete[] inData;
CloseHandle(inOvLap.hEvent);
return 0xdead;
}
這樣當接收到底層硬體發過來的程式后,就可以進行軟體的更新。
但是有一個問題:我在第一次更新畫面后,感覺以后再次電機這個按鈕,就不能夠進入執行緒了。
我想知道我的執行緒已經結束了,為什么不能夠再次進入了。。。
請高人幫忙,謝謝啦
uj5u.com熱心網友回復:
執行緒結束后就被銷毀了,如果想繼續使用就不要讓執行緒結束,用完后將執行緒休眠,下次用在喚醒。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/123286.html
上一篇:MFC,雙擊打開word檔案,出現檔案下載界面,如何去掉
下一篇:新人求指教
