【OK210试用体验】项目篇+物联仓库管理系统+前端数据中心 +共享内存刷新模块 07 - 在线问答 - 电子威廉希尔官方网站 论坛 - 最好最受欢迎电子论坛!

【OK210试用体验】项目篇+物联仓库管理系统+前端数据中心 +共享内存刷新模块 07

himol ( 楼主 ) 2015-10-24 10:11:52  只看该作者 倒序浏览
本帖最后由 himol 于 2015-10-24 10:14 编辑

第七节:共享内存刷新模块

1. 功能描述
当接收到仓库发送上来的信息之后,此线程被激活,并把实时的环境信息刷新到共享内存中,让CGI与QT能查看最新消息
2. 数据描述
数据类型
数据名称
功能
pthread_mutex_t
mutex_refresh
数据刷新线程互斥锁
mutex_refresh_updata
未使用
mutex_global
仓库实时数据保护互斥锁
mutex_slinklist
数据库数据缓存链表互斥锁
pthread_cond_t
cond_refresh
数据刷新线程被唤醒条件变量
cond_refresh_updata
未使用
cond_sqlite
数据库线程被唤醒条件变量
int
shmid
共享内存id
semid
信号灯集id
struct env_info_clien_addr
all_info_RT
仓库实时信息
3. 流程图


4. 代码

#include "sem.h"
#include "data_global.h"
#include "sqlite_link_list.h"
#define N 1024
extern pthread_mutex_t mutex_refresh;
extern pthread_mutex_t mutex_refresh_updata;
extern pthread_mutex_t mutex_global;
extern pthread_mutex_t mutex_slinklist;
extern pthread_cond_t cond_refresh;
extern pthread_cond_t cond_refresh_updata;
extern pthread_cond_t cond_sqlite;
extern char cgi_status;
extern char qt_status;
extern int shmid;
extern int semid;
extern struct env_info_clien_addr all_info_RT;
struct shm_addr
{
        char cgi_status;
        char qt_status;
        struct env_info_clien_addr rt_status;
};
void *pthread_refresh (void *arg)
{
        key_t key_info;
        int shmid, semid;
        struct shm_addr *shm_buf;
        if ((key_info = ftok ("/app", 'i')) < 0)
        {
                perror ("ftok info");
                exit (-1);
        }
        printf ("key = %dn", key_info);
        if ((semid = semget (key_info, 1, IPC_CREAT | IPC_EXCL |0666)) < 0)
        {
                if (errno == EEXIST)
                {
                        semid = semget (key_info, 1, 0666);
                }
                else
                {
                        perror ("semget");
                        exit (-1);
                }
        }
        else
        {
                init_sem (semid, 0, 1);
        }
        if ((shmid = shmget (key_info, N, IPC_CREAT | IPC_EXCL | 0666)) < 0)
        {
                if (errno == EEXIST)
                {
                        shmid = shmget (key_info, N, 0666);
                        shm_buf = (struct shm_addr *)shmat (shmid, NULL, 0);
                }
                else
                {
                        perror ("shmget");
                        exit (-1);
                }
        }
        else
        {
                if ((shm_buf = (struct shm_addr *)shmat (shmid, NULL, 0)) == (void *)-1)
                {
                        perror ("shmat");
                        exit (-1);
                }
        }
        bzero (shm_buf, sizeof (struct shm_addr));
        printf ("pthread_refresh is okn");
        while (1)
        {
                pthread_mutex_lock (&mutex_refresh);
                pthread_cond_wait (&cond_refresh, &mutex_refresh);
                sem_p (semid, 0);
                pthread_mutex_lock (&mutex_global);
                shm_buf->rt_status = all_info_RT;
                pthread_mutex_unlock (&mutex_global);
                sem_v (semid, 0);
                pthread_mutex_unlock (&mutex_refresh);
        }
        return 0;
}

0个回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则


关闭

站长推荐上一条 /6 下一条

小黑屋|手机版|Archiver|电子发烧友 ( 湘ICP备2023018690号 )

GMT+8, 2024-7-20 07:05 , Processed in 0.332761 second(s), Total 33, Slave 24 queries .

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

微信扫描
快速回复 返回顶部 返回列表