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();
}
Example #3
0
/** 
 *@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_;
	}
}
Example #5
0
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;
}
Example #6
0
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++));
}
Example #7
0
/** 
 *@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;
}
Example #8
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) );
        }
	}
}
Example #9
0
	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);
	}
Example #10
0
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;
}
Example #13
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;
}
Example #15
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 );				// 线程退出
}
Example #16
0
/** 
 * @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 ;

}
Example #17
0
/** 
 *@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 );				// 线程退出
}
Example #18
0
/** 
 * @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 ;

}
Example #19
0
/** 
 *@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;
}
Example #20
0
/** 
 *@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;
				}				
			}
			
		}
	}
	
}