深度文件管理器技术填坑日记

2017-01-10 10:07:26来源:作者:SegmentFault人点击

单例模板设计

c++里面我们经常使用单例对象,特别是在做全局对象的时候,我们希望程序里边就只有一个单例。实现一个单例的程序例如下面:

class A{ public: static A* instance{ static A instance; return &insance; } private: A(); ~A(); A(const A &); A & operator = (const A &);}

但是在一个项目里边我们有很多个单例对象,那岂不是每个类都要写一遍实例化函数?我们可以做一个单例模板:

template<typename T>class Singleton{public: static T* instance(){ static T instance; return &instance; }private: Singleton(); ~Singleton(); Singleton(const Singleton &); Singleton & operator = (const Singleton &);};

这时候我们就可以初始化各种类的全局单例对象了:

#define globalA Singleton<A>::instance()#define globalB Singleton<B>::instance()globalA;globalB;

对于这样的模板单例,我感觉能让代码更加规范,可读性也比较好,在这记录下来了。

单进程多窗口管理

文件管理器是一个但进程多窗口应用。所谓但进程多窗口,就是不管打开了多少个应用窗口,它其实都是在一个独立进程里边,在打开新窗口的时候我们并没有因此开辟了一个新进程。多窗口实现还是蛮简单的,但进程就针对不同平台有不同的解决办法(windows,linux的解决方法都有不同)这里主要针对linux下如何实现单例应用。在linux下要实现单例应用,方法有挺多的,然而有些方法是不怎么靠谱(特别使用QSharedMemery来实现单例应用时候,在程序正常运行的时候加锁是正常的,正常退出程序的时候解锁也是正常的,但是直接杀掉这个进程,就没法解锁了,后面就不能正常启动程序了)不管怎么样,这里列下两种暂时没发现有问题的方式实现单例应用:

1. 通过QLocalSocket/QLocalServer监听服务连接(windows,linux都适用)

使用QLocalSocket/QLocalServer实现一个单例应用实现的过程如上图结构。我们来一步步讲解它的逻辑是怎么走的。按着这个结构,我们首先在启动程序之前,先用QLocalSocket跟服务端进行连接,如果连接失败了,这时候证明当前的进程就是唯一的单例。然后我们用QLocalServer去监听我们规定好的地址,等待这下一个同样的进程启动的时候接受发送过来的数据进行命令处理;如果连接成功了,证明系统已经有了一个单例进程,我们通过对Server端写命令数据(这个数据是自定义的,这样我们就可以跟单例进程通讯,让创建新窗口,而不是开一个新进程来创建新窗口),然后退出该进程。如此循环,不管我们启动多少次程序,都只有一个进程在跑着啦!

接下来我们看一下QLocalSocket/QLocalServer做了什么。首先QLocalServer监听服务,它的地址名字是自定义的,比如我们的文件管理器地址叫做dde-file-manager,然后它会在XDG_RUNTIME_DIR里边创建了一个地址名字文件(如果已经有了就略过),然后在这个地址上监听sokect请求。接着是QLocalSocket连接服务,地址也是这个自定义的名字,如果有服务监听这个地址,那么Socket是能够正常建立连接的,如果没有,连接将会失败。我们看一下目录截图:

2. 通过DBus服务进程监听(只使用于Linux系统) 一个MVC构架模式 Controller View MenuAction 框架 右键菜单自动化,Qt元对象特性(路由设计) dbus服务 文件系统监听实现 samba文件共享 rlocate快速文件搜索实现 缩略图生成与管理 网络文件系统 提权实现 插件机制实现 文件获取图标实现 avfs直读技术引入 格式化工具实现 无线分享(后期) 手机助手(后期) 文件管理器hack小技术

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台