程序描述:运用一个线程将数据存储到安全队列中,另一个线程来读取数据。
运行效果如下图:
图1:程序运行界面
面和控件属性如下:
变量名 | 控件类型 | 控件属性以及功能 |
---|---|---|
STRIPCHART | Strip Chart | 功能:显示将读取到的数据 |
TEXTBOX | Text Box | 功能:显示写入数据线程结果 |
TEXTBOX_2 | Text Box | 功能:显示读取数据线程结果 |
READ | Command Button | 功能:开起读取数据线程 回调函数:read |
WRITE | Command Button | 功能:开起写入数据线程 回调函数:write |
READ_STOP | Command Button | 功能:停止读取数据线程 回调函数:read_stop |
WRITE_STOP | Command Button | 功能:停止写入数据线程 回调函数:write_stop |
LED_READ | Round LED | 功能:写入数据线程开启时亮起 |
LED_WRITE | Round LED | 功能:读取数据线程开启时亮起 |
代码如下:
#include <ansi_c.h>
#include <utility.h>
#include <cvirte.h>
#include <userint.h>
#include "Thread1.h"
static int panelHandle;
int queue;
int qr = 0; // 开启、关闭线程的标志
int qw = 0;
int functionIdRead;
int funcTionIdWrite;
int CVICALLBACK readThreadFunction (void *functionData); // 回调函数
int CVICALLBACK writeThreadFunction (void *functionData);
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "Thread1.uir", PANEL)) < 0)
return -1;
if ((CmtNewTSQ(1, sizeof(double), OPT_TSQ_DYNAMIC_SIZE, &queue)) < 0 ) // 定义安全队列
return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, readThreadFunction, NULL, &functionIdRead); // 读线程
CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, writeThreadFunction, NULL, &funcTionIdWrite); // 写线程
CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE, functionIdRead, 0); // 倾向于防止死锁
CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE, funcTionIdWrite, 0);
CmtReleaseThreadPoolFunctionID (DEFAULT_THREAD_POOL_HANDLE, functionIdRead); // 释放线程
CmtReleaseThreadPoolFunctionID (DEFAULT_THREAD_POOL_HANDLE, funcTionIdWrite);
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK read (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
if (qr == 1) break; // 防止第二次点击按钮 又重新建立一个线程
qr = 1;
CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, readThreadFunction, NULL, &functionIdRead); // 读线程
break;
}
return 0;
}
int CVICALLBACK write (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
if (qw == 1) break;
qw = 1;
CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, writeThreadFunction, NULL, &funcTionIdWrite); // 写线程
break;
}
return 0;
}
int CVICALLBACK quitsys (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
qr = 0;
qw = 0;
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK read_stop (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
qr = 0;
SetCtrlVal (panelHandle, PANEL_LED_READ, 0);
//if(qr == 1 ){
// CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE, functionIdRead, OPT_TP_PROCESS_EVENTS_WHILE_WAITING);
// CmtReleaseThreadPoolFunctionID (DEFAULT_THREAD_POOL_HANDLE, functionIdRead);
//}
break;
}
return 0;
}
int CVICALLBACK write_stop (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
qw = 0;
SetCtrlVal (panelHandle, PANEL_LED_WRITE, 0);
//if(qw == 1){
// CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE, funcTionIdWrite, OPT_TP_PROCESS_EVENTS_WHILE_WAITING);
// CmtReleaseThreadPoolFunctionID (DEFAULT_THREAD_POOL_HANDLE, funcTionIdWrite);
//}
break;
}
return 0;
}
int CVICALLBACK readThreadFunction (void *functionData)
{
int items = 0;
double array[1] = {0};
char c[100];
SetCtrlVal (panelHandle, PANEL_LED_READ, 1);
while(qr){
CmtGetTSQAttribute(queue,ATTR_TSQ_ITEMS_IN_QUEUE,&items);
if (items)
{
CmtReadTSQData (queue, array, 1, TSQ_INFINITE_TIMEOUT, NULL);
PlotStripChart(panelHandle, PANEL_STRIPCHART, array, 1, 0, 0, VAL_DOUBLE);
sprintf(c,"成功将 %f 读出队列\n",array[0]);
SetCtrlVal (panelHandle, PANEL_TEXTBOX_2, c);
}
// Delay(1);
}
return 0;
}
int CVICALLBACK writeThreadFunction (void *functionData)
{
double a = 0;
double array[1] = {0};
char c[100];
SetCtrlVal (panelHandle, PANEL_LED_WRITE, 1);
while(qw){
a ++;
sprintf(c,"成功将 %f 写入队列\n",a);
SetCtrlVal (panelHandle, PANEL_TEXTBOX, c);
array[0] = a;
CmtWriteTSQData (queue, array, 1, TSQ_INFINITE_TIMEOUT, NULL);
Delay(1);
}
return 0;
}