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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章