QFtp 阻塞式调用

问题描述

Qt应用由于要跑在嵌入式Linux系统中,里面的Qt版本是4.8,所以决定采用QFtp来进行文件传输。QFtp有个问题是异步调用的,所以用起来很不方便,所以决定用QEventLoop来阻塞处理。

方案一

QFtp *ftp = new QFtp(this);
QEventLoop loop;
connect(m_ftp, SIGNAL(commandFinished(int,bool)), loop, SLOT(quit()));
ftp->get("test.dat");
loop.exec();

这个方案的思路是,调用ftp命令以后,开启事件循环,但是觉得还是有点问题的。如果ftp执行命令后,就已经发出commandFinished信号了,那loop就没法退出了。测试了一下这个方案,基本上都没问题,但是还是觉得有问题。

方案二

方案一的问题就是无法保证commandFinished信号在loop.exec()后面发出。改进方案如下:


//主要实现
private:
//定义一个全局变量,用于标识命令是否完成
bool m_bFtpCmdFinish;

//定义一个阻塞等待
void WaitFtpFinish(int mSec)
{
    QTime t = QTime::currentTime().addMSecs(mSec);
    while(!m_bCmdFinish && t > QTime::currentTime())
    {
        QEventLoop eventloop;
		QTimer::singleShot(100, &eventloop, SLOT(quit()));
		eventloop.exec();
    }
}

private slots:
//fpt命令开始信号
void OnFtpCmdStart(int cmd)
{
	m_bFtpCmdFinish = false;
}

//ftp命令结束信号
void OnFtpCmdFinish(int cmd)
{
	m_bFtpCmdFinish = true;
}

//调用
QFtp *m_ftp = new QFtp(this);
connect(m_ftp, SIGNAL(commandStarted(int)), this, SLOT(OnFtpcmdStart(int)));
connect(m_ftp, SIGNAL(commandFinished(int,bool)), this, SLOT(OnFtpcmdEnd(int)));
	
	
//防止ftp的commandStarted还没发出来,导致m_bCmdFinish没有复位,WaitFtpFinish就直接结束了
m_bCmdFinish = false;
m_ftp->get("test.dat");
//如果get调用以后,还没往下执行就结束了,那么m_bCmdFinish肯定为true了,则WaitFtpFinish直接返回。
//如果没有直接返回,那就一直等着以100ms为检测周期
WaitFtpFinish(15000);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章