سؤال

لدي خادم يمكن لعدة عملاء الاتصال به. العميل هو واجهة المستخدم الرسومية بينما الخادم هو سطر الأوامر. يحتوي العميل على العديد من الوظائف (مثل الاتصال وتسجيل الدخول) والتي يجب أن تتلقى ردًا عند إرسالها إلى الخادم.

في الأساس ، أحتاج إلى تشغيل وظائف QTCPSOCKET WAITFORCONNECTION و WAITFOREDYREAD. ومع ذلك ، أحتاج إلى القيام بذلك دون منع واجهة المستخدم.

ما فكرت في فعله هو ما يلي: اطلب من فئة (عميل) تطبيق QTREAD الذي يقوم بكل الانتظار. تم إنشاء هذا بشكل رئيسي.

Client::Client (...)
{
    moveToThread (this); // Not too sure what this does
    mClient = new QTcpSocket (this);
    start();
}

void Client::run (void)
{
    exec();
}

void Client::connectToServer (...)
{
    mClient->connectToHost (hostname, port);
    bool status = mClient->waitForConnected (TIMEOUT);

    emit connected (status);
}

void Client::login (...)
{
    ... Similar to connectToServer ...
}

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

QMetaObject::invokeMethod (mClient, "connectToServer", Qt::QueuedConnection,
    Q_ARG (const QString &, hostname), Q_ARG (quint16, port));

أحصل على فشل تأكيد في هذا (لا يمكنني إرسال الأحداث إلى كائنات مملوكة لخيط مختلف.) بما أنني جديد إلى حد ما على QT لا أعرف ما إذا كان ما أفعله هو الشيء الصحيح.

هل يمكن لأحد أن يخبرني إذا كان ما أفعله هو نهج جيد ، وإذا كان الأمر كذلك ، فلماذا يتعطل برنامجي؟

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

المحلول

لا أوصي بتشكيل سلسلة بدء في مُنشئ.

تهيئته مثل:

Client * client = new Client();
client->moveToThread(client);
client->start();

أو إذا كنت لا ترغب في استخدام مثل هذا الحل ، أضف مُنشئًا من قبل start(); خط this->moveToThread(this);

تحديث: آسف ، لم أر في المرة الأولى ، أن لديك هذه السلسلة.

نصائح أخرى

أفضل شيء هو عدم استدعاء أساليب مثل Waitforblah () ... إجبار حلقة الحدث على انتظار فترة غير محددة ، يقدم إمكانية تجميد واجهة المستخدم الرسومية خلال ذلك الوقت. بدلاً من ذلك ، قم بتوصيل إشارة QTCPSOCKE CONNORD () ببعض الفتحات التي ستقوم بتحديث واجهة المستخدم الرسومية الخاصة بك حسب الاقتضاء ، واترك حلقة الحدث تستمر كالمعتاد. قم بأشياءك المتصلة داخل تلك الفتحة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top