ฉันกำลังสร้างแอปพลิเคชันที่ต้องอาศัยปลั๊กอินอย่างมาก โดยแกนหลักจะรับข้อมูลจากอินเทอร์เฟซแบบอนุกรมและส่งไปยังปลั๊กอินแต่ละตัว เพื่อให้แต่ละคนตัดสินใจได้ว่าจะทำอย่างไรกับปลั๊กอินนั้น
การออกแบบของฉันอนุญาตให้ปลั๊กอินสร้างวิดเจ็ตที่แนบมากับ MDIArea ผ่าน QMdiSubWindow สิ่งนี้ใช้ได้จนกระทั่งฉันต้องการ mutexes เนื่องจากทุกอย่างทำงานในเธรดเดียวกัน ฉันจึงเกิดการหยุดชะงักอย่างรวดเร็ว ดังนั้นฉันคิดว่าการย้ายปลั๊กอินแต่ละตัวไปยังเธรดอื่นสามารถแก้ปัญหานี้ได้ ปัญหาคือ (ในตอนนี้) QMdiSubWindow ไม่ได้ถูกสร้างขึ้นอีกต่อไป และฉันไม่รู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้น
แกนหลักสื่อสารกับปลั๊กอินโดยใช้สัญญาณและช่อง
นี่คือวิธีที่ฉันโหลดปลั๊กอินและย้ายไปยังเธรด:
QPluginLoader loader( the_path );
QObject* plugin = loader.instance();
if( plugin!=0 )
{
//Connect install subwindows request
connect( plugin, SIGNAL(install_plugin_window(QString,QWidget*)), this, SLOT(onRequestInstallSubwindow(QString,QWidget*)) );
QThread* consumer = new QThread;
plugin->moveToThread( consumer );
consumer->start();
PluginInterface* pl = qobject_cast<PluginInterface*>(plugin);
pl->registerSubWindow();
}
โปรดทราบว่านี่คือการทำให้โค้ดต้นฉบับง่ายขึ้น ฉันปฏิบัติตามแนวทางนี้ (ย้ายปลั๊กอินของฉันไปที่เธรด) ตามบทความนี้ http://www.christeck.de/wp/2010/10/23/the-great-qthread-mess/
registerSubWindow() เป็นวิธีการในปลั๊กอินของฉันที่สร้างวิดเจ็ต:
void PluginDrier::registerSubWindow()
{
widget = new Form();
emit install_plugin_window( "Plugin Widget", widget );
}
ซึ่งส่งสัญญาณที่แกนจับด้วยสล็อตนี้ ซึ่งลงทะเบียนวิดเจ็ตที่สร้างขึ้นเป็น MdiSubWindow ที่กล่าวถึง:
void MainWindow::onRequestInstallSubwindow( QString title, QWidget* content )
{
QMdiSubWindow* subwindow = ui->mdiArea->addSubWindow( content );
subwindow->setWindowTitle( title );
subwindow->setWindowFlags( Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint );
}