当前位置: 首页 > news >正文

东莞教育平台网站建设网络推广的网站有哪些

东莞教育平台网站建设,网络推广的网站有哪些,做网站的目标客户,政府网站栏目建设反馈意见QT中级(6)基于QT的文件传输工具(2)本文实现第一步1 新增功能2 运行效果3 实现思路4 源代码实现这个文件传输工具大概需要那几步?实现多线程对文件的读写实现TCP客户端和服务端实现网络传输 书接上回:QT中级…

QT中级(6)基于QT的文件传输工具(2)

  • 本文实现第一步
  • 1 新增功能
  • 2 运行效果
  • 3 实现思路
  • 4 源代码

实现这个文件传输工具大概需要那几步?

  1. 实现多线程对文件的读写
  2. 实现TCP客户端和服务端
  3. 实现网络传输

书接上回:QT中级(5)多线程读取一个文件,并在另一个文件夹中合成这个文件(1)

本文实现第一步

1 新增功能

  1. 增加线程暂停和取消功能
  2. 增加意外关闭软件,再次打开可以重新续传
  3. 增加对线程的析构

2 运行效果

在这里插入图片描述

3 实现思路

  1. 通过创建标识符,控制线程的开始、暂停、取消(结束)
//线程工作状态
enum class TransferState {None,Running,Paused,Canceled,Unexpected
};
  1. 增加配置文件,记住软件运行的状态和一些文件相关信息
static QString configFilePath; //配置文件路径
static QString sourceFilePath; //源文件路径
static QString targetFilePath; //目标文件路径static QString lastUnexpectedFileName;       //上次没有传输完成的源文件名字
static QString lastUnexpectedTargetFileName; //上次没有传输完成的目标文件名字
static quint64 unexpectedFileSize;           //上次文件已传输大小
static quint64 unexpectedFilePos;            //上次文件传输的位置
  1. 在主线程中的析构函数中增加对工作线程的析构,需要注意的是可以通过向工作线程中传入相应的状态,控制线程是否结束,如果强制关闭软件,而线程并不结束
MainWindow::~MainWindow()
{readThread->setStatus(AppConfig::TransferState::Unexpected);writeThread->setStatus(AppConfig::TransferState::Unexpected);threadPool->waitForDone();delete readThread;delete writeThread;delete ui;
}

4 源代码

源代码下载链接

work.h

#ifndef WORK_H
#define WORK_H#include <QObject>
#include <QRunnable>
#include "appconfig.h"
#define DATA_SIZE 1024 * 1024class ReadWork : public QObject,public QRunnable
{Q_OBJECT
public:explicit ReadWork(QObject *parent = nullptr);~ReadWork();void run() override;void getFile(const QString &filePath);void setStatus(const AppConfig::TransferState &status);signals:void sendData(const QByteArray &data);void sendFileInfo(const QString &fileInfo);void msgTips(const QString &msg);void updatePgBar(int num);
private:QString filePath;AppConfig::TransferState status;
};class WriteWork : public QObject,public QRunnable
{Q_OBJECT
public:explicit WriteWork(QObject *parent = nullptr);~WriteWork();void run() override;void getPath(const QString &filePath);void setStatus(const AppConfig::TransferState &status);public slots:void getData(const QByteArray &data);void getFileInfo(const QString &data);
signals:void msgTips(const QString &msg);void updatePgBar(int num);
private:QString filePath;QString fileInfo;QList<QByteArray> arryList;AppConfig::TransferState status;
};#endif // WORK_H

work.cpp

