首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

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

2013-07-08 
QT下的线程问题,纠结死了。。。废话不多说,代码先贴上!这是共享的头文件#ifndef LHT_GD_FORWARD_H#define LHT

QT下的线程问题,纠结死了。。。
废话不多说,代码先贴上!
这是共享的头文件


#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:有一个线程可以的!
Qt 多线程 类 C FTP
[解决办法]
emit ReceiveData();是不是应该传递bool开参呢?

qthread类,它有线程执行完成后的finished()信号通知,你不必自己写一个。

[解决办法]
楼上分析的很对。
QObject::connect(m_Ftp,SIGNAL(ReceiveData(bool)), this, SLOT(Done(bool)),Qt::DirectConnection);
signals:    void ReceiveData();
这里的问题。
[解决办法]
你是下载一个ftp服务器上面的文件嘛,用QNetworkAccessManager很给力的,不建议使用QHttp或者Qftp,因为Qt5.0以上都丢弃了,要想移植方便的话,建议使用以上网络相关的类

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

热点排行