我正在使用 Qt4 编写一个应用程序。
我需要从给定的 http 地址下载一个非常短的文本文件。
该文件很短,我的应用程序需要该文件才能继续,因此我想确保下载被阻止(或者如果文件未找到/不可用,则在几秒钟后超时)。
我想使用 QHttp::get(),但这是一个非阻塞方法。
我想我可以使用一个线程:我的应用程序会启动它,并等待它完成。该线程将处理下载并在文件下载完毕或超时后退出。
但我无法让它工作:
class JSHttpGetterThread : public QThread
{
Q_OBJECT
public:
JSHttpGetterThread(QObject* pParent = NULL);
~JSHttpGetterThread();
virtual void run()
{
m_pHttp = new QHttp(this);
connect(m_pHttp, SIGNAL(requestFinished(int, bool)), this, SLOT(onRequestFinished(int, bool)));
m_pHttp->setHost("127.0.0.1");
m_pHttp->get("Foo.txt", &m_GetBuffer);
exec();
}
const QString& getDownloadedFileContent() const
{
return m_DownloadedFileContent;
}
private:
QHttp* m_pHttp;
QBuffer m_GetBuffer;
QString m_DownloadedFileContent;
private slots:
void onRequestFinished(int Id, bool Error)
{
m_DownloadedFileContent = "";
m_DownloadedFileContent.append(m_GetBuffer.buffer());
}
};
在创建线程以启动下载的方法中,这是我正在做的事情:
JSHttpGetterThread* pGetter = new JSHttpGetterThread(this);
pGetter->start();
pGetter->wait();
但这不起作用,我的应用程序一直在等待。它看起来很亮,插槽“onRequestFinished”从未被调用。
有什么想法吗?
有更好的方法来完成我想做的事情吗?
最佳答案
您可以进入一个调用processEvents
的循环,而不是使用线程:
while (notFinished) {
qApp->processEvents(QEventLoop::WaitForMore | QEventLoop::ExcludeUserInput);
}
其中 notFinished
是一个可以从 onRequestFinished
插槽设置的标志。
ExcludeUserInput
将确保在等待时忽略 GUI 相关事件。
关于qt - 下载短文件期间阻止 Qt 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/250757/