|
代码如下
- 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函数执行,不知道要怎么解决,请问有什么解决办法吗?
用这个试试看
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #ifdef _MSC_VER
- #include <windows.h>
- #include <io.h>
- #include <process.h>
- #define MYVOID void
- #else
- #include <unistd.h>
- #include <sys/time.h>
- #include <pthread.h>
- #define CRITICAL_SECTION pthread_mutex_t
- #define _vsnprintf vsnprintf
- #define MYVOID void *
- #endif
- //Log{
- #define MAXLOGSIZE 20000000
- #define ARRSIZE(x) (sizeof(x)/sizeof(x[0]))
- #include <time.h>
- #include <sys/timeb.h>
- #include <stdarg.h>
- char logfilename1[]="MyLog1.log";
- char logfilename2[]="MyLog2.log";
- char logstr[16000];
- char datestr[16];
- char timestr[16];
- char mss[4];
- CRITICAL_SECTION cs_log;
- FILE *flog;
- #ifdef _MSC_VER
- void Lock(CRITICAL_SECTION *l) {
- EnterCriticalSection(l);
- }
- void Unlock(CRITICAL_SECTION *l) {
- LeaveCriticalSection(l);
- }
- void sleep_ms(int ms) {
- Sleep(ms);
- }
- #else
- void Lock(CRITICAL_SECTION *l) {
- pthread_mutex_lock(l);
- }
- void Unlock(CRITICAL_SECTION *l) {
- pthread_mutex_unlock(l);
- }
- void sleep_ms(int ms) {
- usleep(ms*1000);
- }
- #endif
- void LogV(const char *pszFmt,va_list argp) {
- struct tm *now;
- struct timeb tb;
-
-
- if (NULL==pszFmt||0==pszFmt[0]) return;
- if (-1==_vsnprintf(logstr,ARRSIZE(logstr),pszFmt,argp)) logstr[ARRSIZE(logstr)-1]=0;
- ftime(&tb);
- now=localtime(&tb.time);
- sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
- sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
- sprintf(mss,"%03d",tb.millitm);
- printf("%s %s.%s %s",datestr,timestr,mss,logstr);
- flog=fopen(logfilename1,"a");
- if (NULL!=flog) {
- fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
- if (ftell(flog)>MAXLOGSIZE) {
- fclose(flog);
- if (rename(logfilename1,logfilename2)) {
- remove(logfilename2);
- rename(logfilename1,logfilename2);
- }
- flog=fopen(logfilename1,"a");
- if (NULL==flog) return;
- }
- fclose(flog);
- }
- }
- void Log(const char *pszFmt,...) {
- va_list argp;
-
- Lock(&cs_log);
- va_start(argp,pszFmt);
- LogV(pszFmt,argp);
- va_end(argp);
- Unlock(&cs_log);
- }
- //Log}
- int No_Loop=0;
- MYVOID testThread(void *pcn) {
- int n,i;
-
- n=(int)pcn;
- i=0;
- while (1) {
- sleep_ms(1000);
- Log("in testThread %d:i==%ds\n",n,++i);
- if (i>=5) No_Loop=1;
- }
- }
- int main(int argc,char * argv[]) {
- int i;
- #ifdef _MSC_VER
- InitializeCriticalSection(&cs_log);
- #else
- pthread_mutex_init(&cs_log,NULL);
- pthread_t threads[1];
- int threadsN;
- int rc;
- #endif
- Log("=========BEGIN==================\n");
- #ifdef _MSC_VER
- _beginthread((void(__cdecl *)(void *))testThread,0,(void *)1);
- #else
- threadsN=0;
- rc=pthread_create(&(threads[threadsN++]),NULL,testThread,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);
- #endif
- i=0;
- while (1) {
- sleep_ms(100);
- Log("in main:i==%d\n",++i);
- if (No_Loop==1) break;//
- }
- Log("=========END====================\n");
- #ifdef _MSC_VER
- DeleteCriticalSection(&cs_log);
- #else
- pthread_mutex_destroy(&cs_log);
- #endif
- return 0;
- }
- //2012-06-14 16:27:21.500 =========BEGIN==================
- //2012-06-14 16:27:21.609 in main:i==1
- //2012-06-14 16:27:21.718 in main:i==2
- //2012-06-14 16:27:21.828 in main:i==3
- //2012-06-14 16:27:21.937 in main:i==4
- //2012-06-14 16:27:22.046 in main:i==5
- //2012-06-14 16:27:22.156 in main:i==6
- //2012-06-14 16:27:22.265 in main:i==7
- //2012-06-14 16:27:22.375 in main:i==8
- //2012-06-14 16:27:22.484 in main:i==9
- //2012-06-14 16:27:22.500 in testThread 1:i==1s
- //2012-06-14 16:27:22.593 in main:i==10
- //2012-06-14 16:27:22.703 in main:i==11
- //2012-06-14 16:27:22.812 in main:i==12
- //2012-06-14 16:27:22.921 in main:i==13
- //2012-06-14 16:27:23.031 in main:i==14
- //2012-06-14 16:27:23.140 in main:i==15
- //2012-06-14 16:27:23.250 in main:i==16
- //2012-06-14 16:27:23.359 in main:i==17
- //2012-06-14 16:27:23.468 in main:i==18
- //2012-06-14 16:27:23.500 in testThread 1:i==2s
- //2012-06-14 16:27:23.578 in main:i==19
- //2012-06-14 16:27:23.687 in main:i==20
- //2012-06-14 16:27:23.796 in main:i==21
- //2012-06-14 16:27:23.906 in main:i==22
- //2012-06-14 16:27:24.015 in main:i==23
- //2012-06-14 16:27:24.125 in main:i==24
- //2012-06-14 16:27:24.234 in main:i==25
- //2012-06-14 16:27:24.343 in main:i==26
- //2012-06-14 16:27:24.453 in main:i==27
- //2012-06-14 16:27:24.500 in testThread 1:i==3s
- //2012-06-14 16:27:24.562 in main:i==28
- //2012-06-14 16:27:24.671 in main:i==29
- //2012-06-14 16:27:24.781 in main:i==30
- //2012-06-14 16:27:24.890 in main:i==31
- //2012-06-14 16:27:25.000 in main:i==32
- //2012-06-14 16:27:25.109 in main:i==33
- //2012-06-14 16:27:25.218 in main:i==34
- //2012-06-14 16:27:25.328 in main:i==35
- //2012-06-14 16:27:25.437 in main:i==36
- //2012-06-14 16:27:25.500 in testThread 1:i==4s
- //2012-06-14 16:27:25.546 in main:i==37
- //2012-06-14 16:27:25.656 in main:i==38
- //2012-06-14 16:27:25.765 in main:i==39
- //2012-06-14 16:27:25.875 in main:i==40
- //2012-06-14 16:27:25.984 in main:i==41
- //2012-06-14 16:27:26.093 in main:i==42
- //2012-06-14 16:27:26.203 in main:i==43
- //2012-06-14 16:27:26.312 in main:i==44
- //2012-06-14 16:27:26.421 in main:i==45
- //2012-06-14 16:27:26.500 in testThread 1:i==5s
- //2012-06-14 16:27:26.531 in main:i==46
- //2012-06-14 16:27:26.531 =========END====================
复制代码
|
|