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);
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值