عند تشغيل تطبيق بواجهة ذات إطارات ، من المهم التأكد من عدم وجود تجميد. لهذا ، يجب تشغيل الحسابات المعقدة في سلسلة رسائل منفصلة. يسير مفهوم التطبيق متعدد الخيوط بشكل جيد مع نهج فتحات إشارة Qt ، دون الحاجة إلى إعادة تعريف أي طريقة تشغيل ().
الفكرة الرئيسية. في تطبيق متعدد الخيوط ، تتم العمليات الحسابية في خيط منفصل ، وفي النهاية يتم إصدار إشارة ، وتنقل النتيجة في وسائطها. سيتم استدعاء فتحة مملوكة بالفعل من قبل MainWindow. ستكون نتائج الحساب في وسيطات الفتحة ولن يكون من الصعب إخراجها.
رسم تشبيه مع ميكروكنترولر ، إشارة هو انتقال على طول ناقلات المقاطعة ، والشق هو معالج المقاطعة نفسه. من أجل حدوث "مقاطعة" ، يجب أن تنبعث الإشارة: emit mysignalvoid ()؛ ثم ستبدأ شركة Qt في البحث عنها باستخدام "معالج" (فتحة). في كيو تي ، يمكنك تعليق العديد من الفتحات على إشارة واحدة.
يوضح الشكل التالي خوارزمية التطبيق التجريبي. مؤشر ترابط معالجة كل ثانية يستجواب وفقًا لجهاز USB HID. ثم تنبعث منها إشارة تنبعث منها ، والتي تعالج فتحة تنتمي بالفعل إلى MainWindow والتي لديها بالتالي القدرة على الرسم على النموذج.

لذلك ، لدينا فئات يمكن أن تستخدم نهج فتحة الإشارة. للقيام بذلك ، يستخدم تعريفهم الماكرو Q_OBJECT.
class Worker : public QObject { Q_OBJECT
لتمرير نتيجة العمليات الحسابية في الوسائط ، من الضروري
تسجيل الأنواع المستخدمة للوسائط. يمكنك القيام بذلك في أماكن مختلفة ، ولكن عادة في مُنشئ الفصل ، والذي سيعمل بعد ذلك مع هذه الأنواع:
Worker::Worker(){ qRegisterMetaType<std::size_t>("size_t"); qRegisterMetaType<uint8_t const *>("uint8_t const *");
بعد ذلك ، يتم إنشاء مؤقت في مُنشئ سلسلة العمليات المعالجة. كل ثانية ، سيتم استدعاء فتحة معالجة updateUSBDataCallback. انتبه إلى بناء جملة اتصال إشارة الفتحة في Qt5.
this->timerDeviceRead = new QTimer(); connect(Worker::timerDeviceRead, &QTimer::timeout, this, &Worker::updateUSBDataCallback); this->timerDeviceRead->start();
ما يلي هو نص فتحة مؤشر ترابط المعالجة. يجب أن تكون كل الشفرة الطويلة هنا.
void Worker::updateUSBDataCallback(){ size_t mysize = 65; uint8_t buf[65] = { "I like USB HID" }; emit GuiUpdatePlease(buf,mysize);
للتوضيح هنا ، مباشرة بعد إرسال الإشارة إلى فتحة MainWindow ، يتم تعديل محتويات الصفيف بوقاحة. ونظرًا لتمرير الصفيف بواسطة المؤشر ، يتم الحصول على قراءة متسخة. لمنع حدوث هذا الموقف ، يجب توصيل الإشارة من مؤشر ترابط المعالجة بفتحة GuiUpdateCallback () بطريقة معينة:
MainWindow::MainWindow{ connect(worker, &Worker::GuiUpdatePlease, this, &MainWindow::GuiUpdateCallback, Qt::BlockingQueuedConnection);
في هذه الحالة ، عند إصدار إشارة ، يتم حظر مؤشر ترابط المعالجة حتى نهاية فتحة GuiUpdateCallback ().
إذا كان "uint8_t const *" الطويل يربكك في نص البرنامج ، فيمكنك الحصول على مرادف TU8PTR:
typedef uint8_t const * TU8PTR;
شفرة المصدر