QT下的线程问题,纠结死了。。。

柳11 2013-06-19 08:52:26
废话不多说,代码先贴上!
这是共享的头文件

#ifndef LHT_GD_FORWARD_H
#define LHT_GD_FORWARD_H

class QtNetwork;
class QUrl;
class QFtp;
class QFile;
class QFileInfo;

#endif // LHT_GD_FORWARD_H

模块的头文件

#ifndef LHT_GD_FTP_H
#define LHT_GD_FTP_H

#include <QThread>
#include "forward.h"

/*!
*ftp class
*/
class LFtp : public QThread
{
Q_OBJECT
public:
/*!
*function:默认构造函数
*descri:默认构造函数
*note:默认构造函数
*@param parent 是所有类的父类
*return:无
*/
explicit LFtp(QObject *parent = 0);
/*!
*function:下载单个文件
*descri:继续登陆ftp服务器并且下载文件
*note:无
*@param url 是下载文件的地址
*return:无
*/
void DownloadFile(const QUrl &m_url);
/*!
*function:下载更多的更新文件
*descri:调用DownloadFile()
*note:无
*@param:无
*return:无
*/
void Update();
/*!
*function:线程里的run函数
*descri:重载run函数
*note:无
*@param:无
*return:无
*/
void run();
signals:
/*!
*function:信号函数
*descri:当接受完文件后,触发Done()
*note:无
*@param:无
*return:无
*/
void ReceiveData();
public slots:
/*!
*function:信号槽
*descri:处理文件的函数
*note:无
*@param:error 是是否下载完成的标志
*return:无
*/
void Done(bool error);
private:
QFtp *m_Ftp; //Ftp指针
QFile *m_File; //File指针
};
#endif // LHT_GD_FTP_H

模块的cpp文件

/*!
* Copyright (c) 2010 LandhightechInc. All rights reserved.
* Contact: liumao
* datetime:2013-06-19
* name:ftp.cpp
* function:download file from server
*/
#include "ftp.h"
#include <iostream>
using namespace std;

LFtp::LFtp(QObject *parent) :QThread(parent){
m_Ftp = new QFtp(this);
QObject::connect(m_Ftp,SIGNAL(ReceiveData(bool)), this, SLOT(Done(bool)),Qt::DirectConnection);
}

void LFtp::DownloadFile(const QUrl &m_url) {
QFileInfo fileInfo(m_url.path());
QString fileName = fileInfo.fileName();
m_File = new QFile(fileName);
if (!m_File->open(QIODevice::WriteOnly)) {
cerr << "Unable to save the file" << endl;
delete m_File;
m_File = 0;
return;
}
ftp->setTransferMode(QFtp::Passive);
ftp->connectToHost(m_url.host(), m_url.port(21));
ftp->login("anonymous","");
ftp->get(m_url.path(), m_File);
ftp->close();
emit ReceiveData();
}

void LFtp::Done(bool error) {
if (error) {
cerr << "Error: " << qPrintable(m_Ftp->errorString()) << endl;
} else {
cerr << "File downloaded as " << qPrintable(m_File->fileName())
<< endl;
}
m_File->close();
delete m_File;
m_File = 0;
}

void LFtp::run(){
Update();
}
void LFtp::Update(){
QUrl m_url("ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.10.tar.xz");
DownloadFile(m_url);
}

这是测试文件

#include <QCoreApplication>
#include "ftp.h"

int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
LFtp ftp;
ftp.start();
return app.exec();
}

在这里想问下大伙,我只想用线程来处理自动更新的模块,但是有error,很莫名其妙的错误,刚接触QT不久,忘大神拯救。note:有一个线程可以的!
...全文
190 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
寒山-居士 2013-06-25
  • 打赏
  • 举报
回复
引用 5 楼 liumaoye 的回复:
[quote=引用 4 楼 Esonpo 的回复:] 你是下载一个ftp服务器上面的文件嘛,用QNetworkAccessManager很给力的,不建议使用QHttp或者Qftp,因为Qt5.0以上都丢弃了,要想移植方便的话,建议使用以上网络相关的类
恩,公司老大叫用ftp,没得办法,。。,只能这样了,谢谢!结贴了![/quote] 那你以后移植到qt5.x版本也得重新写或者把qftp源码加进去才是
柳11 2013-06-25
  • 打赏
  • 举报
回复
结贴了,谢谢大家!
柳11 2013-06-25
  • 打赏
  • 举报
回复
引用 4 楼 Esonpo 的回复:
你是下载一个ftp服务器上面的文件嘛,用QNetworkAccessManager很给力的,不建议使用QHttp或者Qftp,因为Qt5.0以上都丢弃了,要想移植方便的话,建议使用以上网络相关的类
恩,公司老大叫用ftp,没得办法,。。,只能这样了,谢谢!结贴了!
寒山-居士 2013-06-22
  • 打赏
  • 举报
回复
你是下载一个ftp服务器上面的文件嘛,用QNetworkAccessManager很给力的,不建议使用QHttp或者Qftp,因为Qt5.0以上都丢弃了,要想移植方便的话,建议使用以上网络相关的类
KeequenLiu 2013-06-20
  • 打赏
  • 举报
回复
emit ReceiveData();是不是应该传递bool开参呢? qthread类,它有线程执行完成后的finished()信号通知,你不必自己写一个。
hnqxwhz 2013-06-20
  • 打赏
  • 举报
回复
楼上分析的很对。 QObject::connect(m_Ftp,SIGNAL(ReceiveData(bool)), this, SLOT(Done(bool)),Qt::DirectConnection); signals: void ReceiveData(); 这里的问题。
柳11 2013-06-19
  • 打赏
  • 举报
回复
头文件一次为,forward.h,ftp.h;cpp文件为ftp.cpp,便于大家建立工程!再次谢谢!

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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