Qt 开发中遇到的问题;

梦是多么的重要 2013-12-11 10:15:55
用QT做了一个 传递数据的东西;服务端 客户端

当客户端呢连接服务端后,会产生 进度条;服务端点击开始更新服务端开始更新;
但是在这个更新过程中呢,如果又来了一个客户端链接;服务端再次惦记开始更新会会出现:
第一个链接服务端传输的过程中止了;第二个客户端开始了;当第三个客户端链接;点击开始更新;
第二个客户端中止了,第 1个 第 3个客户端开始更新了,当然,第一个客户端进度条被重置了;
请问下这种问题出现的原因是什么? 传输过程用 switch()语句进行 数据交互;用到了线程锁;;;
求解~!
...全文
171 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
给下答案吧,我受不了了;; 这叫我怎么活啊~! 今天下午要搞定的啊~!
  • 打赏
  • 举报
回复
引用 14 楼 victor_woo 的回复:
是不是用了静态变量? 每个客户端应该生成独立的Socket连接
我是用线程连接的,所以不会出现这种问题; 每有一个客户端连接,都会有一个新的线程创建; 所以理论上也不应该出现这种问题;;; 求解了/
victor_woo 2013-12-12
  • 打赏
  • 举报
回复
是不是用了静态变量? 每个客户端应该生成独立的Socket连接
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
听话,这才是好孩纸!
你坑人啊~! 压根就没我想要的东西;
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
听话,这才是好孩纸!
我要是看了 还没搞定,回来保证切了你~!
赵4老师 2013-12-12
  • 打赏
  • 举报
回复
听话,这才是好孩纸!
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
[quote=引用 8 楼 luoxuechengbing 的回复:] [quote=引用 7 楼 zhao4zhong1 的回复:] 建议下载研究eMule源代码。
我在想你到底是不是 一台机器在回复,你说话都是有固定语言的;;;[/quote] 我估计在你没看人家eMule是怎么实现多文件分段下载功能之前,是无法搞定类似功能的。[/quote] 好,好的,那谢谢;我去看;;;;哎;;去看了;~!
赵4老师 2013-12-12
  • 打赏
  • 举报
回复
引用 8 楼 luoxuechengbing 的回复:
[quote=引用 7 楼 zhao4zhong1 的回复:] 建议下载研究eMule源代码。
我在想你到底是不是 一台机器在回复,你说话都是有固定语言的;;;[/quote] 我估计在你没看人家eMule是怎么实现多文件分段下载功能之前,是无法搞定类似功能的。
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
建议下载研究eMule源代码。
我在想你到底是不是 一台机器在回复,你说话都是有固定语言的;;;
赵4老师 2013-12-12
  • 打赏
  • 举报
回复
建议下载研究eMule源代码。
  • 打赏
  • 举报
回复
引用 3 楼 zmlovelx 的回复:
办案讲究的是现场调查,光听目击者说效果就打折了
引用 3 楼 zmlovelx 的回复:
办案讲究的是现场调查,光听目击者说效果就打折了
#include "UpdateServeThread.h"
#include <QTcpSocket>
#include <QTimer>
#include "MsgGlobal.h"
#include <QDataStream>
#include <QDateTime>
#include <QMutexLocker>
#include <QHostInfo>
#include<QtDebug>

UpdateServeThread::UpdateServeThread(int socketDescriptor,QObject *parent)
	: QThread(parent),m_socketDescriptor(socketDescriptor)
	,m_socket(nullptr)
	,m_state(None)
	,m_updateCount(0)
	,m_timer(nullptr)

{   
	start();
	QThread::wait(50);
}


void UpdateServeThread::run()
{    

	QTcpSocket _socket;
	m_socket = &_socket;
	_socket.setSocketDescriptor(m_socketDescriptor);
	QTimer _timer;
	_timer.setInterval(0);
	m_timer = &_timer;
	connect(&_timer,SIGNAL(timeout()),this,SLOT(checkUpdate()),Qt::DirectConnection);
	connect(this,SIGNAL(startTimerSignal()),&_timer,SLOT(start()));
	connect(this,SIGNAL(closeTimerSignal()),&_timer,SLOT(stop()));
	connect(&_socket,SIGNAL(disconnected()),this,SIGNAL(disconnected()));
	connect(&_socket,SIGNAL(socketError()),this,SIGNAL(socketError()));
	exec();
}
UpdateServeThread::~UpdateServeThread()
{
}

