LabWindow多線程

#include <utility.h>
#include "toolbox.h"
#include <cvirte.h>		
#include <userint.h>
#include "MainWindow.h"


//線程開始標記,值爲1時開始多線程
int threadID;

static int           startflag = 0;  
//傳遞所創建線程的callbackData參數
static void   *threadfunctiondata = "這是一個多線程的示例!";   
//聲明多線程回調函數
int CVICALLBACK ThreadFunction (void *functionData);

static int mainpanel;

int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)
		return -1;	/* out of memory */
	if ((mainpanel = LoadPanel (0, "MainWindow.uir", MainPanel)) < 0)
		return -1;
	
	//創建一個線程函數
    CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,ThreadFunction, threadfunctiondata, &threadID);

	DisplayPanel (mainpanel);
	RunUserInterface ();
	
	//等待線程執行,直到結束
     CmtWaitForThreadPoolFunctionCompletionEx (DEFAULT_THREAD_POOL_HANDLE, threadID,
       OPT_TP_PROCESS_EVENTS_WHILE_WAITING, CMT_WAIT_FOREVER);
    //釋放線程函數
      CmtReleaseThreadPoolFunctionID (DEFAULT_THREAD_POOL_HANDLE, threadID);
	  
	  
	DiscardPanel (mainpanel);
	return 0;
}

//多線程回調函數
int CVICALLBACK ThreadFunction(void *functionData)
{
  
  double result;
 
  while(startflag == 1)
  {
      result = Random(-10,10);

      Delay(2);
	  
	  SetCtrlVal(mainpanel,MainPanel_WaterTemp,result); 
  }
  return 0;
}

int CVICALLBACK MainFun (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:
			
			startflag=0;
			
			QuitUserInterface(0);

			break;
	}
	return 0;
}


int CVICALLBACK WaterChange (int panel, int control, int event,
							 void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:
			
			double  waterTemp=0;
			
            GetCtrlVal(mainpanel,MainPanel_WaterValue,&waterTemp);
			
			SetCtrlVal(mainpanel,MainPanel_WaterTemp,waterTemp);  
			
		case EVENT_VAL_CHANGED:
			 MessagePopup("hello","test");
			
			

			break;
	}
	return 0;
}

int CVICALLBACK timerFun (int panel, int control, int event,
						  void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_TIMER_TICK:
			   static double waterTemp=0.0;
			   waterTemp+=0.1;
			   
			  	SetCtrlVal(mainpanel,MainPanel_WaterTemp,waterTemp);   

			break;
	}
	return 0;
}

int CVICALLBACK StartThread (int panel, int control, int event,
							 void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:
			
			startflag = 1;     //線程標誌位  值爲1時,表示線程開始
            CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,ThreadFunction, threadfunctiondata, &threadID);

			break;
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章