www.pudn.com > LabWindowsCVI.rar > sample13.c


#include  
#include  
#include "inifile.h" 
#include  
#include   
#include  
#include  
#include  
#include "sample13.h" 
#include  
#include  
 
//最多创建的线程数 
#define MAXTHREADS 6 
#define RADIUS 40 
 
typedef struct tag_THREAD_INFO{ 
    int           ctrlID;             // Cavas控件ID号 
    HANDLE        hThread;            //线程句柄 
    unsigned int  CurrentValue;       //线程当前值 
    int           IsRunning;          //线程状态 
} THREAD_INFO; 
 
 
 
static int panelHandle = 0; 
static volatile int exiting   = 0; 
 
//变量数组threadInfoArray储存各线程信息 
THREAD_INFO threadInfoArray[MAXTHREADS] ; 
//变量threadCount表示当前已创建线程数 
int threadCount = 0; 
//数组top 和left分别表示各线程Cavas控件的位置 
int top[MAXTHREADS]={40,40,40,180,180,180}; 
int left[MAXTHREADS]={20,140,260,20,140,260}; 
 
int color; 
 
Point start,end; 
 
//INI文本数据 
IniText myInifile; 
 
int ShutdownApplication(void); 
 
DWORD WINAPI MyThread(LPVOID item); 
 
int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                       LPSTR lpszCmdLine, int nCmdShow) 
{ 
    //习题添加的代码 
    int status; 
    int threadStatus[MAXTHREADS]; 
    //添加代码结束 
     
    int i,num; 
     
    for(i=0;i6) num=6; 
 
          //习题添加的代码 
         //从列表中读取上次程序关闭时的线程状态 
		 Ini_GetInt (myInifile, "ThreadInfo", "thread1", &threadStatus[0]); 
		 Ini_GetInt (myInifile, "ThreadInfo", "thread2", &threadStatus[1]); 
		 Ini_GetInt (myInifile, "ThreadInfo", "thread3", &threadStatus[2]); 
		 Ini_GetInt (myInifile, "ThreadInfo", "thread4", &threadStatus[3]); 
		 Ini_GetInt (myInifile, "ThreadInfo", "thread5", &threadStatus[4]); 
		 Ini_GetInt (myInifile, "ThreadInfo", "thread6", &threadStatus[5]); 
         //添加代码结束 
          
          
         //循环调用CreateCallback函数num次 
         for(i=0;i360) 
	                    threadInfoArray[(int)item].CurrentValue-=360; 
	                     
	                start.x=25; 
                	start.y=25; 
                	 
                	end.x=(int)(RADIUS* 
                	      cos(PI*(threadInfoArray[(int)item].CurrentValue)/180.0)+RADIUS); 
                  	end.y=(int)(RADIUS* 
                  	      sin(PI*(threadInfoArray[(int)item].CurrentValue)/180.0)+RADIUS);; 
 
                    color = MakeColor(255*rand()/RAND_MAX,  
                             255*rand()/RAND_MAX, 255*rand()/RAND_MAX); 
                              
					SetCtrlAttribute (panelHandle, threadInfoArray[(int)item].ctrlID, 
									  ATTR_PEN_COLOR, color); 
					   
					CanvasDrawLine (panelHandle, threadInfoArray[(int)item].ctrlID, start, 
									end); 
               } 
         } 
        Sleep(0); 
    }    
    return(0); 
} 
 