void UpdateServeThread::checkUpdate()
{     

	QMutexLocker _locker(&m_mutex);
	switch(m_state)
	{
	case None://向客户端发送更新邀请
		{  qDebug()<<m_socket->size();
			if(m_files.size())
			{
				auto _file = m_files.last();
				QByteArray _byte0;
				QDataStream _s(&_byte0,QIODevice::WriteOnly);
				_s << _file.size();	
				_s << _file.fileName();
				_s <<  UpdateCmd;		
				/*	_s << _file.lastModified();
				_s << 512;*/
				qDebug()<< _file.size();
				qDebug() << _file.fileName();
				_byte0.resize(512);				
			    m_socket->write(_byte0);
				m_state = WaitCmdResult;
				qDebug()<<"发起更新申请";

			} 

		}break;
	case WaitCmdResult://等待接收客户端邀请回复
		{   qDebug()<<m_socket->size()<<"1111";
			if(m_socket->size() == 512 && m_socket->isReadable())
			{   qDebug()<<"222";	
			QByteArray _byte1 = m_socket->read(512);
			QDataStream _stream(_byte1);
			bool _update = true;
			int _type = 0;
			_stream >> _type;
			_stream >> _update;

			if(_type == UpdateCmdResult && _update)
			{

				m_currentFile.setFileName(m_files.last().absoluteFilePath());
				m_currentFile.open(QIODevice::ReadOnly);
				qDebug()<<"接收到更新确认,开始更新";

				m_state = Update;

			}
			}

		}break; 
	case Update://开始更新
		{   
			QByteArray _byte3 = m_currentFile.read(512); //每次读取数据大小

			m_socket->write(_byte3);
			/*m_currentFile.seek(m_currentFile.pos() + 1024);*/
			if(m_currentFile.atEnd())
			{ 

			m_currentFile.close();
			m_state =  OverSend ;
			emit updateProecessChange(m_updateCount-m_files.size(),m_updateCount);
			m_files.pop_back();	
			if(m_files.isEmpty())
			{    				
				qDebug()<<"所有文件发送完成";
				emit updateProecessChange(1,1);
				m_timer->stop();
			}
			}						                                                                                          
		}break;
	case OverSend :
		{    
			qDebug()<<m_socket->size()<<"等待结束";
			QByteArray  _over1 = m_socket->read(512);
			QDataStream _OverSend(_over1);
			int _over = 0;

				_OverSend >> _over;
				if (_over == recvOver)
				{
					m_state = None ;
				} 

		}break;
	}
}

void UpdateServeThread::setUpdate(const QList<QFileInfo> &files)
{
	QMutexLocker _locker(&m_mutex);
	m_files = files;
	m_updateCount = files.size();
	m_state = None;
	if(m_updateCount)
		emit startTimerSignal();
	else
		emit closeTimerSignal();
}

QString UpdateServeThread::clientName() const
{
	return QHostInfo::fromName(m_socket->peerAddress().toString()).hostName();

}
在线坐等分析~!! 求解决方案啊~! 现在没任何思绪,都不知道问题在哪里,知道问题在哪里就好了,我就能对症下药了;~!
  • 打赏
  • 举报
回复
引用 4 楼 u011909609 的回复:
这种问题跟代码有关,贴代码吧楼主
#include "UpdateServeThread.h"
#include <QTcpSocket>
#include <QTimer>
#include "MsgGlobal.h"
#include <QDataStream>
#include <QDateTime>
#include <QMutexLocker>
#include <QHostInfo>
#include<QtDebug>

UpdateServeThread::UpdateServeThread(int socketDescriptor,QObject *parent)
	: QThread(parent),m_socketDescriptor(socketDescriptor)
	,m_socket(nullptr)
	,m_state(None)
	,m_updateCount(0)
	,m_timer(nullptr)

{   
	start();
	QThread::wait(50);
}


void UpdateServeThread::run()
{    

	QTcpSocket _socket;
	m_socket = &_socket;
	_socket.setSocketDescriptor(m_socketDescriptor);
	QTimer _timer;
	_timer.setInterval(0);
	m_timer = &_timer;
	connect(&_timer,SIGNAL(timeout()),this,SLOT(checkUpdate()),Qt::DirectConnection);
	connect(this,SIGNAL(startTimerSignal()),&_timer,SLOT(start()));
	connect(this,SIGNAL(closeTimerSignal()),&_timer,SLOT(stop()));
	connect(&_socket,SIGNAL(disconnected()),this,SIGNAL(disconnected()));
	connect(&_socket,SIGNAL(socketError()),this,SIGNAL(socketError()));
	exec();
}
UpdateServeThread::~UpdateServeThread()
{
}

