📄 minigui.txt
字号:
LineTo(neicun_hdc,Lianjie[0][i],20+(i-1)*10);
}
for( i=0;i<12;i++) //一象限画横坐标
{
MoveTo(neicun_hdc,66+i*16,146);
LineTo(neicun_hdc,66+i*16,142);
}
for( i=0;i<8;i++) //一象限画纵坐标
{
MoveTo(neicun_hdc,66,143-i*16);
LineTo(neicun_hdc,70,143-i*16);
}
MoveTo(neicun_hdc,271,146);
LineTo(neicun_hdc,258,142);
BitBlt(neicun_hdc, 66, 24, 205,123,pHuanXian->XC_hdc,66,24,0);
//--------------------------------------------------------------------------------
FillBox (neicun_hdc, 366, 24, 205, 123);
for( i=1;i<LIANJIEDIANSHU;i++) //二象限画曲线
{
MoveTo(neicun_hdc,Lianjie[1][i-1],20+(i-1)*10);
LineTo(neicun_hdc,Lianjie[1][i],20+(i-1)*10);
}
for( i=0;i<12;i++) //二象限画横坐标
{
MoveTo(neicun_hdc,365+i*16,146);
LineTo(neicun_hdc,365+i*16,142);
}
for( i=0;i<8;i++) //第二限画纵坐标
{
MoveTo(neicun_hdc,365,146-i*16);
LineTo(neicun_hdc,369,146-i*16);
}
MoveTo(neicun_hdc,571,146);
LineTo(neicun_hdc,558,142);
BitBlt(neicun_hdc, 366, 24, 205,123,pHuanXian->XC_hdc,366,24,0);
//--------------------------------------------------------------------------------
FillBox (neicun_hdc, 67, 215, 205, 123);
for( i=1;i<LIANJIEDIANSHU;i++) //三象限画曲线
{
MoveTo(neicun_hdc,Lianjie[2][i-1],20+(i-1)*10);
LineTo(neicun_hdc,Lianjie[2][i],20+(i-1)*10);
}
for( i=0;i<12;i++) //三象限画横坐标
{
MoveTo(neicun_hdc,67+i*16,339);
LineTo(neicun_hdc,67+i*16,335);
}
for( i=0;i<8;i++) //第三限画纵坐标
{
MoveTo(neicun_hdc,67,339-i*16);
LineTo(neicun_hdc,70,339-i*16);
}
MoveTo(neicun_hdc,272,338);
LineTo(neicun_hdc,258,334);
BitBlt(neicun_hdc, 67, 215, 205,123,pHuanXian->XC_hdc,67,215,0);
//--------------------------------------------------------------------------------
FillBox (neicun_hdc, 368, 220, 205, 123);
for( i=1;i<LIANJIEDIANSHU;i++) //四象限画曲线
{
MoveTo(neicun_hdc,Lianjie[3][i-1],20+(i-1)*10);
LineTo(neicun_hdc,Lianjie[3][i],20+(i-1)*10);
}
for( i=0;i<12;i++) //四象限画横坐标
{
MoveTo(neicun_hdc,368+i*16,343);
LineTo(neicun_hdc,368+i*16,339);
}
for( i=0;i<8;i++) //第四限画纵坐标
{
MoveTo(neicun_hdc,368,343-i*16);
LineTo(neicun_hdc,372,343-i*16);
}
MoveTo(neicun_hdc,573,343);
LineTo(neicun_hdc,560,339);
BitBlt(neicun_hdc, 368, 220, 205,123,pHuanXian->XC_hdc,368,220,0);
//--------------------------------------------------------------------------------
DeleteCompatibleDC(neicun_hdc);
}
/*
************************************************************************************************************************
**函数原型 : void init(struct prodcons * b)
**参数说明 : 自定义结构变量,包含互斥量等
**返回 值 :
**创 建 人:
**最后修改日期: 2006年1月19日
**描 述: 初始化线程包括互斥锁和条件变量读写指针等
************************************************************************************************************************
*/
static void init(struct prodcons * b)//初始化
{
pthread_mutex_init(&b->lock, NULL);//初始化互斥锁
pthread_cond_init(&b->notempty, NULL);//初始化条件变量
pthread_cond_init(&b->notfull, NULL);//初始化条件变量
b->readpos = 0;//读指针为0
b->writepos = 0;//写指针为0
}
/*
************************************************************************************************************************
**函数原型 : void * producer(void * data)
**参数说明 : 传递的参数由创建函数给出
**返回 值 : NULL
**创 建 人:
**最后修改日期: 2006年1月19日
**描 述: 线程函数写入公共缓冲区数据
************************************************************************************************************************
*/
static void * producer(void * data)
{
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
printf("error in socket\n");
exit(1);
}
else
{
printf("socket ok!\n");
}
//填写服务器的套接字(本机)
if((hp=gethostbyname("localhost"))==NULL)
printf("err gethostbyname\n");
bcopy((char *) hp->h_addr,(char *) &my_addr.sin_addr,hp->h_length);
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(IPPORT_USERRESERVED+RECEIVER_PORT);
printf("receive from port %d\n",my_addr.sin_port);
bzero(&(my_addr.sin_zero),8);
//绑定监听套接字
ret=bind(sockfd,(struct sockaddr *)&my_addr,sizeof( my_addr));
if(ret<0)
{
printf("error in binding\n");
exit(1);
}
else
{
printf("bind ok!\n");
}
//监听连接请求
ret=listen(sockfd,BACKLOG);
if(ret<0){
printf("error in listening");
exit(1);
}
else
{
printf("listen ok!\n");
}
//设置select()有关参数
maxfd=sockfd;
maxi=-1;
for(i=0;i<MAXSELECT;i++)
{
client[i]=-1;
}
FD_ZERO(&allset);
FD_SET(sockfd,&allset);
while(1)
{
rset=allset;
//选择,nready记录可读的文件个数
nready=select(maxfd+1,&rset,NULL,NULL,NULL);
//处理来自监听套接字的请求]
if(FD_ISSET(sockfd,&rset))
{
printf("sockfd %d\n",sockfd);
//建立新的连接
sin_size=sizeof(struct sockaddr_in);
con_fd=accept(sockfd,(struct sockaddr *)&their_addr,&sin_size);
if(con_fd<0)
{
printf("error in accept");
continue;
}
for(i=0;i<MAXSELECT;i++)
{
//如果已经到达规定的select处理的上限,就不监听该端口
if(i==MAXSELECT)
{
printf("too manyclients");
continue;
}
//更新select有关参数
FD_SET(con_fd,&allset);
if(con_fd>maxfd) maxfd=con_fd;
if(i>maxi) maxi=i;
//如果所有的描述符都已处理,进入下一次循环
if(--nready<0) continue;
//把新的连接描述符插入到client数组中的适当位置
if(client[i]<0)
{
client[i]=con_fd;
printf("client[i]= %d, i= %d\n",client[i],i );
break;
}
}
}
//处理来自连接套接字的事件
for(i=0;i<maxi+1;i++)
{
//如果套接字不存在则处理下一个套接字
if((sock=client[i])<0)
{
continue;
}
//printf("sock= %d,client[i]= %d,i= %d\n",sock,client[i],i);
//如果存在,检查是否有来自该套接字的请求,并处理
if(FD_ISSET(sock,&rset))
{
if(recv(sock,recvs,MAXSIZE,0)==0)
{
close(sock);
FD_CLR(sock,&allset);
client[i]=-1;
}
else
{
//数据处理代码
put(&buffer,recvs);
printf("收到的数据是:%s\n",recvs);
send(client[i],"年已经过了!",12,0);
}
//如果描述符未处理,进入下一次循环
// if(--nready<=0) break;
}
/* else
{
printf("FD_ISSET\n");
}*/
}
}
close(sockfd);
exit(0);
}
/*
************************************************************************************************************************
**函数原型 : void put(struct prodcons * b, int data)
**参数说明 : prodcons:自定义结构变量,包含互斥量等 ,data:写入的数据
**返回 值 :
**创 建 人:
**最后修改日期: 2006年1月19日
**描 述: 往公共缓冲区写入一个整型数据
************************************************************************************************************************
*/
static void put(struct prodcons * b, char * data)
{
pthread_mutex_lock(&b->lock);//取得互斥量
while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) {
printf("wait for not full\n");
pthread_cond_wait(&b->notfull, &b->lock);//缓冲区不满则跳出否则等待
}
b->buffer[b->writepos] = data;//写数据
b->writepos++;
if (b->writepos >= BUFFER_SIZE) b->writepos = 0;
pthread_cond_signal(&b->notempty);//设置条件
pthread_mutex_unlock(&b->lock);//解锁
}
/*
************************************************************************************************************************
**函数原型 : static get(struct prodcons * b)
**参数说明 : prodcons:自定义结构变量,包含互斥量等
**返回 值 : 读出的整型数据
**创 建 人:
**最后修改日期: 2006年1月19日
**描 述: 从公共缓冲区读出一个整型数据
************************************************************************************************************************
*/
static char * get(struct prodcons * b)
{
char * data;
pthread_mutex_lock(&b->lock);//取得互斥量
while (b->writepos == b->readpos) {
printf("wait for not empty\n");
pthread_cond_wait(&b->notempty, &b->lock);//缓冲区不空则跳出否则等待条件
}
data = b->buffer[b->readpos];
b->readpos++;
if (b->readpos >= BUFFER_SIZE) b->readpos = 0;
pthread_cond_signal(&b->notfull);//设置条件
pthread_mutex_unlock(&b->lock);//解锁
return data;
}
#ifndef _LITE_VERSION
#include <minigui/dti.c>
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -