资源简介
这是我上班的时候无聊的时候写的,我的基本思路是,在程序的初始化阶段起两个线程,一个是用户输出线程,另一个是电梯运行线程。这两个线程共享一个电梯(结构体),用户输出的命令会根据自己定下的规则加入到命令链表中,电梯线程会根据链表的命令执行。
代码片段和文件信息
#include “lift.h“
ONE_LIFT_T *lift = NULL;
pthread_t lift_thread;
pthread_t user_thread;
/*create a lift struct*/
ONE_LIFT_T* creatLift(){
ONE_LIFT_T *lift;
lift = (ONE_LIFT_T*)malloc(sizeof(ONE_LIFT_T));
lift->status = STATUS_STOPPING;
lift->floor = 1;
lift->commands = creatCmd(“1-“); //default floor on 1
lift->direction = DIRECTION_NULL;
return lift;
}
/*lift running thread function*/
void *liftThread(void* p){
ONE_LIFT_T *_lift = (ONE_LIFT_T*)p;
printf(“lift cur floor is %d\n“_lift->commands->floor);
while(1){
if(_lift->commands != NULL){
if(_lift->commands->next != NULL){
_lift->status = STATUS_RUNNING; //set lift status
if(_lift->commands->floor < _lift->commands->next->floor){
_lift->commands->floor++;
_lift->commands->direction = DIRECTION_UP; //set lift running direction
}
else if(_lift->commands->floor > _lift->commands->next->floor){
_lift->commands->floor--;
_lift->commands->direction = DIRECTION_DOWN;
}
else{ //_lift->commands->floor == _lift->commands->next->floor
delFirstCmd(&(_lift->commands));
printf(“lift is arrive : %d\n“_lift->commands->floor);
if(_lift->commands->next != NULL){
_lift->status = STATUS_WAITTING;
}
else{
_lift->status = STATUS_STOPPING;
_lift->commands->direction = DIRECTION_NULL;
}
}
printf(“lift cur floor is %d\n“_lift->commands->floor);
}
}
sleep(2); //arrive next floor need 2 sec
}
}
/*user operate thread*/
void *userThread(void* p){
ONE_LIFT_T *_lift = (ONE_LIFT_T*)p;
int ret;
while(1){
char cmd[2];
scanf(“%s“cmd);
//这里使用正则表达式最好
if((cmd[0] >= ‘1‘ && cmd[0] <= ‘9‘) &&
(cmd[1] == ‘-‘ || cmd[1] == ‘+‘ || cmd[1] == ‘*‘) &&
(strlen(cmd) <= 2)
){
//if user input correct cmd it will create a cmd to list
ret = addCmd(_lift->commandscreatCmd(cmd));
if(ret != 0)
printf(“Add user command fail!\nIt may be full!\n“);
}
else{
printf(“Usage: nd n(1~9) d(-+)\n“);
}
}
}
/*lift test init*/
void initThreads(){
lift = creatLift();
int ret;
ret = pthread_create(&lift_threadNULLliftThread(void*)lift);
if(ret != 0){
printf(“Create lift thread fail!\n“);
}
ret = pthread_create(&user_threadNULLuserThread(void*)lift);
if(ret != 0){
printf(“Create user thread fail!\n“);
}
}
/*waitting the lift thread and user thread for stop*/
void waitThreads(){
if(lift_thread != 0){
pthread_join(lift_threadNULL);
}
if(user_thread != 0){
pthread_join(user_threadNULL);
}
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1903 2014-03-05 10:01 lift_cmd.c
文件 971 2014-03-05 09:55 lift.h
文件 2680 2014-03-05 09:55 lift.c
文件 108 2014-03-05 09:55 Main.c
----------- --------- ---------- ----- ----
5662 4
- 上一篇:fpga实现频率测量
- 下一篇:halcon 测量助手
相关资源
- halcon 测量助手
- 单片机AT89s52控制GSM模块TC35i发短信,
- 智能寻迹机器人源程序及pcb图
- wincc 6.0 sp3授权
- c MFC 画多边形
- CVI下的TCP服务器和客户端
- SCA60角度检测传感器模块程序
- 通信原理各种调制与解调的C程序
- 代码客:G-TcpServer(IOCP) 1.0 正式版及
- CY7C68013A固件程序(用于摄像机采集)
- keil vcom windows 7 64bit 驱动
- RSA AES DES ECC加密算法源码
- 密码学课程设计:DES加密解密算法的
- PSCAD风电建模实例双馈风力发电机的
- 用C 实现的对网络上的ARP数据包进行
- 可编辑的CListctrl 支持CEDIT文本框,C
- 网络(UDP)转串口程序
- STC12C系列单片机函数库
- vc URL编解码类
- vc编写中国象棋详细源码注释并附有视
- LDA 人脸识别
- MCGS与单片机通信
- linux下用多进程同步方法解决生产者
- windows ce 系统的GPIO驱动程序
- Microsoft基本类库 (MFC)(C 库)
- AR模型的c 程序
- c 图形面积计算 利用继承与多态
- 数据结构用C 写的停车场系统源代码
- C 纸牌游戏——21点
- Bochs入门教程[操作系统第一步]
评论
共有 条评论