1. 程式人生 > >CVI多執行緒資料保護(安全佇列)

CVI多執行緒資料保護(安全佇列)

一個執行緒產生資料,加入安全佇列;一個執行緒顯示資料,讀取安全佇列。

#include <windows.h>
#include <stdio.h>  
#include <utility.h>
int CVICALLBACK ThreadFunction (void *functionData);
int CVICALLBACK ThreadFunction1 (void *functionData);
int threadID;
int threadID1;

static int startflag = 0;
static int startflag1 = 0;
static CmtTSQHandle	g_timerQueueHdl = 0;

BOOL SetConsoleColor(WORD wAttributes)  
{  
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);  
    if (hConsole == INVALID_HANDLE_VALUE)  
        return FALSE;     
    return SetConsoleTextAttribute(hConsole, wAttributes);  
} 
int main()  
{
	if (CmtNewTSQ (2, sizeof(long), OPT_TSQ_DYNAMIC_SIZE,&g_timerQueueHdl) < 0)
		return -1;
	startflag = 1;
	startflag1 = 1;
		SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);    
	CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,ThreadFunction1 ,NULL ,&threadID1);

	CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,ThreadFunction ,NULL ,&threadID);	
	CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE,threadID, OPT_TP_PROCESS_EVENTS_WHILE_WAITING);  
	CmtReleaseThreadPoolFunctionID (DEFAULT_THREAD_POOL_HANDLE, threadID);
	CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE,threadID1, OPT_TP_PROCESS_EVENTS_WHILE_WAITING);  
	CmtReleaseThreadPoolFunctionID (DEFAULT_THREAD_POOL_HANDLE, threadID1);
	CmtDiscardTSQ (g_timerQueueHdl);
}
int CVICALLBACK ThreadFunction (void *functionData)
{
	long g_nNum[2] = {0,100}; 
	while (startflag)
	{
		Sleep(100);
	    
		SetConsoleColor(FOREGROUND_GREEN); 
		g_nNum[0]++;
		g_nNum[1]++;
		printf("執行緒安全佇列1載入%d\n", g_nNum[0]); 
   		printf("執行緒安全佇列2載入%d\n", g_nNum[1]);
		SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);  
		CmtWriteTSQData (g_timerQueueHdl, g_nNum, 2, TSQ_INFINITE_TIMEOUT,NULL);
		Sleep(0);
	}
    return 0;  
}

int CVICALLBACK ThreadFunction1 (void *functionData)
{
    long	   g_nNum1[2];
	while (startflag1)
	{
		Sleep(100);
		CmtReadTSQData (g_timerQueueHdl, g_nNum1, 2,TSQ_INFINITE_TIMEOUT, 0);
		printf("執行緒安全佇列1讀取%d\n", g_nNum1[0]); 
   		printf("執行緒安全佇列2讀取%d\n", g_nNum1[1]);
		Sleep(0);
	}
    return 0;  
}