Qt多线程笔记 (2)
来源:互联网 发布:淘宝捡漏在什么地方 编辑:程序博客网 时间:2024/05/21 09:32
需求:处理多个*.dat文件,为每一个*.dat开辟一个线程。
下面的代码是乞丐丁哥纯手工打造。再次强烈感谢天下热心人。
乞丐丁 的搞法是直接使用run()来运行work thread
还有个技巧就是通过构造函数来传递参数,这些参数在thread类里面是全局变量。
#ifndef TOOLREPLACE_H#define TOOLREPLACE_H#include <QtWidgets>class CToolReplace : public QWidget{Q_OBJECTpublic:CToolReplace(QWidget *parent = 0);~CToolReplace();QStringList gasFileList;signals:void SigSendFileName(qint32, QString);private slots:void OpenFile();void SendFiles();void UpdateStatus(qint32 iRow, QString sStatus);private:void InitUI();private:QTableWidget *tbFile;QMenuBar *mbMain;QMenu *m_File;QAction *a_Open;QAction *a_Close;QMenu *m_Operate;QAction *a_Replace;QToolBar *tbMain;};#endif // TOOLREPLACE_H
#ifndef WORKTHREAD_H#define WORKTHREAD_H#include <QThread>class CWorkThread : public QThread{Q_OBJECTpublic:CWorkThread(qint32 iRow, QString sFileName, QObject *parent = 0);void run();signals:void SigStatus(qint32, QString);private:qint32 m_Row;QString m_FileName;};#endif // WORKTHREAD_H
#include "toolreplace.h"#include "workthread.h"CToolReplace::CToolReplace(QWidget *parent): QWidget(parent){resize(710,500);InitUI();a_Replace->setEnabled(false);}CToolReplace::~CToolReplace(){}void CToolReplace::InitUI(){mbMain = new QMenuBar(this);m_File = mbMain->addMenu(tr("File"));a_Open = m_File->addAction(tr("Open File"));a_Open->setIcon(QIcon(":/CToolReplace/Open"));m_File->addSeparator();a_Close = m_File->addAction(tr("Close File"));a_Close->setIcon(QIcon(":/CToolReplace/Close"));m_Operate = mbMain->addMenu(tr("Operate"));a_Replace = m_Operate->addAction(tr("Replace"));a_Replace->setIcon(QIcon(":/CToolReplace/Replace"));tbMain = new QToolBar(this);tbMain->addAction(a_Open);tbMain->addSeparator(); tbMain->addAction(a_Replace);tbMain->addSeparator(); tbMain->addAction(a_Close);tbFile = new QTableWidget;tbFile->setColumnCount(2);tbFile->setHorizontalHeaderLabels(QStringList()<<tr("File Name")<<tr("Status"));tbFile->setColumnWidth(0,500);tbFile->setColumnWidth(1,200);QVBoxLayout *vl = new QVBoxLayout;vl->setContentsMargins(0,0,0,0);vl->setSpacing(0);vl->addWidget(mbMain);vl->addWidget(tbMain);vl->addWidget(tbFile);setLayout(vl);connect(a_Open, SIGNAL(triggered()), this, SLOT(OpenFile()));connect(a_Replace, SIGNAL(triggered()), this, SLOT(SendFiles()));connect(a_Close, SIGNAL(triggered()), this, SLOT(close()));}void CToolReplace::OpenFile(){a_Replace->setEnabled(false);while(tbFile->rowCount() != 0){tbFile->removeRow(tbFile->rowCount());} gasFileList = QFileDialog::getOpenFileNames(this,tr("Select Files"),"D:/","Dat(*.dat)");if(!gasFileList.isEmpty()){a_Replace->setEnabled(true);}for(qint32 i = 0; i < gasFileList.count(); i++){tbFile->insertRow(i);tbFile->setItem(i,0,new QTableWidgetItem(gasFileList.at(i)));tbFile->setItem(i,1,new QTableWidgetItem(tr("Wait")));}}void CToolReplace::SendFiles(){for(qint32 i = 0; i < gasFileList.count(); i++){CWorkThread *myThread = new CWorkThread(i, gasFileList.at(i));connect(myThread, SIGNAL(SigStatus(qint32, QString)), this, SLOT(UpdateStatus(qint32, QString)));connect(myThread, SIGNAL(finished()), myThread, SLOT(deleteLater()));myThread->start();}}void CToolReplace::UpdateStatus(qint32 iRow, QString sStatus){tbFile->setItem(iRow, 1, new QTableWidgetItem(sStatus));}
#include "workthread.h"#include <QStringList>#include <QFile>#include <QTextStream>#include <QDebug>CWorkThread::CWorkThread(qint32 iRow, QString sFileName, QObject *parent): QThread(parent){m_Row = iRow;m_FileName = sFileName;}void CWorkThread::run(){QStringList asAllRow; asAllRow.clear();QFile m_File(m_FileName); if(!m_File.open(QIODevice::ReadOnly | QIODevice::Text)){emit SigStatus(m_Row, QString(tr("Cannot open file for read: %1").arg(m_File.errorString())));return;}emit SigStatus(m_Row, tr("1, Reading file~~~~~"));QTextStream m_TextStream(&m_File);m_TextStream.setCodec("UTF-8"); while(!m_TextStream.atEnd()){asAllRow.append(m_TextStream.readLine());} m_File.close(); qDebug()<<"str count:"<<asAllRow.count(); if (asAllRow.size() < 2) { qDebug()<<"Less than 2 row!"; return; } emit SigStatus(m_Row, tr(("2, Replacing file~~~"))); asAllRow.replace(1, asAllRow.at(2)); QFile m_FileWrite(m_FileName); if(!m_FileWrite.open(QIODevice::WriteOnly | QIODevice::Text)) { emit SigStatus(m_Row, QString(tr("Cannot open file for read: %1").arg(m_FileWrite.errorString()))); return; }emit SigStatus(m_Row, tr("3, Writing file~~~~~")); QTextStream m_TextStreamOut(&m_FileWrite); m_TextStreamOut.setCodec("UTF-8");for(qint32 iOut = 0; iOut < asAllRow.count(); iOut++){ m_TextStreamOut<<asAllRow.at(iOut)<<"\n";}m_TextStream.flush(); m_FileWrite.close();emit SigStatus(m_Row, tr("4, Finished!~~~~~~~~"));}
0 0
- Qt多线程笔记 (2)
- Qt多线程笔记 (1)
- Qt学习笔记(十)多线程
- 笔记:QT多线程编程步骤(其一)
- QT学习笔记18多线程
- QT笔记(2)
- Qt多线程学习 ( 2 )
- Qt 多线程服务器2
- Qt多线程(转)
- Qt多线程(二)
- Qt多线程(一)
- Qt 多线程(QThreadPool)
- 一个Qt多线程应用的新手笔记
- QT学习笔记(2)
- QT学习笔记之十八 Threads Qt多线程练习
- Qt 多线程探秘2--Qt Concurrent
- 多线程学习笔记(2)
- java多线程笔记(2)
- 关于二叉树的前序、中序、后序问题
- 图像处理中,SIFT,FAST,MSER,STAR等特征提取算法的比较与分析(利用openCV实现)
- Ext.each的用法
- prim最小生成树算法原理
- Service全面总结
- Qt多线程笔记 (2)
- html 背景图片实现 宽度自适应,高度为背景图片高度 解决发案
- 有哪些靠谱的服务器安全软件?
- HDU 3487(伸展树模板)
- spoj qtree Query on a tree 【线段树+树链剖分】
- MATLAB图像处理函数
- Bootstrap表格排序插件、日期选择插件
- [鸟哥笔记精编]7家信息流广告渠道报价及投放实用指南(2016更新)
- 实现点击超链接<a>标签,点击的标签变色,标注