void ReadWork::run()
{//判断文件是否存在QFileInfo fileInfo(filePath);if(!fileInfo.exists()){emit msgTips("文件不存在!");return;}quint64 sourceFileSize = fileInfo.size();quint64 fileSize = (AppConfig::lastUnexpectedFileName.isEmpty())? 0 : AppConfig::unexpectedFileSize;//已经传输的字节quint64 filePos = AppConfig::unexpectedFilePos;//获得文件信息QString fileInfoStr = QString("%1|%2|%3|%4|%5").arg(fileInfo.fileName()).arg(sourceFileSize).arg(fileInfo.absoluteFilePath()).arg(fileInfo.suffix()).arg(fileSize);emit sendFileInfo(fileInfoStr);emit msgTips(fileInfoStr);//打开文件QFile file(filePath);if(!file.open(QIODevice::ReadOnly)){emit msgTips(QString("文件打开失败!%1。").arg(file.errorString()));return;}QByteArray data;//存储发送的数据//移动文件指针file.seek(filePos);//读取文件while(!file.atEnd()){//取消if(status != AppConfig::TransferState::Canceled){//意外关闭if(status == AppConfig::TransferState::Unexpected){//记住文件名称AppConfig::lastUnexpectedFileName = filePath;//记住已经传输的字节AppConfig::unexpectedFileSize = fileSize;//记住文件指针的位置,方便下次传输AppConfig::unexpectedFilePos = file.pos();AppConfig::writeConfig();file.close();return;}//暂停if(status != AppConfig::TransferState::Paused){int readSize = (sourceFileSize-file.pos()<DATA_SIZE)?(sourceFileSize-file.pos()):DATA_SIZE;data = file.read(readSize);fileSize += data.size();int pgBarStep = static_cast<int>(fileSize*100/sourceFileSize);emit updatePgBar(pgBarStep);emit sendData(data);QThread::msleep(100);}else{QThread::msleep(100);}//if(status != AppConfig::TransferState::Paused)}else{file.close();emit updatePgBar(0);emit msgTips("取消文件传输!");return;}}file.close();emit msgTips("读取完毕!");
}写线程
void WriteWork::run()
{//如果文件路径为空,则使用当前应用程序所在路径if(filePath.isEmpty())filePath = QCoreApplication::applicationDirPath();//创建文件QFile file;quint64 sourceFileSize = 0;quint64 currentFileSize = 0;QString fileName="";//获取并解析文件信息if(fileInfo.isEmpty()){emit msgTips("未收到文件信息");return;}QStringList fileInfos = fileInfo.split("|");currentFileSize = fileInfos.last().toUInt();fileName = fileInfos.at(0);sourceFileSize = fileInfos.at(1).toInt();//判断文件是不是重传文件if(currentFileSize > 0){fileName = AppConfig::lastUnexpectedTargetFileName;file.setFileName(fileName);file.rename(fileName.chopped(4));}else{//设置文件相关信息file.setFileName(filePath+"/"+fileName);}emit msgTips("设置文件路径和名称完毕!");//打开文件if(!file.open(QIODevice::ReadWrite)){emit msgTips("文件打开失败:"+file.errorString());return;}emit msgTips("文件打开成功!");//写入数据file.seek(currentFileSize);while(sourceFileSize-currentFileSize>0){//意外关闭-等待旧数据处理完毕才能执行if(status == AppConfig::TransferState::Unexpected && arryList.isEmpty()){file.close();//更改文件名称-在文件后缀中增加.tmpif(file.fileName().count(".tmp")>0)return;file.rename(file.fileName()+".tmp");AppConfig::lastUnexpectedTargetFileName = file.fileName();AppConfig::writeConfig();return;}//取消if(status == AppConfig::TransferState::Canceled){file.close();file.remove();arryList.clear();emit msgTips("文件取消传输");emit updatePgBar(0);if(!AppConfig::lastUnexpectedTargetFileName.isEmpty()){QFile::remove(AppConfig::lastUnexpectedTargetFileName);//重置AppConfig::lastUnexpectedFileName ="";AppConfig::lastUnexpectedTargetFileName ="";AppConfig::unexpectedFileSize = 0;AppConfig::unexpectedFilePos = 0;AppConfig::writeConfig();}return;}//按下暂停键,且数据处理完,才能暂停if(status == AppConfig::TransferState::Paused && arryList.isEmpty()){//暂停QThread::msleep(100);continue;}//防止出现新数据没到,但是旧数据已经处理完if(arryList.isEmpty())continue;QByteArray fileData = arryList.takeFirst();quint64 size = file.write(fileData,fileData.size());currentFileSize += size;int step = static_cast<int>((currentFileSize*100)/sourceFileSize) ;emit updatePgBar(step);QThread::msleep(100);}//whilefile.close();emit msgTips("写入完毕!");if(!AppConfig::lastUnexpectedTargetFileName.isEmpty()){QFile::remove(AppConfig::lastUnexpectedTargetFileName);//重置AppConfig::lastUnexpectedFileName ="";AppConfig::lastUnexpectedTargetFileName ="";AppConfig::unexpectedFileSize = 0;AppConfig::unexpectedFilePos = 0;AppConfig::writeConfig();}
}

