windows编程实现生产者消费者问题

有四个生产者线程和四个消费者线程, 
生产者线程的操作;当生产一个产品时,自己的生产区中画一个矩形区域,存入公共空间时,自己空间的矩形移动到公共空间。 
消费者操作类似。 

我遇到的问题就是:当程序执行到生产者线程创建的时候,程序不再执行回调函数, 
下面是源代码:(这里面只是执行了生产操作,其他的尚未完成) 

//头文件header.h 
//在此文件中主要定义程序中所需要的图形界面的点的集合,以及所要使用的画刷、画笔 
#ifndef _HEADER 
#define _HEADER 

#include 
#include 

////////////////////////////////////////////////////////////////////////////////////////////////////////////
//定义窗口中所需要的画笔 
//HPEN black_pen = CreatePen(PS_SOLID,2,RGB(100,100,100)); //用于画窗口边框 
HPEN red_pen = CreatePen(PS_SOLID,2,RGB(255,0,0)); //用于画窗口内部的线条 
HPEN produce_pen = CreatePen(PS_SOLID,1,RGB(0,230,180)); //用于画产品的边线 

//定义窗口中所需要的画刷 
HBRUSH bk_brush = CreateSolidBrush(RGB(137,156,205)); //用于填充公共区域的空间 
HBRUSH green_brush = CreateSolidBrush(RGB(0,255,0)); //用于填充生产者的空间 
HBRUSH yellow_brush = CreateSolidBrush(RGB(255,255,0)); //用于填充消费者的空间 
HBRUSH produce_brush = CreateSolidBrush(RGB(0,230,180)); //用于填充产品区域 


/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//定义生产者消费者问题中所需要的信号量以及各个变量 

//变量定义 
const unsigned short SIZE_OF_BUFFER = 32; //缓冲区的大小 
//int g_buffer[SIZE_OF_BUFFER]; //开辟缓冲区,用数组表示,可看成一个循环队列 
unsigned short ProductID = 0; //新生产出来的产品的ID号 
unsigned short ConsumeID = 0; //被消耗的产品的ID号 
bool g_continue = 1; //控制线程的运行:1表示继续运行,0表示停止运行 
//信号量定义 
HANDLE g_hMutex; //线程间的互斥信号 
HANDLE g_hFullSemaphore; //资源信号量,表示缓冲区已满 
HANDLE g_hEmptySemaphore; //资源信号量,表示缓冲区为空 

//生产者、消费者的个数 
const unsigned short PRODUCERS_COUNT = 4; //生产者的个数 
const unsigned short CONSUMERS_COUNT = 4; //消费者的个数 
const unsigned short THREADS_COUNT = PRODUCERS_COUNT + CONSUMERS_COUNT; //线程的总个数 

//生产者、消费者线程ID号定义 
HANDLE hThreads[THREADS_COUNT]; //各个线程的句柄 

DWORD ProducerID[CONSUMERS_COUNT]; //生产者线程的标识 
DWORD ConsumerID[PRODUCERS_COUNT]; //消费者线程的标识 

typedef struct param{ 
int num; 
HWND hWnd; 
}; 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//定义窗口中的各个定点 

//窗口的坐标定义 
//POINT WndPoint[4] = { 
// {100,100}, 
// {800,100}, 
// {800,600}, 
// {100,600} 
//} 

//公共区坐标定义 
POINT ShareSpace[4] = { 
{100,100}, 
{800,100}, 
{800,490}, 
{100,490} 
}; 

//生产者空间坐标定义 
POINT ProduceSpace[4] = { 
{100,490}, 
{450,490}, 
{450,600}, 
{100,600} 
}; 

//消费者空间坐标定义 
POINT ConsumerSpace[4] = { 
{450,490}, 
{800,490}, 
{800,600}, 
{450,600} 
}; 
#endif 

//主函数开始 
#include"header.h" 


//画窗口中的矩形区域 
void DrawRec(HWND hWnd,HPEN pen,HBRUSH brush,POINT *point,int n) 
{ 
HDC hdc; 
hdc = GetDC(hWnd); 

SelectObject(hdc,pen); 
SelectObject(hdc,brush); 

Polygon(hdc,point,n); 

SelectObject(hdc,pen); 
SelectObject(hdc,brush); 

ReleaseDC(hWnd,hdc); 
} 
//生产产品 
void Produce(param P) 
{ 
HDC hdc; 
hdc = GetDC(P.hWnd); 
// POINT CONSUME[4] = { 
// {105+88*(num - 1),495}, 
// {105+88*(num - 1)+70,495}, 
// {105+88*(num - 1)+70,565}, 
// {195+88*(num - 1),565} 
//}; 
// DrawRec(hWnd,produce_pen,produce_brush,CONSUME,4); 
TextOut(hdc,105,495,"HELLO",strlen("HELLO")); 
ReleaseDC(P.hWnd,hdc); 
} 

//将产品送入缓冲区 
void AddToBuffer(HWND hWnd) 
{ 
} 

//取出一件产品 
void Take(HWND hWnd) 
{ 
} 

//消费一件产品 
void Consume(HWND hWnd) 
{ 
} 
//生产者得操作 
DWORD WINAPI Producer(param P) 
{ 
while(g_continue) 
{ 
//资源信号量得操作 
WaitForSingleObject(g_hFullSemaphore,INFINITE); //满缓冲区P操作 
WaitForSingleObject(g_hMutex,INFINITE); //互斥信号P操作 
Produce(P); 
AddToBuffer(P.hWnd); 
ReleaseMutex(g_hMutex); //释放互斥信号,V操作 
ReleaseSemaphore(g_hEmptySemaphore,1,NULL); //释放空缓冲区操作,V操作 
} 
return 0; 
} 

//消费者操作 
void Consumer(HWND hWnd) 
{ 
while(g_continue) 
{ 
//资源信号量操作 
WaitForSingleObject(g_hEmptySemaphore,INFINITE); 
WaitForSingleObject(g_hMutex,INFINITE); 
Take(hWnd); 
Consume(hWnd); 
ReleaseMutex(g_hMutex); 
ReleaseSemaphore(g_hFullSemaphore,1,NULL); 
} 
} 
//创建生产者线程 
void CreatePT(HWND hWnd) 
{ 
param P; 
P.hWnd= hWnd; 
for(int i = 0;i < PRODUCERS_COUNT;++i) 
{ 
P.num = i; 
hThreads[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Producer,&P,0,&ProducerID[i]); 
if(hThreads[i] == NULL) 
g_continue = 0; 
} 
} 

//创建消费者线程 
void CreateCT(HWND hWnd) 
{ 
for(int j = 0;j

原文地址:http://www.oschina.net/question/124134_21696

你可能感兴趣的:(优秀转载)