مشکل در دانلود فایل بوسیله QNetWorkAccessManager و Qthread - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

مشکل در دانلود فایل بوسیله QNetWorkAccessManager و Qthread

0 امتیاز

سلام بر همگی

من یک کلاس برای QNetWork نوشتم بعد از QThread ارث بردم  بعد  کلاس یک سری فیل د private داره

    QNetworkReply* currentReply_;
    QTime downloadTime_;
    QQueue <QUrl> downloadQueue_;
    QNetworkAccessManager *manager_;
    QFile output_;

من currentReply رو داخل سازنده کلاس new کردم بعد بر اساس doc خود  Qt بقیه کدم رو نوشتم ولی وقتی که اجرا میشه این ارور رو میده :

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNetworkAccessManager(0x13e09dc8), parent's thread is QThread(0x37860), current thread is DownloadManager(0x13e987e8)

به نظر خودم که کد درسته مشکلش چیه به نظرتون ؟

سوال شده بهمن 13, 1392  بوسیله ی هفت خط (امتیاز 116)   1 10 17

3 پاسخ

+2 امتیاز
 
بهترین پاسخ

یه مسئله دیگه، اصلا نیازی به QThread نیست.

اگه میخواهید این کار رو داخل threadانجام بدید به این شکل عمل کنید:

bool WebService::downloadFile(QString serverAddress, QString localAddress)
{
    QNetworkAccessManager accessManager;
    QEventLoop loop;
    connect(&accessManager, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit()));

    QNetworkReply *reply = accessManager.get(QNetworkRequest(QUrl(serverAddress)));

    loop.exec();
    QFile file(localAddress);

    if(file.open(QIODevice::WriteOnly)){
        file.write(reply->readAll());
        file.close();
        return true;
    }else{
        return false;
    }
}

در غیر اینصورت و بدون thread نیاز به یه کانکت هست که از اتمام کار مطلع شوید.

_manager = new QNetworkAccessManager(this);
    connect(_manager, SIGNAL(finished(QNetworkReply*)),
             this, SLOT(replyFinished(QNetworkReply*)));

 

پاسخ داده شده بهمن 14, 1392 بوسیله ی حامد مصافى (امتیاز 1,104)   2 3 12
انتخاب شد بهمن 14, 1392 بوسیله ی هفت خط
+2 امتیاز
شما در داخل thread یک object ایجاد کرده‌اید و parent آن object در thread ایجاد شده است
پاسخ داده شده بهمن 13, 1392 بوسیله ی حامد مصافى (امتیاز 1,104)   2 3 12
سلام ولی من اصلا parent نزاشتم برای obj ام ! این کد شه :
DownloadManager::DownloadManager(QObject *parent):
    QThread(parent)
{
    manager_=new QNetworkAccessManager;
    
}

کد های thread رو هم از داخل متد run اجرا می کنم
+2 امتیاز
شما manager رو در هدر تعریف کرده‌اید. تعریف شی رو در همون run انجام بدید و نتیجه دریافتی از اینترنت رو داخل QNetworkReply بریزید
پاسخ داده شده بهمن 14, 1392 بوسیله ی حامد مصافى (امتیاز 1,104)   2 3 12
ویرایش شده بهمن 14, 1392 بوسیله ی حامد مصافى
مرسی با این روش درست شد . البته کدمو الان دارم عوض می کنم با اون یکی روشی که گفتین می نویسم .
...