多线程

#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)当运行单线程程序时,如果程序进入了一个死循环,则不能进行其它的操作了,比如说拖拽运行的界面,而多线程可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值