现在遇到的情况是这样的 多个线程分段去服务器下载,然后每个线程在把自己下载回来的数据写到文件的相应位置,但是不知道如何同步,文件老是出错
现在遇到的情况是这样的 多个线程分段去服务器下载,然后每个线程在把自己下载回来的数据写到文件的相应位置,但是不知道怎么同步,文件老是出错啊
inBlock = commandClient->readAll();
lock.tryLockForWrite();
//startByte = bytesReceived;
localFile->seek(startByte + bytesReceived);
qint64 data = localFile->write(inBlock);
lock.unlock();
bytesReceived += data;
qDebug()<<"thread"<<ThreadId<<"have receiveed"<<bytesReceived;
emit bytesDownload(data);
inBlock.resize(0);
Qt高手们,能不能给点意见,线程的代码是这样实现的,但是结果不对,有时候文件大的时候,线程数多的情况下客户端还会崩溃,这是毕业设计啊 20号交稿
------解决方案--------------------
一般的做法都是先把文件生成要下载的大小,然后打开多个句柄,各写各的位置,也不需要lock什么的
------解决方案--------------------
多线程去下载,这个思路是对的,因为存在网络瓶颈
写文件,有必要用多线程吗?硬盘上的单文件访问存在瓶颈吗?你又不是搞内存盘,呵呵呵
------解决方案--------------------
参考eMule源代码
------解决方案--------------------
很简单的问题:不用多线程写入。
你让下载线程将内容下载到内存,放入自己定义的一个个缓冲里。缓冲里除了文件数据外还带有这些数据在文件中的位置信息。
然后另开一个写入线程,从缓冲池里获取到这些数据,并将之逐个写入文件里。
设置一个空闲缓冲池和一个满载缓冲池,分别容纳不同状态的缓冲。给它们定义好信号,通过信号量管理线程间同步关系。
inBlock = commandClient->readAll();
lock.tryLockForWrite();
//startByte = bytesReceived;
localFile->seek(startByte + bytesReceived);
qint64 data = localFile->write(inBlock);
lock.unlock();
bytesReceived += data;
qDebug()<<"thread"<<ThreadId<<"have receiveed"<<bytesReceived;
emit bytesDownload(data);
inBlock.resize(0);
Qt高手们,能不能给点意见,线程的代码是这样实现的,但是结果不对,有时候文件大的时候,线程数多的情况下客户端还会崩溃,这是毕业设计啊 20号交稿
------解决方案--------------------
一般的做法都是先把文件生成要下载的大小,然后打开多个句柄,各写各的位置,也不需要lock什么的
------解决方案--------------------
多线程去下载,这个思路是对的,因为存在网络瓶颈
写文件,有必要用多线程吗?硬盘上的单文件访问存在瓶颈吗?你又不是搞内存盘,呵呵呵
------解决方案--------------------
参考eMule源代码
------解决方案--------------------
很简单的问题:不用多线程写入。
你让下载线程将内容下载到内存,放入自己定义的一个个缓冲里。缓冲里除了文件数据外还带有这些数据在文件中的位置信息。
然后另开一个写入线程,从缓冲池里获取到这些数据,并将之逐个写入文件里。
设置一个空闲缓冲池和一个满载缓冲池,分别容纳不同状态的缓冲。给它们定义好信号,通过信号量管理线程间同步关系。