您的位置:首页 > 其它

LabWindows/CVI线程操作

2016-01-25 09:34 281 查看
参考:http://www.ni.com/white-paper/3663/zhs/



结果:



#include <utility.h>
#include <ansi_c.h>
#include <cvirte.h>		
#include <userint.h>
#include "test2.h"

static int panelHandle;
int startFlag=0;// 线程标识  1开始;同时也是OK控件奇偶数次按下的标识
int CVICALLBACK DataAcqThreadFunction (void *functionData);	   //线程

int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)
		return -1;	/* out of memory */
	if ((panelHandle = LoadPanel (0, "test2.uir", PANEL)) < 0)
		return -1;
	DisplayPanel (panelHandle);
	RunUserInterface ();
	DiscardPanel (panelHandle);
	return 0;
}

int CVICALLBACK MainCallBack (int panel, int event, void *callbackData,
		int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_GOT_FOCUS:

			break;
		case EVENT_LOST_FOCUS:

			break;
		case EVENT_CLOSE:
			QuitUserInterface(0);	  //关闭程序

			break;
	}
	return 0;
}

int CVICALLBACK Calculate (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	double a,b;
	char ss[100];
	
	switch (event)
	{
		case EVENT_COMMIT:
			GetCtrlVal(panelHandle,PANEL_PARA_A,&a);
			GetCtrlVal(panelHandle,PANEL_PARA_B,&b); 
			sprintf(ss,"=%f",a+b);
			SetCtrlVal(panelHandle,PANEL_RESULT,ss);

			break;
	}
	return 0;
}

int CVICALLBACK Start (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	int functionId;
	
	switch (event)
	{
		case EVENT_COMMIT:
			
			if(startFlag==0)
			{
				startFlag=1;
				SetCtrlAttribute (panelHandle, PANEL_START, ATTR_LABEL_TEXT, "CANCEL");
				
				CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, DataAcqThreadFunction, NULL, &functionId);
//				CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE, functionId, 0); //辅助线程完成后才回归主线程
				
			}
			else
			{
				startFlag=0;
				SetCtrlAttribute (panelHandle, PANEL_START, ATTR_LABEL_TEXT, "START");
			}

			break;
	}
	return 0;
}

int CVICALLBACK DataAcqThreadFunction (void *functionData)
{
	int i=0;
	char ss[100];
	
	char output_file[]="data_xxx.csv";
	sprintf(output_file,"data_%3d.csv",1); //设置文件名
	FILE* fd=fopen(output_file,"w");	//“写”打开文件
	if(!fd){
			perror("fopen failed!");
			return 1;
	}
	SetCtrlVal(panelHandle, PANEL_COUNT, "0");//这里确实跟MFC不太一样,可以直接访问主线程的控件
	
    while(1){
		i++;
        sprintf(ss,"%d",i);
		SetCtrlVal(panelHandle, PANEL_COUNT, ss); 
		Delay(1); //延迟1s
		
		fprintf(fd,"%ld, ",i);  //输出数据+换格
		fprintf(fd,"\n");	  //换行
		if(i>1000 || !startFlag){
			break;
		
		}
    }
	fclose(fd);		  //关闭文件
	
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: