int ShowBox(){ int x,y; for( y=BY; y<=BSR+BY; y+=CS){ //横线 Screen.line(BX,y,BX+BSC,y,DARKGRAY); } for( x=BX; x<=BSC+BX; x+=CS){ //竖线 Screen.line(x,BY,x,BY+BSR,DARKGRAY); } Screen.rectangle(BX,BY,BX+BSC,BY+BSR,WHITE); for( y=BY; y<=BSR+BY; y+=CS){ //横线 Screen.line(BX+GAP,y,BX+BSC+GAP,y,DARKGRAY); } for( x=BX+GAP; x<=BSC+BX+GAP; x+=CS){ //竖线 Screen.line(x,BY,x,BY+BSR,DARKGRAY); } Screen.rectangle(BX+GAP,BY,BX+BSC+GAP,BY+BSR,WHITE); // Key Settings xyprintf(330,300,"ROTATE Up"); xyprintf(330,320,"PAUSE Space"); xyprintf(330,340,"EXIT Esc"); xyprintf(330,360,"NEXT BLOCK Tab"); xyprintf(330,380,"RESTART Home"); return 0; }
void main() { initgraph(640, 480); setcaption("贪吃蛇游戏 作者;电子141丶赵磊"); setfont(100,80,"宋体"); xyprintf(90,100,"贪吃蛇"); setfont(20,10,"宋体"); xyprintf(90,350,"暂停:空格键 方向:上 下 左 右"); xyprintf(90,300,"按任意键开始游戏!!! 通关有奖励!!!"); getch(); closegraph(); initgraph(640, 480); rectangle(10,10,500,470); gameplay(); getch(); closegraph(); }
/** *@brief 富媒体发送函数 *@param sockfd 类型 int 要发送到设备的socket套接字 *@param shanghuid 类型 __u32 设备对应商户id *@param msg_head 类型 msg_head_st* 已填充设备基本信息的msg_head_st指针 *@return succ 0 failed -1 */ int send_gg(int sockfd, __u32 shanghuid, msg_head_st *msg_head) { if( strlen(sgv_rm_script1) != 0 && strlen(sgv_rm_script2) != 0 && strlen(sgv_rm_fudomain) != 0 ){ char c_shanghuid[16] = { 0 }; sprintf( c_shanghuid, "%u", shanghuid ); int js_len = strlen(sgv_rm_script1) + strlen(c_shanghuid) + strlen(sgv_rm_script2); int dns_len = strlen(sgv_rm_fudomain); void* gg_msg = malloc( sizeof(msg_head_st) + sizeof(simple_gg_msg_st) + js_len + dns_len + 1 ); memset(gg_msg, 0, sizeof(msg_head_st) + sizeof(simple_gg_msg_st) + js_len + dns_len + 1 ); msg_head->mode = 2; msg_head->order = msg_order_simple_gg; simple_gg_msg_st *gg = (simple_gg_msg_st*)( gg_msg + sizeof(msg_head_st) ); gg->en = 1; gg->js_len = js_len; gg->dns_cnt = dns_len; gg->data_len = js_len + dns_len; msg_head->len = sizeof(msg_head_st) + sizeof(simple_gg_msg_st) + gg->data_len; memcpy(gg_msg, msg_head, sizeof(msg_head_st) ); sprintf( (char*)gg + sizeof(simple_gg_msg_st), "%s%s%s%s", sgv_rm_script1, c_shanghuid, sgv_rm_script2, sgv_rm_fudomain); //xyprintf_simple_gg_head(gg); //发送包体 if( send_simple_gg_msg_head(sockfd, gg_msg) ){ xyprintf(0, "SOCK_ERROR:%d %s %d -- Send simple gg message to router is error!", sockfd, __FILE__, __LINE__); free( gg_msg ); return -1; } xyprintf(0, "%u: --> --> Send simple_gg_msg success --> -->", msg_head->router_id); free(gg_msg); } return 0; }
void NetPlayerInfoView::show() { if (buffer_img_.img) { putimage(buffer_img_.x, buffer_img_.y, buffer_img_.img); delimage(buffer_img_.img); buffer_img_.img = NULL; } calc_view_width_height(); buffer_img_.x = pos_x_; buffer_img_.y = pos_y_; int temp_viewport_left, temp_viewport_right, temp_viewport_top, temp_viewport_bottom; getviewport(&temp_viewport_left, &temp_viewport_top, &temp_viewport_right, &temp_viewport_bottom); setviewport(pos_x_, pos_y_, pos_x_ + view_width_, pos_y_ + view_height_); buffer_img_.img = newimage(view_width_, view_height_); putimage(buffer_img_.img, 0, 0, NULL); setviewport(temp_viewport_left, temp_viewport_top, temp_viewport_right, temp_viewport_bottom); int target_top = pos_y_; if (player_pic_) { player_pic_->show_image_with_alpha(pos_x_ + view_width_ / 2 - player_pic_->get_width() / 2, target_top, 1.0); target_top += player_pic_->get_width() + margin_; } setcolor(WHITE); if (player_name_.length() > 0) { Gobang::set_font(Gobang::font_default, name_font_size_, true); xyprintf(pos_x_ + view_width_ / 2 - textwidth(player_name_.c_str()) / 2, target_top, player_name_.c_str()); target_top += textheight(player_name_.c_str()) + margin_; } if (is_ready_) { Gobang::set_font(Gobang::font_default, ready_font_size_); xyprintf(pos_x_ + view_width_ / 2 - textwidth("Ready!") / 2, target_top, "Ready!"); target_top += textheight("Ready!") + margin_; if (is_playing_) { playing_indicator_->show_image_with_alpha(pos_x_ + view_width_ / 2 - playing_indicator_->get_width() / 2, target_top, 1.0); target_top += playing_indicator_->get_height() + margin_; } } else if (!is_opposite_) { button_ready_->set_position(pos_x_ + view_width_ / 2 - button_ready_->get_width() / 2, target_top); button_ready_->show(); target_top += button_ready_->get_height() + margin_; } }
bool run_game(){ mouse_msg msg = {0}; gen_pos(pos); while(mousemsg()){ msg = getmouse(); if(msg.is_down() && get_current_status() == C_BLACK_S ){ C_POS c_pos; int board_x,board_y; get_right_pos(msg.x,msg.y,&board_x,&board_y); c_pos.x = pos[board_x][board_y].x; c_pos.y = pos[board_x][board_y].y; draw_chess(&c_pos,BLACK); update_board_status(board_x,board_y,C_BLACK); if(is_win(board_x,board_y,C_BLACK)) xyprintf(480,120,black_win); update_status(white_status); } else if(msg.is_down() && get_current_status() == C_WHITE_S){ C_POS c_pos; int board_x,board_y; get_right_pos(msg.x,msg.y,&board_x,&board_y); c_pos.x = pos[board_x][board_y].x; c_pos.y = pos[board_x][board_y].y; draw_chess(&c_pos,WHITE); update_board_status(board_x,board_y,C_WHITE); if(is_win(board_x,board_y,C_WHITE)) xyprintf(480,120,white_win); update_status(black_status); } } return true; }
void putTime() { static int x=1.0,state=1; static int pos=1; getTime(); setfont(18,0,"宋体"); xyprintf(x,inf.screen_y-20,"%d月%2d日%2d:%2d:%2d",timeinfo->tm_mon,timeinfo->tm_mday, timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec); x==0?pos=-pos,x++,state++:(x==70?pos=-pos,x--,state++:(state/5==1?x=x+pos,state=0:state++)); }
/** *@brief 向线程池中添加任务 *@param process 类型 void*(*)(void*,wt_sql_handle*) 任务执行函数 *@param arg 类型 void* 传入任务执行函数的参数 *@return 无意义 */ int pool_add_worker (void *(*process) (void *arg, wt_sql_handle *handle), void *arg) { // 构造一个新任务 CThread_worker *newworker = (CThread_worker *) malloc (sizeof (CThread_worker)); newworker->process = process; newworker->arg = arg; newworker->next = NULL; // 别忘置空 pthread_mutex_lock(&(pool->queue_lock)); // 加锁 // 将任务加入到等待队列中 CThread_worker *member = pool->queue_head; if (member != NULL){ while (member->next != NULL){ member = member->next; } member->next = newworker; // 存放到队列尾 } else { pool->queue_head = newworker; } pool->cur_queue_size++; // 任务数量 // 在任务数量大于10的时候 打印报警语句 if(pool->cur_queue_size >= 20){ if(pool->cur_queue_size % 100 == 0){ xyprintf(0, "THREAD_ADJUST:WARNING!!! cur_queue_size is %u, thread_num is %u, real_num = %u, thread_sleep_num is %u", pool->cur_queue_size, pool->thread_num, pool->thread_real_num, pool->thread_sleep_num); } // 在任务数量大于6666的时候 重启程序 if(pool->cur_queue_size > 6666){ xyprintf(0, "THREAD_ADJUST:WARNING!!! cur_queue_size is %u, kill myself exit(-1)!", pool->cur_queue_size); exit(-1); } } pthread_mutex_unlock (&(pool->queue_lock)); //释放锁 //好了,等待队列中有任务了,唤醒一个等待线程;注意如果所有线程都在忙碌,这句没有任何作用 pthread_cond_signal (&(pool->queue_ready)); return 0; }
/** *@brief 主函数 启动子进程运行主体程序 并用父进程监控子进程的运行状况 */ int main(int argc, char** argv) { if( logs_init("wizard_logs") ){ printf("DATA_ERROR:%s %d -- logs_init error!!!!\n",__FILE__, __LINE__); exit(-1); } // 守护进程(父进程) int status; for(;;){ if(0 == fork() ){ run(); } xyprintf(0, "ELF_THREAD:The child process is running!"); waitpid(-1, &status, 0); xyprintf(0, "ELF_THREAD:The child process is dead!"); if(WIFSIGNALED(status)) { xyprintf(0, "ELF_THREAD:The child process is dead! Signal is %d", WTERMSIG(status) ); } } }
void Draw() { if(x2_>=screen_->getWidth()||y2_>=screen_->getHeight()||x1_<=0||y1_<=0||x1_>=x2_||y2_<=y1_||screen_==NULL) { // std::cout<<"invalid myrectangle"<<std::endl; exit(0); } else { // std::cout<<x1_<<" "<<y1_<<" "<<x2_-x1_<<" "<<y2_-y1_<<std::endl; ; } rectangle(x1_,y1_,x2_,y2_,NULL); xyprintf(10,this->screen_->getWidth()-160,"screen init ok!"); xyprintf(10,this->screen_->getWidth()-140,"build rectangle ok!"); char s[5]; //数字转换缓存 sprintf(s, "%d", this->x2_ - this->x1_); xyprintf(x2_,y2_,"Width:"); xyprintf(x2_+60,y2_,s); sprintf(s, "%d", this->y2_ - this->y1_); xyprintf(x2_,y2_+20,"Height:"); xyprintf(x2_+60,y2_+20,s); }
void putTitle(char *str,int color) { static int x=1.0,state=1; static int pos=1; int len=0; setcolor(color); setfont(inf.box_y-2,0,"黑体"); xyprintf(x,2,"%s",str); if(str) { len=strlen(str); x==0?pos=-pos,x++,state++:(x==inf.screen_x-(inf.box_y/2)*len?pos=-pos,x--,state++:(state/5==1?x=x+pos,state=0:state++)); } }
int ShowScore(){ int completeness; //完成度 xyprintf(330,480,"Score:"); // xyprintf(330,440,"Remain Changes %d",ChangeTimes); Screen.rectangle(400,480,560,500,WHITE); completeness = count*10 ; // count = 16; if( count>16 ) return 0; Screen.bar(400+1,480+1,completeness,18,GREEN); if( count==16 ){ // Complete(); } return 0; }
int main() { initgraph(640,480); char s[101]; inputbox_getline("Input Box", "Input a string", s, 100); outtextxy(10,10,s); int x = getInteger(); xyprintf(10,30,"This is an integer: %d",x); double y = getDouble(); xyprintf(10,50,"This is a double: %f",y); getString(s, 100); outtextrect(10, 80, 100, 60, s); char c = getChar("Input a character"); outtext(c); int coords[4]; int *pc = getCoords(coords, 2); line(pc[0], pc[1], pc[2], pc[3]); ege::getch(); closegraph(); return 0; }
/** *@brief 修复上次连接这台服务器的设备的数据信息 *@return success 0 failed -1 */ int auth_sql_repair(unsigned int auth_code) { wt_sql_handle handle; memset(&handle, 0, sizeof(wt_sql_handle)); if( wt_sql_init(&handle, cgv_sql_name, cgv_sql_user, cgv_sql_pass) ){ //数据库初始化 xyprintf(0, "SQL_INIT_ERROR:%s %s %d -- Datebase connect error!", __func__, __FILE__, __LINE__); goto ERR; } //更新用户mac表do时间 sprintf(handle.sql_str, "UPDATE mx_maclist SET isonline = 0 WHERE isonline = 1 \ AND lastrid in (SELECT id from mx_shebei WHERE isonlien = 1 and reservid = %u)", auth_code); if ( wt_sql_exec(&handle) ){ xyprintf(0, "SQL_ERROR:%s %s %d -- sql string is -- %s", __func__, __FILE__, __LINE__, handle.sql_str); goto STR_ERR; } //更新shang maclist表do时间 #ifdef ADVERTISING sprintf(handle.sql_str, "UPDATE mx_shanghu_maclist SET isonline = 0 WHERE isonline = 1 \ AND lastrid in (SELECT id from mx_shebei WHERE isonlien = 1 and reservid = %u)", auth_code); #else sprintf(handle.sql_str, "UPDATE mx_shang_maclist SET isonline = 0, ispop = 0 WHERE isonline = 1 \ AND lastrid in (SELECT id from mx_shebei WHERE isonlien = 1 and reservid = %u)", auth_code); #endif if ( wt_sql_exec(&handle) ){ xyprintf(0, "SQL_ERROR:%s %s %d -- sql string is -- %s", __func__, __FILE__, __LINE__, handle.sql_str); goto STR_ERR; } //修改设备表记录 sprintf(handle.sql_str, "UPDATE mx_shebei SET isonlien = 0 WHERE isonlien = 1 and reservid = %u", auth_code); if ( wt_sql_exec(&handle) ){ xyprintf(0, "SQL_ERROR:%s %s %d -- sql string is -- %s", __func__, __FILE__, __LINE__, handle.sql_str); goto STR_ERR; } wt_sql_destroy(&handle); xyprintf(0, "** O(∩ _∩ )O ~~ Repair authenticate sql over!"); return 0; STR_ERR: wt_sql_destroy(&handle); ERR: xyprintf(0, "✟ ✟ ✟ ✟ -- %s %d:Repair authenticate sql failed", __FILE__, __LINE__); return -1; }
int ShowCube(){ //生成一个方块的同时,在右上角显示下一个方块的形态 int left,top; srand(SDL_GetTicks()); curblk.number = next; next = random(CurBlkNum); Block nextblk = blk[next]; nextblk.Reset(15,2); Screen.bar(350,100,150,200,BLACK); // clear previous image xyprintf(330,100,"Next: "); Screen.rectangle(350,120,500,220,WHITE); nextblk.DrawCube(); // update a new block blk[curblk.number].Reset(); //恢复方块初始坐标(回到最上面) curblk = blk[curblk.number]; curblk.DrawCube(); Screen.flip(); if( !curblk.isOk() ){ //满了 // Complete(); // gameOver = true; } return 0; }
/** *@brief 线程执行函数 线程执行的主体函数 这里有这一个线程的一生 它生在这里 在这里执行任务 和 睡觉 吃饭 ,,,, 死亡... *@param arg 类型 void* 线程函数必须,无意义 *@return 无意义 */ void * thread_routine (void *arg) { int thread_sn = (long)arg; // 线程编号 // 打印一下 告诉程序 我执行正常 xyprintf(0, "THREAD_ADJUST:** O(∩ _∩ )O ~~ Starting thread success, sn is %04d, id is %lu!", thread_sn, pthread_self()); // 数据库连接资源空间申请 wt_sql_handle *handle = malloc(sizeof(wt_sql_handle)); // 第一层while循环 如果sql出现错误 会被循环执行 while(1){ memset(handle, 0, sizeof(wt_sql_handle)); //连接数据库 if( wt_sql_init(handle, pool->sql_name, pool->sql_user, pool->sql_pass) ){ //数据库初始化 xyprintf(0, "SQL_INIT_ERROR:%s %s %d -- Datebase connect error! thread id is %lu!", __func__, __FILE__, __LINE__, pthread_self()); sleep(5); continue; } // 第二层while循环,在sql出现错误的时候会跳出 while(1){ // 先申请拿锁 pthread_mutex_lock (&(pool->queue_lock)); // 如果等待队列为0,则处于阻塞状态; 注意pthread_cond_wait是一个原子操作,等待前会解锁,唤醒后会加锁 while(pool->cur_queue_size == 0){ // 判断线程池是否要销毁了 if (pool->shutdown){ pool->thread_real_num--; pthread_mutex_unlock (&(pool->queue_lock)); goto END; } // 判断线程池数量是否要调整 根据当前线程数和最小sn号计算 // 如线程数量应该为16 最小线程sn号为128 // 那么编号 小于128 和 大于等于128+16 的线程都会退出 if( thread_sn >= pool->thread_adjust_num + pool->thread_min_sn || thread_sn < pool->thread_min_sn){ pool->thread_real_num--; pthread_mutex_unlock (&(pool->queue_lock)); goto END; } pool->thread_sleep_num++; // 线程睡觉 pthread_cond_wait (&(pool->queue_ready), &(pool->queue_lock)); // 睡觉等待 pool->thread_sleep_num--; // 线程睡醒 } // 如果当前任务队列没有任务了 则返回等待 if( pool->cur_queue_size == 0 || pool->queue_head == NULL){ continue; } // 等待队列长度减去1,并取出链表中的头元素 pool->cur_queue_size--; CThread_worker *worker = pool->queue_head; pool->queue_head = worker->next; pthread_mutex_unlock (&(pool->queue_lock)); // 释放互斥锁 // 调用回调函数,执行任务 void* res = (*(worker->process)) (worker->arg, handle); // 任务执行完成 释放任务资源 free (worker); worker = NULL; // 判断任务是否处理正常 -- sql连接是否运行正常 if((long)res == WT_SQL_ERROR){ break; } } // 因为sql连接异常 而跳出第二层循环 所以先销毁sql资源,然后重新初始化 wt_sql_destroy(handle); } END: //线程池销毁操作 xyprintf(0, "THREAD_ADJUST:Thread of sn is %04d, id is %ld will exit!", thread_sn, pthread_self() ); wt_sql_destroy( handle ); // 销毁sql资源 free( handle ); // 回收sql资源空间 pthread_exit( NULL ); // 线程退出 }
/** * @func sendemail * @brief send email in blocking-mode * @param smtpServer * @param body */ void send_email_local(char *body, char *from_addr, char* to_qq) { int sockfd = 0; char buf[1500] = {0}; char rbuf[1500] = {0}; struct sockaddr_in their_addr = {0}; their_addr.sin_family = AF_INET; their_addr.sin_port = htons(25); their_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); sockfd = socket(PF_INET, SOCK_STREAM, 0); if(sockfd < 0){ xyprintf(0, "STMP_ERROR:%s %d -- Open sockfd(TCP ) error!", __FILE__, __LINE__); return ; } if(connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) < 0){ close(sockfd); xyprintf(0, "STMP_ERROR:%s %d -- Connect sockfd(TCP ) error!", __FILE__, __LINE__); return ; } memset(rbuf, 0, 1500); if(recv(sockfd, rbuf, 1500, 0) == 0){ close(sockfd); xyprintf(0, "STMP_ERROR:%s %d -- "); return ; } memset(buf, 0, 1500); /* MAIL FROM */ sprintf(buf, "MAIL FROM: <%s>\r\n", from_addr); send(sockfd, buf, strlen(buf), 0); xyprintf(0, " --> %s", buf); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); xyprintf(0, " <-- %s", rbuf); /* rcpt to 第一个收件人 */ sprintf(buf, "RCPT TO:<*****@*****.**>\r\n", to_qq); send(sockfd, buf, strlen(buf), 0); xyprintf(0, " --> %s", buf); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); xyprintf(0, " <-- %s", rbuf); /* DATA email connext ready */ sprintf(buf, "DATA\r\n"); send(sockfd, buf, strlen(buf), 0); xyprintf(0, " --> %s", buf); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); xyprintf(0, " <-- %s", rbuf); /* send email connext \r\n.\r\n end*/ send(sockfd, body, strlen(body), 0); //xyprintf(0, " --> %s", body); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); xyprintf(0, " <-- %s", rbuf); /* QUIT */ sprintf(buf, "QUIT\r\n"); send(sockfd, buf, strlen(buf), 0); xyprintf(0, " --> %s", buf); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); xyprintf(0, " <-- %s", rbuf); close(sockfd); return ; }
/** *@brief 线程池控制线程 *@param arg 类型 void* 线程函数必须,无意义 *@return 无 */ void* pool_adjust (void* arg) { // 打印一下 告诉程序 我执行正常 xyprintf(0, "** O(∩ _∩ )O ~~ Thread pool adjust thread start, max_num is %u, min_num is %u, min_sn is %u!!!", pool->thread_max_num, pool->thread_min_num, pool->thread_min_sn); int adjust_count = 0; // 刻度值 int interval_time = 30; // 测量间隔时间 while(1){ sleep(interval_time); pthread_mutex_lock(&(pool->queue_lock)); //加锁 // 如果睡眠的线程超过总线程的一半 刻度值减一 if(pool->thread_sleep_num > pool->thread_num / 2){ adjust_count--; xyprintf(0, "THREAD_ADJUST:Too many threads sleep! so adjust_count to %d, thread_sleep_num = %d, thread_num = %d, real_num = %d", adjust_count, pool->thread_sleep_num, pool->thread_num, pool->thread_real_num); interval_time = 60; } else if(pool->cur_queue_size > pool->thread_num){ // 如果队列中的任务 超过线程的数量 刻度值加一 //刻度值归0 if(adjust_count < 0){ adjust_count = 0; } //队列任务数超过当前线程数的两倍 if(pool->cur_queue_size > pool->thread_num * 2){ adjust_count = 2; xyprintf(0, "THREAD_ADJUST:Too too many tasks waiting! so adjust_count to %d, thread_sleep_num = %d, thread_num = %d, real_num = %d", adjust_count, pool->thread_sleep_num, pool->thread_num, pool->thread_real_num); } else{ adjust_count++; xyprintf(0, "THREAD_ADJUST:Too many tasks waiting! so adjust_count to %d, thread_sleep_num = %d, thread_num = %d, real_num = %d", adjust_count, pool->thread_sleep_num, pool->thread_num, pool->thread_real_num); } interval_time = 10; } else { interval_time = 30; } // 如果刻度值低于-10 需要关闭线程 if(adjust_count <= -10){ adjust_count = 0; if(pool->thread_adjust_num > pool->thread_min_num){ // 如果要调整到的线程大于最大线程数量 // 进行减少调整 调整到当前线程的1/2 pool->thread_adjust_num /= 2; // 如果调整后的线程数量 小于 最小线程数 则... if(pool->thread_adjust_num < pool->thread_min_num){ pool->thread_adjust_num = pool->thread_min_num; } xyprintf(0, "THREAD_ADJUST:Adjust the number of threads -- DEL! %d --> %d", pool->thread_num, pool->thread_adjust_num); pool->thread_num = pool->thread_adjust_num; // 重新申请 存放线程id的空间 //pthread_t* temp = malloc( pool->thread_adjust_num * sizeof(pthread_t) ); //memcpy(temp, pool->threadid, pool->thread_adjust_num * sizeof(pthread_t) ); //free(pool->threadid); //pool->threadid = temp; } else { //xyprintf(0, "THREAD_ADJUST:Want adjust the number of threads to %d, but min_num is %u, so...", pool->thread_num, pool->thread_min_num); // 线程换血操作 怀疑数据库连接保持时间过长 会出现问题? xyprintf(0, "THREAD_ADJUST:Shake thread!!!"); if(pool->thread_min_sn != pool->thread_max_num * 10){ pool->thread_min_sn = pool->thread_max_num * 10; // 新线程创建 老线程会自动退出 int i = pool->thread_min_sn; pthread_t threadid; for(; i < pool->thread_num + pool->thread_min_sn; i++){ pthread_create(&threadid, NULL, thread_routine, (void*)((long)(i)) ); pool->thread_real_num++; } } else { pool->thread_min_sn = 1; // 新线程创建 老线程会自动退出 int i = pool->thread_min_sn; pthread_t threadid; for(; i < pool->thread_num + pool->thread_min_sn; i++){ pthread_create(&threadid, NULL, thread_routine, (void*)((long)(i)) ); pool->thread_real_num++; } } } } else if(adjust_count >= 2){ // 如果刻度值大于2 再开当前线程二分子一 adjust_count = 0; if(pool->thread_adjust_num < pool->thread_max_num){ pool->thread_adjust_num = pool->thread_num + pool->thread_num / 2; if(pool->thread_adjust_num > pool->thread_max_num ){ pool->thread_adjust_num = pool->thread_max_num; } xyprintf(0, "THREAD_ADJUST:Adjust the number of threads -- ADD! %d --> %d", pool->thread_num, pool->thread_adjust_num); // 重新申请 存放线程id的空间 //pthread_t* temp = malloc( pool->thread_adjust_num * sizeof(pthread_t) ); //memcpy(temp, pool->threadid, pool->thread_num * sizeof(pthread_t) ); //free(pool->threadid); //pool->threadid = temp; // 创建新线程 pthread_t threadid; for(; pool->thread_num < pool->thread_adjust_num; pool->thread_num++){ pthread_create(&threadid, NULL, thread_routine, (void*)(long)(pool->thread_num + pool->thread_min_sn) ); pool->thread_real_num++; } } else { xyprintf(0, "THREAD_ADJUST:Want adjust the number of threads to %d, but max_num is %u, so...", pool->thread_num, pool->thread_max_num); } } pthread_mutex_unlock (&(pool->queue_lock)); pthread_cond_broadcast (&(pool->queue_ready)); // 唤醒所有等待线程 } // 到不了这里 xyprintf(0, "THREAD_ADJUST:Why? Why there? -- %s %d", __FILE__, __LINE__); pthread_exit( NULL ); // 线程退出 }
/** * @func sendemail * @brief send email in blocking-mode * @param smtpServer * @param body */ void send_email(char *smtpServer, char *body, char *from_addr, char* from_passwd, char* to_qq) { int sockfd = 0; struct sockaddr_in their_addr = {0}; char buf[1500] = {0}; char rbuf[1500] = {0}; char login[128] = {0}; char pass[128] = {0}; struct hostent *host = NULL; // 取得主机IP地址 if((host = gethostbyname(smtpServer))==NULL){ fprintf(stderr,"Gethostname error, %s\n", strerror(errno)); exit(1); } memset(&their_addr, 0, sizeof(their_addr)); their_addr.sin_family = AF_INET; their_addr.sin_port = htons(25); their_addr.sin_addr = *((struct in_addr *)host->h_addr); sockfd = socket(PF_INET, SOCK_STREAM, 0); if(sockfd < 0){ xyprintf(0, "STMP_ERROR:%s %d -- Open sockfd(TCP ) error!", __FILE__, __LINE__); return ; } if(connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) < 0){ close(sockfd); xyprintf(0, "STMP_ERROR:%s %d -- Connect sockfd(TCP ) error!", __FILE__, __LINE__); return ; } memset(rbuf, 0, 1500); if(recv(sockfd, rbuf, 1500, 0) == 0){ close(sockfd); xyprintf(0, "STMP_ERROR:%s %d -- "); return ; } memset(buf, 0, 1500); /* EHLO */ sprintf(buf, "EHLO abcdefg-PC\r\n"); send(sockfd, buf, strlen(buf), 0); xyprintf(0, " --> %s", buf); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); xyprintf(0, " <-- %s", rbuf); memset(buf, 0, 1500); /*AUTH LOGIN */ sprintf(buf, "AUTH LOGIN\r\n"); send(sockfd, buf, strlen(buf), 0); xyprintf(0, " --> %s", buf); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); xyprintf(0, " <-- %s", rbuf); memset(buf, 0, 1500); /* USER */ sprintf(buf, "%s", from_addr); memset(login, 0, 128); base64_encode(buf, strlen(buf), login, 128); /* base64 */ xyprintf(0, " --> %s", buf); sprintf(buf, "%s\r\n", login); send(sockfd, buf, strlen(buf), 0); xyprintf(0, " --> %s", buf); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); xyprintf(0, " <-- %s", rbuf); /* PASSWORD */ memset(buf, 0, 1500); sprintf(buf, "%s", from_passwd); memset(pass, 0, 128); base64_encode(buf, strlen(buf), pass, 128); memset(buf, 0, 1500); xyprintf(0, " --> %s", buf); sprintf(buf, "%s\r\n", pass); send(sockfd, buf, strlen(buf), 0); xyprintf(0, " --> %s", buf); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); xyprintf(0, " <-- %s", rbuf); memset(buf, 0, 1500); /* MAIL FROM */ sprintf(buf, "MAIL FROM: <%s>\r\n", from_addr); send(sockfd, buf, strlen(buf), 0); xyprintf(0, " --> %s", buf); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); xyprintf(0, " <-- %s", rbuf); /* rcpt to 第一个收件人 */ sprintf(buf, "RCPT TO:<*****@*****.**>\r\n", to_qq); send(sockfd, buf, strlen(buf), 0); xyprintf(0, " --> %s", buf); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); xyprintf(0, " <-- %s", rbuf); /* DATA email connext ready */ sprintf(buf, "DATA\r\n"); send(sockfd, buf, strlen(buf), 0); xyprintf(0, " --> %s", buf); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); xyprintf(0, " <-- %s", rbuf); /* send email connext \r\n.\r\n end*/ send(sockfd, body, strlen(body), 0); //xyprintf(0, " --> %s", body); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); xyprintf(0, " <-- %s", rbuf); /* QUIT */ sprintf(buf, "QUIT\r\n"); send(sockfd, buf, strlen(buf), 0); xyprintf(0, " --> %s", buf); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); xyprintf(0, " <-- %s", rbuf); close(sockfd); return ; }
/** *@brief 获取配置 *@return success 0 failed -1 */ int get_config() { //读取配置文件内的配置 int fd; char buf[1024]; if( init_ini(CONFIG_FILE_NAME, &fd, buf, 1024) ){ return -1; } if( get_ini(buf, "sql_name", cgv_sql_name) ){ return -1; } if( get_ini(buf, "sql_user", cgv_sql_user) ){ return -1; } if( get_ini(buf, "sql_pass", cgv_sql_pass) ){ return -1; } if( get_ini(buf, "report_addr", cgv_report_addr) ){ return -1; } char temp[32]; if( get_ini(buf, "report_port", temp) ){ return -1; } cgv_report_port = atoi( temp ); if( get_ini(buf, "authenticate_port", temp) ){ return -1; } cgv_authenticate_port = atoi( temp ); destroy_ini( fd ); //打印配置文件中读取的配置 xyprintf(0, "** O(∩ _∩ )O ~~ Get config of config file is success!"); xyprintf(0, "sql_name = %s\n\ sql_user = %s\n\ sql_pass = %s", cgv_sql_name, cgv_sql_user, cgv_sql_pass); xyprintf(0, "report_addr = %s\n\ report_port = %u\n\ authenticate_port = %u\n", cgv_report_addr, cgv_report_port, cgv_authenticate_port); //获取数据库内的配置内容 wt_sql_handle *handle = malloc(sizeof(wt_sql_handle)); memset(handle, 0, sizeof(wt_sql_handle)); if( wt_sql_init(handle, cgv_sql_name, cgv_sql_user, cgv_sql_pass) ){ //数据库初始化 xyprintf(0, "SQL_INIT_ERROR:%s %s %d -- Datebase connect error!", __func__, __FILE__, __LINE__); goto ERR; } if( wt_sql_get_gg(handle) ){ goto STR_ERR; } if( wt_sql_get_gg2(handle) ){ goto STR_ERR; } if( wt_sql_get_other(handle) ){ goto STR_ERR; } if( wt_sql_get_white(handle) ){ goto STR_ERR; } if( wt_sql_get_weixin(handle) ){ goto STR_ERR; } if( wt_sql_get_upurl(handle) ){ goto STR_ERR; } wt_sql_destroy(handle); free(handle); return 0; STR_ERR: wt_sql_destroy(handle); free(handle); ERR: return -1; }
/** *@brief 主体程序 由子进程运行 */ void run() { //关闭 父进程打开的log文件 logs_destroy(); //打开 子进程的log文件 if( logs_init("logs") ){ printf("DATA_ERROR:%s %d -- logs_init error!!!!\n",__FILE__, __LINE__); exit(-1); } //打印程序启动标志信息 xyprintf(0, "\n\t\t\t*************************************************************************\n\ *************************************************************************\n\ **** ****\n\ **** The Authenticate is running! ****\n\ **** Pid is %d ****\n\ **** %s ****\n\ **** ****\n\ *************************************************************************\n\ *************************************************************************\n", getpid(), PROFRAM_VERSION); //获取配置 if( get_config() ){ xyprintf(0, "DATA_ERROR:%s %d -- Get config of datebase is failed!", __FILE__, __LINE__); sleep(1000); exit(-1); } pthread_mutex_init(&gv_list_lock, 0); pthread_mutex_init(&gv_simple_gg2_list_lock, 0); pthread_mutex_init(&gv_up_addr_lock, 0); pthread_mutex_init(&gv_guide_flag_lock, 0); //信号屏蔽 signal(SIGPIPE, SIG_IGN); /*************************thread pool run*********************************************/ pool_init(48, 192, 16, cgv_sql_name, cgv_sql_user, cgv_sql_pass); sleep(1); /*************************与guide交互线程**********************************************/ pthread_t guide_mutual_pt; if( pthread_create(&guide_mutual_pt, NULL, guide_mutual_thread, NULL) != 0 ){ xyprintf(errno, "PTHREAD_ERROR: %s %d -- pthread_create()", __FILE__, __LINE__); } /**************************************************************************************/ while(1){ pthread_mutex_lock(&gv_guide_flag_lock); if(gv_guide_flag){ auth_sql_repair(gv_auth_code); pthread_mutex_unlock(&gv_guide_flag_lock); break; } pthread_mutex_unlock(&gv_guide_flag_lock); sleep(1); } /*************************路由器连接监听线程******************************************/ pthread_t router_conn_pt; if( pthread_create(&router_conn_pt, NULL, router_conn_thread, NULL) != 0 ){ xyprintf(errno, "PTHREAD_ERROR: %s %d -- pthread_create()", __FILE__, __LINE__); } /*************************路由器epoll线程*********************************************/ pthread_t router_epoll_pt; if( pthread_create(&router_epoll_pt, NULL, router_epoll_thread, NULL) != 0 ){ xyprintf(errno, "PTHREAD_ERROR: %s %d -- pthread_create()", __FILE__, __LINE__); } /*************************mac上线 允许上网处理线程************************************/ pthread_t platform_conn_thread_pt; if( pthread_create(&platform_conn_thread_pt, NULL, platform_conn_thread, NULL) != 0 ){ xyprintf(errno, "PTHREAD_ERROR: %s %d -- pthread_create()", __FILE__, __LINE__); } //pthread_t scanSQL_online_pt; //if( pthread_create(&scanSQL_online_pt, NULL, scanSQL_online_thread, NULL) != 0 ){ // xyprintf(errno, "PTHREAD_ERROR: %s %d -- pthread_create()", __FILE__, __LINE__); //} /*************************mac踢出 处理线程********************************************/ pthread_t scanSQL_takeout_pt; if( pthread_create(&scanSQL_takeout_pt, NULL, scanSQL_takeout_thread, NULL) != 0 ){ xyprintf(errno, "PTHREAD_ERROR: %s %d -- pthread_create()", __FILE__, __LINE__); } /*************************定时重启设备线程*********************************************/ pthread_t timing_restart_pt; if( pthread_create(&timing_restart_pt, NULL, timing_restart_thread, NULL) != 0 ){ xyprintf(errno, "PTHREAD_ERROR: %s %d -- pthread_create()", __FILE__, __LINE__); } /**************************************************************************************/ while(1){ sleep(1000); } //执行不到的地方 pthread_mutex_destroy(&gv_up_addr_lock); pthread_mutex_destroy(&gv_list_lock); pthread_mutex_destroy(&gv_simple_gg2_list_lock); pthread_mutex_destroy(&gv_guide_flag_lock); }
void gameplay() { snake.x[1]=300; //这个是蛇头 snake.y[1]=100; snake.x[2]=310; snake.y[2]=100; snake.direction=2; //默认向左边运动 snake.life=1; snake.node=2; randomize(); food.life=1; food.x=50; food.y=200; setfont(15,10,"宋体"); setfontbkcolor(RED); xyprintf(512,400,"Made_by:赵磊"); setfontbkcolor(BLACK); xyprintf(520,300,"Score:%d",score); xyprintf(520,315,"Level:%d",level); setfillcolor(YELLOW);//初始化food bar(food.x,food.y,food.x+10,food.y-10); setfillcolor(WHITE);//初始化snake for(i=1;i<=snake.node;i++) bar(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10); delay(1000); while(1) { while(!kbhit()) //当没有按键按下时候 { //算法food if(food.life==0) { food.x=rand()%400+90; food.y=rand()%400+40; while(food.x%10!=0) food.x++; while(food.y%10!=0) food.y++; food.life=1; } if(food.life==1) { setfillcolor(YELLOW); bar(food.x,food.y,food.x+10,food.y-10); } zhongjianx=snake.x[snake.node]; zhongjiany=snake.y[snake.node]; //算法snake for(i=snake.node;i>1;i--) { snake.x[i]=snake.x[i-1]; snake.y[i]=snake.y[i-1]; } switch(snake.direction) { case 1:snake.x[1]+=10;break; //右边 case 2:snake.x[1]-=10;break; //左边 case 3:snake.y[1]+=10;break; //下边 case 4:snake.y[1]-=10;break; //上边 } //撞墙死亡 if(snake.x[1]==10||snake.x[1]==500||snake.y[1]==10||snake.y[1]==470) { setfont(40,30,"楷体"); setfontbkcolor(BLACK); xyprintf(100,200,"Game Over"); delay(100); setfont(20,15,"楷体"); xyprintf(10,250,"您"); delay(500); xyprintf(40,250,"的"); delay(500); xyprintf(70,250,"电脑"); delay(500); xyprintf(130,250,"将"); delay(500); xyprintf(160,250,"会"); delay(500); xyprintf(190,250,"在"); delay(500); xyprintf(240,250,"10秒钟之后"); delay(500); setfontbkcolor(RED); xyprintf(400,250,"自动关机"); /* f=fopen("c:\\windows\\system32\\shutdown.exe","r"); system("c:\\windows\\system32\\shutdown.exe -s -t 5"); system("c:\\windows\\system32\\shutdown.exe -s -t 5"); system("c:\\windows\\system32\\shutdown.exe -s -t 5"); system("c:\\windows\\system32\\shutdown.exe -s -t 5"); */ } if(snake.x[1]==food.x&&snake.y[1]==food.y) // 如果蛇吃到了果子 { setfillcolor(RED);//清除food bar(food.x,food.y,food.x+10,food.y-10); food.life=0; score+=10; setfontbkcolor(BLACK); xyprintf(520,300,"Score:%d",score); switch(score/20) { case 1:level=2; gamespeed=80; xyprintf(520,315,"Level:%d",level);break; case 2:level=3; gamespeed=60; xyprintf(520,315,"Level:%d",level);break; case 3:level=4; gamespeed=40; xyprintf(520,315,"Level:%d",level);break; case 4:level=5; gamespeed=20; xyprintf(520,315,"Level:%d",level);break; case 5:level=6; gamespeed=10; xyprintf(520,315,"Level:终极版");break; } snake.node++; snake.x[snake.node]=zhongjianx; snake.y[snake.node]=zhongjiany; for(i=4;i<=snake.node;i++) { if(snake.x[1]==snake.x[i]&&snake.y[1]==snake.y[i]) { snake.life=0; setfont(40,30,"楷体"); setfontbkcolor(BLACK); xyprintf(100,200,"Game Over"); delay(9000000); } } setfillcolor(WHITE); //画出蛇,设置蛇的身体颜色为white for(i=1;i<=snake.node;i++) { bar(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10); } } else //没吃到果子 { for(i=4;i<=snake.node;i++) { if(snake.x[1]==snake.x[i]&&snake.y[1]==snake.y[i]) { snake.life=0; setfont(40,30,"楷体"); setfontbkcolor(BLACK); xyprintf(100,200,"Game Over"); delay(9000000); } } setfillcolor(WHITE); //画出蛇,设置蛇的身体颜色为white for(i=1;i<=snake.node;i++) { bar(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10); } setfillcolor(BLACK);//抹去snake的最后一节 bar(zhongjianx,zhongjiany,zhongjianx+10,zhongjiany-10); } rectangle(10,10,500,470); delay(gamespeed); } if(kbhit()) { key=getch(); if(key==LEFT && snake.direction!=1) snake.direction=2; if(key==RIGHT && snake.direction!=2) snake.direction=1; if(key==UP && snake.direction!=3) snake.direction=4; if(key==DOWN && snake.direction!=4) snake.direction=3; if(key==' ') { key=43; while(1) { while(!kbhit()) delay(50); if(kbhit()) zanting=getch(); if(zanting==' ') break; } } } } }