#include "toolbox.h"
#include <utility.h>
#include <cvirte.h>
#include <userint.h>
#include "multi thread.h"
//传递所创建线程的callbackData参数
static void *threadfunctiondata = "这是一个多线程定时器示例!";
//新线程开始标识,值为1时开始多线程
static int startflag = 0;
static int panelHandle;
int CVICALLBACK ThreadFunction (void *functionData);
int main (int argc, char *argv[])
{
int threadID;
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "multi thread.uir", PANEL)) < 0)
return -1;
//创建一个新程函数
CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, ThreadFunction, threadfunctiondata, &threadID);
DisplayPanel (panelHandle);
RunUserInterface ();
//等待线程执行,直到结束
CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE, threadID, OPT_TP_PROCESS_EVENTS_WHILE_WAITING);
//释放线程函数
CmtReleaseThreadPoolFunctionID (DEFAULT_THREAD_POOL_HANDLE, threadID);
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK start (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int threadID;
switch (event)
{
case EVENT_COMMIT:
startflag = 1;
CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, ThreadFunction, threadfunctiondata, &threadID);
break;
}
return 0;
}
int CVICALLBACK stop (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
startflag = 0;
break;
}
return 0;
}
int CVICALLBACK QuitCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
startflag = 0;
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK ThreadFunction (void *functionData)
{
double yarray[1];
double result;
while (startflag)
{
result = Random (0, 100);
yarray[0] = result;
PlotStripChart (panelHandle, PANEL_STRIPCHART, yarray, 1, 0, 0, VAL_DOUBLE);
Delay (0.02);
SetCtrlAttribute (panelHandle, PANEL_STRIPCHART, ATTR_LABEL_TEXT, (char *) functionData);
}
return 0;
}
(1) CmtScheduleThreadPoolFunction这个函数的最后一个参数不是线程ID,而是线程函数ID,每一个线程都有一个线程函数实体,而该线程就执行对应的线程函数。当调用这个创建线程的函数的时候,线程函数就被调用了。
(2)CmtWaitForThreadPoolFunctionCompletion这个函数是等待线程函数执行完成。
(3)系统调度的最小单位为线程。
(4)当运行单线程程序时,如果程序进入了一个死循环,则不能进行其它的操作了,比如说拖拽运行的界面,而多线程可以。