(1) 新启动一个QThread thread,该线程只运行一个事件循环(QEventLoop looploop.exec())
(2)将写日哗察志文件功能单独抽象成一个继承QObject的类LogHelp
class LogHelp :public QObject
{
Q_OBJECT
public:
void Write(QString log){emit NotifyWrite(log)}
signal:
void NotifyWrite(QString log)
public slot:
void OnWrite(QString log){/*你的核心写文件代码*/}
(3)LogHelp logHelp 对象需要 movetothread 到(1)中创建的线程;logHelp.moveToThread(&thread)
(4)重点:connect(&logHelp,SIGNAL(NotifyWrite(QString)),&logHelp,SLOT(OnWrite(QString)),Qt::QueuedConnection)
如此你就可以在其它线程中直接调用logHelp .Write(log)不用管数据安全问题。
代码手敲,可能有问题,只是告诉你个思路。这样写不用维护队列,使用的是信号和槽函数纤贺的异步队列方式。
QT存储日志用数据库还是txt文本是需要具体问题具体分析的,因为如果小量的写数据库没事。如果是大量的,肯定写文件好。汇总后写程序导入数据库。还有一种方法是写redis等内存数据库,并累积数量后触发合并写入数据库 *** 作。
并且如果这个日志是需要定期分析的,写在数据库里更方便处理;反之只是留档,就存文件里 但2种方式都要注意写 *** 作的频率。
绝对不能产生一行写一行,中间加一个内存队列来过渡,比如memcache,有新日志就加入队列,然后做个定时器去批量写入文件并清空队列,同时也规避文件冲突了。
QT存储中大端模式和小端模式是:
对于long long a 和 struct{ char ashort bint c}二者同样占据了8个字节的空间,在存储上,后者则是先存储一个char,空一个字节,然后按照大端/小端模式存储short,最后按照大端/小端模式存储int。
在我们日常使用的x86架构的计算机中(其他类别的可能会采用大端模式或可配置模式,可以通过查阅资料或者用下文的代码进行测试),都是使用的小端模式,而网络字节序是大端模式的。
这就使得在网络通启烂信时陵芦进行字节序的转换变得极为重要。比方说,通信双方规定了了通信头尺旁带为一个4字节的魔数(Magic Number),而一方按着大端序的模式发送。
一方按着小端序的模式解读,那么两方的通信就会失败。如果没有这个魔数,而在内部的数据中出现这样的问题则会更加的麻烦。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)