int CVICALLBACK TerminateCallback (int panel, int control, int event, 
		void *callbackData, int eventData1, int eventData2) 
{ 
	int status,index; 
	 
	switch (event) 
		{ 
		case EVENT_COMMIT: 
		 
			 //判断当前是否存在线程  
			 if(threadCount>0) 
              { 
                  //终止最新创建的线程 
                  status=TerminateThread(threadInfoArray[threadCount-1].hThread,0);    
                  
                  if(status==FALSE) 
                      //操作失败,显示出错信息 
			          MessagePopup ("Error", "Terminate thread error!"); 
   		          else 
			       { 
                     //终止线程成功 
                     //删除该线程的Canvas控件 
			         DiscardCtrl (panel, threadInfoArray[threadCount-1].ctrlID); 
			          
                     threadInfoArray[threadCount-1].IsRunning=-1; 
 
                     //删除RING控件中表示该线程的项 
					 GetIndexFromValue (panel, PANEL_RING, &index, threadCount); 
					 DeleteListItem (panel, PANEL_RING, index, 1); 
					  
                     //当前线程数减一 
                     threadCount--; 
			          
                     //如果线程数为0,设置控件TERMINATE、 
                     //RING、RESUMEORSUSPEND无效 
				     if(threadCount==0) 
				       { 
						 SetCtrlAttribute (panel, PANEL_TERMINATE, ATTR_DIMMED, 1); 
				         SetCtrlAttribute (panel, PANEL_RING, ATTR_DIMMED, 1); 
				         SetCtrlAttribute (panel, PANEL_RESUMEORSUSPEND, ATTR_DIMMED, 1); 
            	       } 
			       } 
			   } 
			break; 
		} 
	return 0; 
} 
 
int CVICALLBACK ResumeOrSuspendCallback (int panel, int control, int event, 
		void *callbackData, int eventData1, int eventData2) 
{ 
	int value,status,style; 
	 
	switch (event) 
		{ 
		case EVENT_COMMIT: 
		 
              //获取控件RING和RESUMEORSUSPEND的值 
              GetCtrlVal (panel, PANEL_RING, &value); 
			  GetCtrlVal (panel, PANEL_RESUMEORSUSPEND, &style); 
			   
              //判断是暂停还是继续线程 
              if(style) 
              { 
			    //暂停线程 
			    status=SuspendThread(threadInfoArray[value-1].hThread); 
			     
			    if(status<0) 
				  //操作失败,显示出错信息  
				  MessagePopup ("Error", "Suspend thread error!"); 
				else 
                  //储存线程状态 
                  threadInfoArray[value-1].IsRunning=0; 
				 
			  } 
			  else 
			  { 
  			    //继续线程 
  			    status=ResumeThread(threadInfoArray[value-1].hThread); 
                 
			    if(status<0) 
				  //操作失败,显示出错信息  
				  MessagePopup ("Error", "Resume thread error!"); 
				else 
                  //储存线程状态 
                  threadInfoArray[value-1].IsRunning=1; 
			  } 
			break; 
		} 
	return 0; 
} 
 
int CVICALLBACK RingCallback (int panel, int control, int event, 
		void *callbackData, int eventData1, int eventData2) 
{ 
	int value; 
	 
	switch (event) 
		{ 
		case EVENT_COMMIT: 
		 
			  //获取RING控件的值 
			  GetCtrlVal (panel, PANEL_RING, &value); 
			   
              //根据IsRunning值设置RESUMEORSUSPEND控件的值 
              if(threadInfoArray[value-1].IsRunning) 
			   SetCtrlVal (panel, PANEL_RESUMEORSUSPEND, 0); 
			  else 
			   SetCtrlVal (panel, PANEL_RESUMEORSUSPEND, 1); 
			    
			break; 
		} 
	return 0; 
} 
 
int CVICALLBACK PanelCallback (int panel, int event, void *callbackData, 
		int eventData1, int eventData2) 
{ 
	switch (event) 
		{ 
		case EVENT_CLOSE: 
		 
            QuitUserInterface (0); 
             
			break; 
		} 
	return 0; 
} 
 
int CVICALLBACK QuitCallback (int panel, int control, int event, 
        void *callbackData, int eventData1, int eventData2) { 
     
    switch (event) { 
        case EVENT_COMMIT: 
         
            QuitUserInterface (0); 
             
        break; 
    } 
     
    return 0; 
}