首页 > C/C++/Linux, Qt > 用消息队列和多线程实现外设挂卸载时的GUI界面实时更新-1

用消息队列和多线程实现外设挂卸载时的GUI界面实时更新-1

2009-06-09 16:50 星期二    浏览: 1,139    绿 发表评论 阅读评论

题记:整理记录上周4、5之工作内容

如前blog所述,当系统有外存储设备插拔上,会根据socket的消息进行自动挂卸载。

这个监视的进程往往是在某个守护进程里的一个线程里完成的,而File Browser则是在另一个进程中去完成文档目录的浏览。

因此,需要采用IPC机制去完成这种通讯。而File Browser的GUI界面中需要实时检测有哪些进程消息传递过来,以便实时更新这些设备提示(此处仅为刷新文件浏览器中的目录)。为了效率起见,这个监视行为应放在一个线程中去完成。

IPC采用消息队列去实现。在mount/umount模块中,当有设备要挂载并创建挂载点和设备拔出删除挂载点时,我们就需要告知file browser进程。这个功能由DirCreatedOrRemoved函数完成。首先,定义了消息结构体,第一个字段为自己的消息类型,第二个则为消息体内容,保存了哪个路径被删除或被创建。

具体实现如下:

#include <sys/ipc.h>
#include <sys/msg.h>
//System V MSG IPC
//created: true mean created a new dir, false means removed

struct MyMSG {
long  mtype;      /* positive message type */
char  mtext[PATH_MAX+1]; /* message data, of length nbytes */
};

void DirCreatedOrRemoved(const char* dir, bool created)
{
#ifdef MY_DEBUG
fprintf(stderr, ” To report dir changed by using IPC…n”);
#endif

key_t key=ftok(“/home/work/multimedia”, ‘a’);  //键值ID,目的是唯一性
if(key==-1)
{
perror(“Error on create IPC key”);
return;
}

int msg_id= msgget(key, IPC_CREAT|0660);
if(msg_id==-1)
{
perror(“msgget error”);
return;
}

MyMSG msg;

memset(&msg,0,sizeof(MyMSG));
msg.mtype=666;
msg.mtext[0]=created? ’1′: ’0′;//这两行将要传递的消息内容放进去,对侧需要相应解析
strcpy(&(msg.mtext[1]), dir);//

int result = msgsnd(msg_id, &msg, strlen(dir)+2, IPC_NOWAIT );
if(result==-1)
{
perror(“Failed to send message”);
}

#ifdef MY_DEBUG
fprintf(stderr, “Sent IPC msg=%sn”, msg.mtext);
#endif
}

 后记:使用ipcs查看系统产生的进程间通讯消息

本文链接地址: http://blog.redwolf-soft.com/?p=579

原创文章,版权©红狼博客所有, 转载随意,但请注明出处。

    分享到:

相关文章:

  • 无相关文章
分类: C/C++/Linux, Qt 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
订阅评论
  欢迎参与讨论,请在这里发表您的看法、交流您的观点。