在线程类中 tcpsocket用write些数据时 数据不能发送出去
HandleTask.h
#ifndef HANDLETASK_H
#define HANDLETASK_H
#include <QThread>
#include <QSemaphore>
#include "DataStructure.h"
class CHandleTask : public QThread
{
Q_OBJECT
public:
CHandleTask(const CTask& task);
~CHandleTask();
void run();
void sendResult();
void sendMsg(MSGTYPE msgType);
void readFile();
int getThreadNum();
private:
static int threadNum;
CTask m_task;
qint64 totalBytes; //存放总大小信息
qint64 bytesReceived; //已收到数据的大小
qint64 fileNameSize; //文件名的大小信息
QString fileName; //存放文件名
QFile *localFile; //本地文件
QByteArray inBlock; //读取文件
int fileNum; //读取需要传递的文件数
int fileTransferedNum; //已经传递的文件个数
signals:
void ThreadMsg(/*const CTask&,*/const QString&);
};
#endif // HANDLETASK_H
HandleTask.cpp
#include "HandleTask.h"
#include <QMessageBox>
#include <QSemaphore>
#include <QDir>
static QSemaphore MaxThreadRunning(30);
QWaitCondition anotherThread;
int CHandleTask::threadNum = 0;
CHandleTask::CHandleTask(const CTask& task)
{
m_task = task;
totalBytes = 1000; //存放总大小信息
bytesReceived = 0; //已收到数据的大小
fileNameSize = 0; //文件名的大小信息
fileNum = 1;//task.net_msg.parameterNum;
fileTransferedNum = 0;
threadNum++;
}
CHandleTask::~CHandleTask()
{
threadNum--;
}
/* 当前建立的处理文件的线程的个数(包括正在运行或阻塞的) */
int CHandleTask::getThreadNum()
{
return threadNum;
}
void CHandleTask::run()
{
//向客户端说明可以传输文件
//MaxThreadRunning.acquire();
QByteArray block;
QString ss = m_task.tcpSocket->peerAddress().toString();
QString gs = tr("%1").arg(m_task.tcpSocket->peerPort());
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << m_task.net_msg.userName;
out << m_task.net_msg.userPassword << msgType
<< m_task.net_msg.nID << m_task.net_msg.filename << m_task.net_msg.totalSize;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
m_task.tcpSocket->waitForConnected(5000);
int t = (int)m_task.tcpSocket->state();
m_task.tcpSocket->write(block);
sendMsg(MSG_FILE_TRANSFER);
//准备传输文件
while(bytesReceived != totalBytes || fileNum != fileTransferedNum)
{
if(m_task.tcpSocket->isReadable());
readFile();
sleep(1);
}
/*! 处理文件 */
sendResult();
// anotherThread.wakeOne();
// MaxThreadRunning.release();
}
void CHandleTask::readFile()
{
QDataStream in(m_task.tcpSocket);
in.setVersion(QDataStream::Qt_4_6);
if(bytesReceived <= sizeof(qint64)*2)
{ //如果接收到的数据小于16个字节,那么是刚开始接收数据,我们保存到//来的头文件信息
if((m_task.tcpSocket->bytesAvailable() >= sizeof(qint64)*2)&& (fileNameSize == 0))
{ //接收数据总大小信息和文件名大小信息
in >> totalBytes >> fileNameSize;
bytesReceived += sizeof(qint64) * 2;
}
if((m_task.tcpSocket->bytesAvailable() >= fileNameSize)
&& (fileNameSize != 0))
{ //接收文件名,并建立文件
in >> fileName;
//InsertLog(tr("accept file %1 …").arg(fileName));
//emit ThreadMsg(tr("accept file %1 …").arg(fileName));
bytesReceived += fileNameSize;
QString path = tr("%1/%2/%3").arg("FileToBeSolve",
m_task.net_msg.userName,QString::number(m_task.net_msg.nID,10));
QDir newDir;
newDir.mkpath(path);
localFile = new QFile(tr("%1/%2").arg(path,fileName));
if(!localFile->open(QFile::WriteOnly))
{
qDebug() << "open file error!";
return;
}
}
else return;
}
if(bytesReceived < totalBytes)
{ //如果接收的数据小于总数据,那么写入文件
inBlock = m_task.tcpSocket->read(1024*1024);
bytesReceived += inBlock.size();
localFile->write(inBlock);
inBlock.resize(0);
}
//更新进度条
if(bytesReceived == totalBytes)
{
//接收数据完成时
localFile->close();
bytesReceived = 0;
totalBytes = 10000;
fileTransferedNum++;
fileNameSize = 0;
//InsertLog(tr("%1 receive successfully!").arg(fileName));
// emit ThreadMsg(tr("%1 receive successfully!").arg(fileName));
}
}
/* 告诉客户端程序可以进行文件传输 */
void CHandleTask::sendMsg(MSGTYPE msgType)
{
QByteArray block;
QString ss = m_task.tcpSocket->peerAddress().toString();
QString gs = tr("%1").arg(m_task.tcpSocket->peerPort());
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << m_task.net_msg.userName;
out << m_task.net_msg.userPassword << msgType
<< m_task.net_msg.nID << m_task.net_msg.filename << m_task.net_msg.totalSize;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
m_task.tcpSocket->waitForConnected(5000);
int t = (int)m_task.tcpSocket->state();
m_task.tcpSocket->write(block);
}
/* 将处理结果发给客户端程序 */
void CHandleTask::sendResult(){}
此为服务器端中的一部分 主要实现从客户端接受文件 然后处理文件 再将结果发回客户端。
由于要采用多线程来实现多个客户端的同时传输,所以将这对文件的传输处理放在线程类中实现。现在如果不向客户端些数据是可以实现文件的接收的 即文件传输没问题但是向客户端写数据就有问题
其中部分变量函数未实现 在run中调用sendMsg函数(向客户端说明服务器准备好 可以传输文件了),通过调试发现能一直运行到m_task.tcpSocket->write(block);
但是通过观察端口发现并没有数据传出 客户端也收不到数据 到底怎么回事啊
相关推荐
完全复现虚拟同步发电机VSG自适应惯量阻尼控制仿真、根轨迹、调节系数对比(Simulink仿真、Matlab代码实现)
内容概要:本文详细介绍了名为《【完全复现】虚拟同步发电机VSG自适应惯量阻尼控制仿真、根轨迹、调节系数对比(Simulink仿真、Matlab代码实现)》的技术资源,重点围绕虚拟同步发电机(VSG)的自适应惯量与阻尼控制展开,涵盖系统建模、控制策略设计、根轨迹分析及调节系数对比等内容,通过Simulink仿真与Matlab代码实现,帮助读者深入理解VSG在电力系统中的动态响应特性与控制优化方法;文档还列举了大量相关科研资源,涉及电力系统、智能优化、信号处理、路径规划等多个领域,展示了丰富的仿真案例与算法应用。; 适合人群:具备电力系统、自动控制或相关专业背景,熟悉Matlab/Simulink仿真环境,有一定科研基础的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于学习和复现虚拟同步发电机的自适应控制策略,掌握其在微电网和新能源并网中的应用;②通过根轨迹与参数调节分析,优化控制系统动态性能;③结合提供的代码与模型,开展电力系统稳定性研究、课程设计或科研项目开发。; 阅读建议:建议读者结合文中提到的完整资源目录和网盘资料,下载配套的Matlab代码与Simulink模型进行实践操作,边仿真边理解理论原理,重点关注控制参数对系统稳定性的影响,并可拓展应用于其他电力电子变流器或构网型控制研究。
政府如何精准评估园区创新能力并制定有效产业政策?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
央企如何借助数据分析提升创新管理体系效能?.docx
央企如何借助数据分析提升创新管理体系效能?
MATLAB模拟6自由度无人机检查,具备干扰补偿、裂纹检测和自主复检功能。.zip
1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
政府园区如何通过数据分析提升区域科技决策效率?.docx
政府园区如何通过数据分析提升区域科技决策效率?


