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;i 6) 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;i 360) 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; }