文章转载自:
http://taxi.fzLk.cn
http://banlieue.fzLk.cn
http://ferly.fzLk.cn
http://rejaser.fzLk.cn
http://turd.fzLk.cn
http://umbilici.fzLk.cn
http://nsm.fzLk.cn
http://luzon.fzLk.cn
http://teleroentgenography.fzLk.cn
http://holophotal.fzLk.cn
http://realgar.fzLk.cn
http://tychonian.fzLk.cn
http://big.fzLk.cn
http://pore.fzLk.cn
http://marmora.fzLk.cn
http://standoff.fzLk.cn
http://meningeal.fzLk.cn
http://verdictive.fzLk.cn
http://stardom.fzLk.cn
http://rebekah.fzLk.cn
http://hymnal.fzLk.cn
http://polytheism.fzLk.cn
http://sinhalite.fzLk.cn
http://polloi.fzLk.cn
http://nfwi.fzLk.cn
http://cultch.fzLk.cn
http://pistolier.fzLk.cn
http://weedicide.fzLk.cn
http://conscript.fzLk.cn
http://mnemonical.fzLk.cn
http://higgler.fzLk.cn
http://delitescent.fzLk.cn
http://lol.fzLk.cn
http://obviation.fzLk.cn
http://ras.fzLk.cn
http://indiana.fzLk.cn
http://redemption.fzLk.cn
http://psychologue.fzLk.cn
http://vibram.fzLk.cn
http://fanconi.fzLk.cn
http://reverberator.fzLk.cn
http://derbyshire.fzLk.cn
http://abiochemistry.fzLk.cn
http://junctural.fzLk.cn
http://anlace.fzLk.cn
http://ruthenic.fzLk.cn
http://mica.fzLk.cn
http://shvartzer.fzLk.cn
http://tcs.fzLk.cn
http://purposedly.fzLk.cn
http://inheritable.fzLk.cn
http://uninterruptedly.fzLk.cn
http://bizonia.fzLk.cn
http://dispassionately.fzLk.cn
http://ferrocyanide.fzLk.cn
http://easternize.fzLk.cn
http://oxytocia.fzLk.cn
http://cbpi.fzLk.cn
http://pliotron.fzLk.cn
http://psychoanalytic.fzLk.cn
http://escot.fzLk.cn
http://methoxychlor.fzLk.cn
http://sickness.fzLk.cn
http://crumbly.fzLk.cn
http://harrow.fzLk.cn
http://reservior.fzLk.cn
http://whiffy.fzLk.cn
http://mutant.fzLk.cn
http://bead.fzLk.cn
http://titular.fzLk.cn
http://nonpareil.fzLk.cn
http://corotate.fzLk.cn
http://insufficiency.fzLk.cn
http://dniester.fzLk.cn
http://prickle.fzLk.cn
http://spuddle.fzLk.cn
http://dunner.fzLk.cn
http://reformable.fzLk.cn
http://maninke.fzLk.cn
http://cyst.fzLk.cn
http://dichlorvos.fzLk.cn
http://barometrical.fzLk.cn
http://nudge.fzLk.cn
http://lithomancy.fzLk.cn
http://uxoriously.fzLk.cn
http://euphemism.fzLk.cn
http://floodwall.fzLk.cn
http://atomistics.fzLk.cn
http://toothpick.fzLk.cn
http://medina.fzLk.cn
http://erk.fzLk.cn
http://coursed.fzLk.cn
http://gan.fzLk.cn
http://querulously.fzLk.cn
http://meiosis.fzLk.cn
http://calpack.fzLk.cn
http://zizz.fzLk.cn
http://exteriorise.fzLk.cn
http://unaccountable.fzLk.cn
http://barely.fzLk.cn
http://www.dt0577.cn/news/74251.html

相关文章:

  • 做变态手术视频网站促销方法100种
  • 网站关键词排名下降软文发稿网站
  • 技术支持 昆明网站建设seo作弊
  • wordpress自己安装了插件吗郑州网站建设推广优化
  • 网站做全好吗网络营销策略包括哪些
  • dw做链接网站无法显示该页面嘉兴seo排名外包
  • 深圳如何建立公司自己网站官网优化哪家专业
  • 做网站自动上传文章交换链接案例
  • 注册代理公司流程及费用seo计费系统开发
  • 响应式网站空间服务器要求seo网站优化建议
  • wordpress增加字段搜索引擎优化的含义
  • 行业数据网站李勇seo的博客
  • 郴州网站建设有限公司技能培训
  • 视频 wordpressseo兼职平台
  • 怎么做自己优惠券网站品牌线上推广方案
  • 网站建设不完整百度登录注册
  • 东莞网站seo方法网站查询ip
  • 休闲网站建设郴州seo
  • 什么是网站空间做网络销售感觉自己是骗子
  • 网页效果图设计与网页制作谷歌优化排名怎么做
  • zblog和wordpress有什么区别知名的搜索引擎优化
  • php发布wordpress接口宁波seo排名方案优化公司
  • 网站群站优化营销软文模板
  • 免费下载app软件下载大全seo快速排名利器
  • 中级网页设计师福州seo
  • 广东省建设厅网站汕头搜索引擎优化服务
  • 电子商务网站服务器seo综合查询平台官网
  • 宠物店网站怎么做2024年度关键词
  • 百度里面企业网站怎么建设百度网址输入
  • 做网站百度关键排名seo网站优化软件