void UpdateServeThread::checkUpdate()
{     

	QMutexLocker _locker(&m_mutex);
	switch(m_state)
	{
	case None://向客户端发送更新邀请
		{  qDebug()<<m_socket->size();
			if(m_files.size())
			{
				auto _file = m_files.last();
				QByteArray _byte0;
				QDataStream _s(&_byte0,QIODevice::WriteOnly);
				_s << _file.size();	
				_s << _file.fileName();
				_s <<  UpdateCmd;		
				/*	_s << _file.lastModified();
				_s << 512;*/
				qDebug()<< _file.size();
				qDebug() << _file.fileName();
				_byte0.resize(512);				
			    m_socket->write(_byte0);
				m_state = WaitCmdResult;
				qDebug()<<"发起更新申请";

			} 

		}break;
	case WaitCmdResult://等待接收客户端邀请回复
		{   qDebug()<<m_socket->size()<<"1111";
			if(m_socket->size() == 512 && m_socket->isReadable())
			{   qDebug()<<"222";	
			QByteArray _byte1 = m_socket->read(512);
			QDataStream _stream(_byte1);
			bool _update = true;
			int _type = 0;
			_stream >> _type;
			_stream >> _update;

			if(_type == UpdateCmdResult && _update)
			{

				m_currentFile.setFileName(m_files.last().absoluteFilePath());
				m_currentFile.open(QIODevice::ReadOnly);
				qDebug()<<"接收到更新确认,开始更新";

				m_state = Update;

			}
			}

		}break; 
	case Update://开始更新
		{   
			QByteArray _byte3 = m_currentFile.read(512); //每次读取数据大小

			m_socket->write(_byte3);
			/*m_currentFile.seek(m_currentFile.pos() + 1024);*/
			if(m_currentFile.atEnd())
			{ 

			m_currentFile.close();
			m_state =  OverSend ;
			emit updateProecessChange(m_updateCount-m_files.size(),m_updateCount);
			m_files.pop_back();	
			if(m_files.isEmpty())
			{    				
				qDebug()<<"所有文件发送完成";
				emit updateProecessChange(1,1);
				m_timer->stop();
			}
			}						                                                                                          
		}break;
	case OverSend :
		{    
			qDebug()<<m_socket->size()<<"等待结束";
			QByteArray  _over1 = m_socket->read(512);
			QDataStream _OverSend(_over1);
			int _over = 0;

				_OverSend >> _over;
				if (_over == recvOver)
				{
					m_state = None ;
				} 

		}break;
	}
}

void UpdateServeThread::setUpdate(const QList<QFileInfo> &files)
{
	QMutexLocker _locker(&m_mutex);
	m_files = files;
	m_updateCount = files.size();
	m_state = None;
	if(m_updateCount)
		emit startTimerSignal();
	else
		emit closeTimerSignal();
}

QString UpdateServeThread::clientName() const
{
	return QHostInfo::fromName(m_socket->peerAddress().toString()).hostName();

}
贴了,发送端的,你看下吧?不知道是线程问题还是 文件已经被打开,下一个客户端在连接时候再次打开文件产生了冲突还是?
taniz 2013-12-12
  • 打赏
  • 举报
回复
这种问题跟代码有关,贴代码吧楼主
帅得不敢出门 2013-12-12
  • 打赏
  • 举报
回复
办案讲究的是现场调查,光听目击者说效果就打折了
  • 打赏
  • 举报
回复
人呢,都出来帮忙解决下吧...
  • 打赏
  • 举报
回复
结贴;人都不见了.哎. 这叫一个凄凉啊
  • 打赏
  • 举报
回复
引用 17 楼 zhao4zhong1 的回复:
[quote=引用 13 楼 luoxuechengbing 的回复:] [quote=引用 11 楼 zhao4zhong1 的回复:] 听话,这才是好孩纸!
你坑人啊~! 压根就没我想要的东西;[/quote] 如果你说eMule没有完美实现“多线程、断点续传、带进度条显示、同时传输多个文件”功能的话,可以当我没说。[/quote] 我可没有看到我这程序的原因是怎么引起的;
赵4老师 2013-12-12
  • 打赏
  • 举报
回复
引用 13 楼 luoxuechengbing 的回复:
[quote=引用 11 楼 zhao4zhong1 的回复:] 听话,这才是好孩纸!
你坑人啊~! 压根就没我想要的东西;[/quote] 如果你说eMule没有完美实现“多线程、断点续传、带进度条显示、同时传输多个文件”功能的话,可以当我没说。
  • 打赏
  • 举报
回复
每次 客户端链接呢,都会有一个新线程呗创建;理论上来说不应该出现这东西; 欢迎各路神仙帮忙推测,提出建议;

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