سؤال

أنا أقوم بتطوير محاكاة. لقد اخترت QT ل GUI. يتضمن مشروعي الكثير من معالجة البيانات وأستخدم QT فقط لرسم نتائجي.

بنية الكود الخاصة بي هي أن وظيفتي الرئيسية تحتوي على كائن عالمي لبياني ، وكائن من واجهة المستخدم الرسومية QT وغيرها من الكائنات لمعالجة هذه البيانات. أحتاج إلى تعديل هذه البيانات في كل 30 مللي ثانية. لقد أرفقت أيضًا نسخة مبسطة من ملفي الرئيسي.

مشكلتي هي أنه لا يمكنني استدعاء وظائف كائناتي الأخرى (بخلاف واجهة المستخدم الرسومية) قبل الخروج من كائن QT. لقد قمت بتنفيذ أجهزة ضبط الوقت في QT بمعزل عن انخفاض البيانات الجديدة وتعمل بشكل جيد. كل ما أريد فعله هو استدعاء كائن AI و Physim في فترة زمنية معينة مستقل لكائن QT. أريد أن تكون هذه الأشياء الثلاثة مستقلة تمامًا.

world* _world;
int main(int argc, char *args[])

{
_world = new world();


gui *GUI; ///QT object

ai *AI;//object to manipulate data

phySim *sim;//object to manipulate data

/////////////////////////////////// this gets executed only when i close the QT gui
    AI = new ai(_world); 
AI->doSomething();

sim = new phySim(_world);
sim->updateWorld();
//////////////////////////////////////////////////////////////////////////////

QApplication app(argc,args);
GUI = new gui(_world);  
GUI->show();


return app.exec();  
} 
هل كانت مفيدة؟

المحلول

ربما يجب أن تحاول عدم تشغيل app.exec(), ، ولكن بدلاً من ذلك قم بإنشاء حلقة مخصصة (تقريبًا) لا حصر لها ، اتصل processEvents() داخل تلك الحلقة و updateWorld() بالإضافة إلى انتظار 30 مللي ثانية (أو أقل بقليل ، بسبب تنفيذ الوظيفة سيستغرق بعض MS). الرسم هو بعد ذلك جزء من QT (يجب أن تمرير مثيل المحاكاة الخاص بك وإضافة طريقة عرض (ربما الأفضل في OpenGL النقي ، حيث يمكن تمرير ذلك من خلال طبقة QT عبر QGLWidget). اتصل بهذه الطريقة داخل paint() أو الاحترام paintGL() بالنسبة لـ QGLWidget ، آمل أن يساعد هذا (قليلاً) ، يجب أن تقرأ QGLWidget Doc

ملاحظة: سيتعين عليك كتابة بعض الأغلفة في شكل إشارات ، واتصال أساليب SimulationObJ ، وإلا فلن يكون التفاعل بين واجهة المستخدم ممكنًا داخل QT.

نصائح أخرى

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

أنت تقول إنك تريد أن تكون الكائنات الثلاثة "مستقلة تمامًا" - ثم يجب عليك إعطاء كل واحد منهم موضوع خاص به.

كنت سأقترح تجاوز بعض أساليب الأحداث على Qaplication لكن حلقات الأحداث قد تكون صعبة نظرًا لأن لديك بعض "حلقات الأطفال" http://labs.trolltech.com/blogs/2010/02/23/unpredictable-exec. في واحدة من المحادثات التقنية لعام 2009 ، يوجد جزء يشرح هذا أيضًا.

تتمثل إحدى الطرق في فصل واجهة المستخدم الرسومية الخاصة بك أكثر قليلاً باستخدام بنية خادم العميل. يمكن أن يكون SIM الخاص بك هو الخادم و QT GUI العميل. هناك بعض العينات الجميلة في QT باستخدام مآخذ.

هناك طريقة أخرى تتمثل في استخدام QTIMER لتحديث (أو استطلاع) SIM الخاص بك. قد لا تحتاج حتى المواضيع.

 void SomeGUI::SomeGUI(..)...
 {
   //Init sim
   m_World = new world();
   m_AI = new ai(m_World); 
   m_Sim = new phySim(m_World);

  ...
  //Connect timer
  QTimer *timer = new QTimer(this);
  connect(timer, SIGNAL(timeout()), this, SLOT(updateWorld()));
  timer->start(100); //or whatever interval works
  ...

 }

 void SomeGUI::updateWorld()
 {
   //Update sim state
   m_AI->doSomething();
   m_Sim->updateWorld();
   updateGUI();
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top