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

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

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

(续上篇)
在File Browser的主程序中,可在构造函数中创建一个线程去收取消息,然后进行刷新操作。

#include<unistd.h>

#include <stdio.h>

#include <pthread.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <errno.h>

 

void* monitorThread(void* model)

{

key_t key=ftok(“/home/work/multimedia”, ‘a’);

if(key==-1)

{

perror(“Error on create IPC key”);

return (void*)0;

}

#ifdef MY_DEBUG

fprintf(stderr, “key=0x%8x, monitor threadn”, key);

#endif

 

int msg_id= msgget(key, IPC_NOWAIT);

if(msg_id==-1)

{

perror(“msgget error”);

return (void*)0;

}

MyMSG msg;

bool created;

char dir[PATH_MAX];

while(1)//不断循环去检查新消息

{

int result = msgrcv(msg_id,&msg, PATH_MAX+1, 666, IPC_NOWAIT);

if(result==-1 )

{

if( errno == ENOMSG)

continue;//没有新消息时继续循环检测

else

break;//收取消息出错时则退出此线程,自动刷新功能失效

}

if(msg.mtext[0]==’1′)

created=true;

else

created=false;
strcpy(dir, &(msg.mtext[1]));

#ifdef MY_DEBUG

fprintf(stderr, “Got IPC msg=%sn”, msg.mtext);

#endif

//下面的代码是根据解析后的消息内容,刷新文件系统model

QDirModel* m=(QDirModel*)model;

if(strstr(dir, locationPath[FileBrowser::Udisk]))

m->refresh( m->index(locationPath[FileBrowser::Udisk]));

else if(strstr(dir, locationPath[FileBrowser::Sdcard]))

m->refresh( m->index(locationPath[FileBrowser::Sdcard]));

}

return (void*)0;

}

//创建线程

pthread_t createMountUmountMonitorThread(void* arg)

{

pthread_t id;

int ret=pthread_create(&id, NULL, monitorThread, arg);

if(ret)

{

fprintf (stderr, “Create pthread error!n”);

return 0;

}

return id;

}

 

上面的线程是一个无限循环,除非收取消息出错退出。当File Browser退出时,应该退出该线程。可放在析构函数中或其closeEvent函数中:

if(g_id)//g_id是创建该线程时返回的线程ID

{

pthread_cancel(g_id);

}

 

经测试,可以得到预期效果。当有设备(USB和MMC等)插拔时,可自动刷新显示挂载文件夹的变化。

 

参考文档:http://doc.linuxpk.com/53295.html

Linux下的C编程入门(四)――“线程”控制与“线程”通信编程

 

Linux环境进程间通信(三):消息队列

http://www.bccn.net/Article/kfyy/vc/jszl/200708/5851.html

 

message queue常见操作和例子

http://kingoal.javaeye.com/blog/373015

 

Linux下的多线程编程

http://fanqiang.chinaunix.net/a4/b8/20010811/0905001105.html

 

《UNIX环境高级编程》(Advanced Programming in the UNIX Environment 2Ed)

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

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

    分享到:

相关文章:

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