سؤال

أنا أعمل على تطبيق يقوم بتحميل محتوى الملف إلى الخادم.

لتحميل الملف إلى الخادم ، أستخدم فئة "QNetworkAccAccessManager". نظرًا لأنه يعمل كوسيلة غير متزامنة ، فقد غيرت ذلك للعمل كوسيلة متزامنة باستخدام QeventLoop.

Class FileTransfer
{
Public : 
     QNetworkAccessManager mNetworkManager;
     Void Upload(QNetworkRequest request, QIODevice *data)
     {
           responce = mNetworkManager.put(request, data);
           EventLoop.exec();
           ReadResponce(responce);
      }

      Void Stop()
      {
            responce ->close();
      }
}

في تطبيق العينة لدي 2 windows. 1st لتحديد الملفات والثانية لإظهار التقدم.

عندما ينقر المستخدم على زر التحميل في النافذة الأولى ، سيتم عرض النافذة الثانية ثم أقوم بإنشاء ملف نقل الملف الكائن والبدء في التحميل.

أثناء تحميل الملف إذا أغلق المستخدم النموذج ثم في مدمرة النافذة ، أسميها توقف "نقل الملفبعد ذلك أحذف "نقل الملف' هدف.

ولكن هنا تحميل() الوظيفة لم تكتمل بعد بحيث ستعطل.

الرجاء مساعدتي في: كيف تنتظر 'قف()وظيفة حتى يتم اكتمال وظيفة التحميل ()

هل كانت مفيدة؟

المحلول

من ما يمكنني رؤيته من التعليمات البرمجية الخاصة بك ، فأنت تنفذ QeventLoop ولكنك لا تقوم بالفعل بتوصيل فتحة "الإقلاع" إلى أي إشارة. خذ أدناه كمثال ، تسجيل الدخول هو QHTTP - ويتم أخذ الكود من شيء مختلف - ولكن ينطبق المبدأ.

/* Create the QEventLoop */
QEventLoop pause;
/* connect the QHttp.requestFinished() Signal to the QEventLoop.quit() Slot */
connect(&login, SIGNAL(requestFinished( int, bool )), &pause, SLOT(quit()));
/* The code that will run during the QEventLoop */
login.request(header,&logmein,&result);
/* Execute the QEventLoop - it will quit when the above finished due to the connect() */
pause.exec();

يمكن تطبيق هذا على الكود الخاص بك ، إذا لم أكن مخطئًا ، مثل هذا ...

/* connect the signal to the relevant slot */
connect(&mNetworkManager, SIGNAL(finished( QNetworkReply )), &EventLoop, SLOT(quit()));
/* Execute the code that will run during QEventLoop */
responce = mNetworkManager.put(request, data);
/* Execute the QEventLoop */
EventLoop.exec();

الاعتذار إذا أخطأت في استفسارك! أنا فقط أحصل على السيطرة على QT مرة أخرى بعد استراحة ، لكنني أعتقد أن هذا ما تعنيه! حظا طيبا وفقك الله!

نصائح أخرى

أعتقد أنك بحاجة إلى إضافة شيء من هذا القبيل في وظيفة التحميل الخاصة بك:

if (upf->openFile())
{
    reply = manager->post(request, upf);
    connect(reply, SIGNAL(uploadProgress(qint64,qint64)), this, SIGNAL(progress(qint64,qint64)));
    connect(reply, SIGNAL(finished()), this, SLOT(replyFinished()));
    isInProgress = true;
    emit started();
} else
{
    emit finished(true, false, tr("Error: can't open file %1").arg(filename));
}

هنا هو رمز النص الكامل: Datacod-Qt-Tools

أتمنى أن يساعد ذلك.

أنا شخصياً أوصي بعدم استخدام أي من هذه الإجابات. سيكون يكفي توصيل مزلاج العد التنازلي بالإشارة.

لذلك يمكنك الكتابة:

Latch latch( 1 );
QObject::connect( reply, SIGNAL(finished()),
                  &latch, SLOT(countDown()) );

latch.wait();

لهذا ستحتاج إلى غلاف:

class Latch : public QObject {
    Q_OBJECT
public:
    Latch( uint count );
    void wait();
public slots:
    void countDown();
private:
    gcl::countdown_latch _latch;
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top