📄 main.cpp
字号:
picctrl.blplaying=true; picctrl.blpausing=false; mainwindow->repaint(); sem_post(&gsem); break; } case PICPAUSEPLAY: { printf("paused\n"); sem_wait(&gsem); picctrl.blpausing=true; picctrl.blplaying=true; mainwindow->repaint(); sem_post(&gsem); break; } case PICSTOPPLAY: { sem_wait(&gsem); printf("stop\n"); picctrl.blplaying=false; picctrl.blpausing=false; picctrl.threadid=0; sem_post(&gsem); mainwindow->ResetPaint(); pthread_exit(NULL); break; } case PICNEXT: { goto _playnext; } case PICPREVIOUS: { if(historyindex>=0) { sem_wait(&gsem); picctrl.inumber=historyarr[historyindex]; sem_post(&gsem); } historyindex--; goto _autoplay; } } } usleep(10000);//100 ms }_playnext: if(historyindex<90) historyarr[++historyindex]=picctrl.inumber; sem_wait(&gsem); if(pbody->iNextPic==-1) picctrl.inumber++; else picctrl.inumber=pbody->iNextPic; if(picctrl.inumber>picctrl.ipiccount) picctrl.inumber=0; sem_post(&gsem); goto _autoplay; } case 1://hand {_handplay: memset(chbmpname,0,20); pbody=ppicbodyarr[picctrl.inumber]; //printf("***************************************************************\n"); sprintf(chbmpname,"%d.bmp",picctrl.inumber); //printf("current bmp :%s\n",chbmpname); mainwindow->ShowPic(chbmpname,pbody->iMoveinType); printf("read cmd from pipe............\n"); retid=msgrcv(msglistid,&msg,50,0,0); chcmd=msg.msgtype; printf("recv ret:%d\n",retid); if(retid==0) { printf("recv cmd:%d\n",chcmd); switch(chcmd) { case PICSTOPPLAY: { sem_wait(&gsem); printf("stop\n"); picctrl.blplaying=false; picctrl.blpausing=false; picctrl.threadid=0; sem_post(&gsem); mainwindow->ResetPaint(); pthread_exit(NULL); break; } case PICNEXT: { printf("picnext\n"); sem_wait(&gsem); historyarr[++historyindex]=picctrl.inumber; if(pbody->iNextPic==-1) picctrl.inumber++; else picctrl.inumber=pbody->iNextPic; if(picctrl.inumber>picctrl.ipiccount) picctrl.inumber=0; sem_post(&gsem); break; } case PICPREVIOUS: { printf("picprevious\n"); if(historyindex>=0) { sem_wait(&gsem); picctrl.inumber=historyarr[historyindex]; sem_post(&gsem); } historyindex--; break; } }//switch } goto _handplay; } } _error: picctrl.blplaying=false; picctrl.blpausing=false; picctrl.threadid=0; mainwindow->repaint(); return NULL;}void * BeginServer(void* pparam){ int sock=socket(AF_INET,SOCK_STREAM,0); if(sock==-1) { printf("create sock error\n"); return NULL; } struct sockaddr_in addr; memset(&addr,0,sizeof(struct sockaddr_in)); addr.sin_addr.s_addr = INADDR_ANY; addr.sin_family=AF_INET; addr.sin_port=htons(7069); if(bind(sock,(struct sockaddr*)&addr,sizeof(struct sockaddr))==-1) { printf("bind error\n"); return NULL; } if(listen(sock,10)==-1) { printf("listen error\n"); return NULL; } int clientsock; printf("beign listen socket\n"); for(;;) { if(clientsock=accept(sock,NULL,0)) { printf("accept client:%d\n",clientsock); //mainwindow->showpic("/usr/bin/1.bmp"); pthread_t clientthread; printf("Lock online state\n"); sem_wait(&gsemonline); printf("locked\n"); pthread_create(&clientthread,NULL,&ClientServerThread,&clientsock); onlineusrcount++; printf("waiting unlocking\n"); sem_post(&gsemonline); printf("unlocked\n"); sleep(1); } } close(sock); return NULL;}void ClearPipeBuff(){ message msg; while(msgrcv(msglistid,&msg,0,0,IPC_NOWAIT)>=0) ;}void WritePicManageCmd(long cmd){ ClearPipeBuff(); message msg; msg.msgtype=cmd; if(picctrl.threadid) { if(msgsnd(msglistid,&msg,0,0)<0) printf("msg send error\n"); else printf("cmd send\n"); }}void ClosePicManageThread(){ sem_wait(&gsem); WritePicManageCmd(PICSTOPPLAY); sem_post(&gsem); printf("write cmd end\n");}int parselabels(){ printf("parse lables\n"); sem_wait(&gsemlabel); PICLABELLIST* q; while(listhead) { q=listhead->next; delete listhead; listhead=q; } listhead=NULL; FILE* pfile=fopen("labels.set","r+b"); if(!pfile) { sem_post(&gsemlabel); return 0; } PICLABEL psl; PICLABELLIST* ptemp=NULL; q=NULL; while(fread(&psl,1,sizeof(PICLABEL),pfile)==sizeof(PICLABEL)) { ptemp=new(PICLABELLIST); memcpy(&ptemp->piclabel,&psl,sizeof(psl)); if(!listhead) listhead=ptemp; if(q) q->next=ptemp; q=ptemp; q->next=NULL; } q=listhead; while(q) { printf("caption:%s\n",q->piclabel.chtitle); q=q->next; } sem_post(&gsemlabel); printf("beign to repaint\n"); mainwindow->repaint(); return 1;}int recvlabels(int sock,int ilen){ ACKCMD ack; char* buff=new char[ilen]; memset(buff,0,ilen); printf("Labels recv len:%d",ilen); int irecv=0; char* ptemp=buff; while(irecv<ilen) { int inow=0; if((inow=recv(sock,ptemp,ilen-irecv,0))<0) { delete buff; return -1; } irecv+=inow; ptemp+=inow; } printf("recvd file\n"); FILE* pfile=fopen("labels.set","w+b"); fwrite(buff,1,ilen,pfile); fclose(pfile); delete buff; memset(&ack,0,sizeof(ACKCMD)); //ack.cmdtype=PICSETLABEL; if(send(sock,&ack,sizeof(ACKCMD),0)<0) { return -1; } parselabels(); return 1;}void* ClientServerThread(void* pparam){ int sock=*(int*)pparam; printf("clientsock:%d",sock); REQCMD reqcmd; ACKCMD ackcmd; PICPARAM picparam; int fdfifo; int chcmd; struct timeval timeout; timeout.tv_sec=60; timeout.tv_usec=0; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)); setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)); while(1) { memset(&reqcmd,0,sizeof(reqcmd)); if (recv(sock,&reqcmd,sizeof(reqcmd),0)!=sizeof(reqcmd)) { printf("recv error\n"); goto _error; } switch(reqcmd.cmdtype) { case PICSETLABEL: printf("begin recv labels\n"); if(recvlabels(sock,reqcmd.nextdatalen)<0) gotoerror("recv labels info error\n"); break; case PICSWITCHLBL: gShowLbl=reqcmd.nextdatalen; printf("switch show label :%d\n",gShowLbl); if(sendfail(sock,&ackcmd,sizeof(ACKCMD))) gotoerror("send ack error:picbeginplay\n"); mainwindow->repaint(); break; case PICCAPTURE: sem_wait(&gsem); memset(&picparam,0,sizeof(picparam)); if(picctrl.blhasfile) picparam.iState=1; if(picctrl.blplaying) { picparam.iState|=0x0100; if(picctrl.blpausing) picparam.iState|=0x010000; picparam.iReserved=picctrl.iplaytype; strcpy(picparam.chTitle,((PICBODY*)ppicbodyarr[picctrl.inumber])->chTitle); } picparam.iReserved|= (gShowLbl<<8); //printf("picctrl pos:%d,%d\n",picctrl.iposx,picctrl.iposy); picparam.ipos=picctrl.iposx<<16|picctrl.iposy; picctrl.iposx=0; picctrl.iposy=0; sem_post(&gsem); //printf("picparam pos:%d\n",picparam.ipos); if(sendfail(sock,&picparam,sizeof(picparam))) gotoerror("send info error\n"); //printf("send pic param:%x\n",picparam.iState); break; case PICSETPIC: printf("recv command setpic\n"); ClosePicManageThread(); sem_wait(&gsem); mainwindow->SetStateStr("receiving pictures...."); picctrl.blhasfile=false; if(recvprj(sock,reqcmd.nextdatalen)==-1) { sem_post(&gsem); gotoerror("recv prj error\n"); } mainwindow->SetStateStr(""); sem_post(&gsem); break; case PICBEGINPLAY: sem_wait(&gsem); if(!picctrl.threadid) { pthread_create(&picctrl.threadid,NULL,PicManageThread,NULL); ClearPipeBuff(); sleep(1); } else{ WritePicManageCmd(reqcmd.cmdtype); } sem_post(&gsem); memset(&ackcmd,0,sizeof(ACKCMD)); if(sendfail(sock,&ackcmd,sizeof(ACKCMD))) gotoerror("send ack error:picbeginplay\n"); break; case PICSTOPPLAY: case PICPAUSEPLAY: case PICNEXT: case PICPREVIOUS: sem_wait(&gsem); WritePicManageCmd(reqcmd.cmdtype); sem_post(&gsem); printf("write cmd end\n"); memset(&ackcmd,0,sizeof(ACKCMD)); if(sendfail(sock,&ackcmd,sizeof(ACKCMD))) gotoerror("send ack error:picpauseplay or stop\n"); break; } }_error: printf("************************************************************************\n"); printf("sock closed\n,Lock Onlline\n"); sem_wait(&gsemonline); printf("online Locked\n"); onlineusrcount--; printf("left online usr count:%d\n",onlineusrcount); if (!onlineusrcount) { historyindex=-1; //the fun closepicmanage will lock gsem ClosePicManageThread(); //printf("kill retid:%d\n",pthread_kill(picctrl.threadid,0)); } sem_post(&gsemonline); printf("online unlicked\n"); return NULL;}void GetLocalIP(){ struct ifreq buf; int fd; fd=socket(AF_INET, SOCK_DGRAM, 0); strcpy(buf.ifr_name, "eth0"); if (ioctl(fd, SIOCGIFADDR, &buf)<0) { perror("error"); close(fd); return; } sprintf(localip,"%u.%u.%u.%u", (u_char)buf.ifr_addr.sa_data[2], (u_char)buf.ifr_addr.sa_data[3], (u_char)buf.ifr_addr.sa_data[4], (u_char)buf.ifr_addr.sa_data[5]); printf(localip); close(fd); return;}int main(int argc,char** argv){ //create pipe //test codec //QTextCodec *mycode=NULL; //for(int i=0;(mycode=QTextCodec::codecForIndex(i));i++) //{ // printf("code:%d,%s\n",i,mycode->name()); //getchar(); //} //return 0; // printf("version:1.005\n"); GetLocalIP(); if((msglistid=msgget(2312,IPC_CREAT|0777))==-1) printf("msg list create error\n"); //printf("msg list id:%d\n",msglistid); sem_init(&gsem,0,0); sem_init(&gsemonline,0,0); sem_init(&gsemlabel,0,0); sem_post(&gsem); sem_post(&gsemonline); sem_post(&gsemlabel); ParsePrj(prjfilename); QApplication a(argc,argv); printf("code locale:%s\n",QTextCodec::codecForLocale()->name()); QTextCodec *my_codec = QTextCodec::codecForName("GBK"); printf(my_codec->name()); //qWarning(a.font().family()); //getchar(); //QFont font("unifont"); //a.setFont(font); //qWarning(a.font().family()); //getchar(); //QFont font("unifont",16,50,FALSE,QFont::Unicode); //qApp->setFont(font); //a.setFont(QFont("cour", 16, QFont::Normal)); //QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); //QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); mainwindow=new CMyMainWnd(); a.setMainWidget(mainwindow); //MessageBox("社会"); parselabels(); mainwindow->show(); pthread_t serverthread,udpthread; pthread_create(&serverthread,NULL,&BeginServer,NULL); pthread_create(&udpthread,NULL,&udpclient,NULL); a.exec(); pthread_join(serverthread,NULL); delete mainwindow; sem_destroy(&gsem); sem_destroy(&gsemonline); msgctl(msglistid,IPC_RMID,NULL)<0; return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -