有四个生产者线程和四个消费者线程,
生产者线程的操作;当生产一个产品时,自己的生产区中画一个矩形区域,存入公共空间时,自己空间的矩形移动到公共空间。
消费者操作类似。
我遇到的问题就是:当程序执行到生产者线程创建的时候,程序不再执行回调函数,
下面是源代码:(这里面只是执行了生产操作,其他的尚未完成)
//头文件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