Qtカード熱負荷-QPluginLoader実現
1839 ワード
前のC++メッセージフレームワーク-sigslotに基づいて、sigslot信号スロットを使用して自分のメッセージフレームワークを実現することについて述べました.これは比較的粗く、小さなフレームワークです.プログラムが徐々に大きくなると、機能のプラグイン化を考慮したり、一部のモジュールの動的ロードとアンインストールをサポートしたりする可能性があります.
機能のダイナミックロード、つまり私たちが普段言っているプラグイン化、プラグインはホットスワップをサポートします.
前の仕事で、ちょうどこの部分に触れたことがあります.以下はQtがdllをロードする方法で、dllをロードした後、PluginInterfaceインタフェースに変換してみることができます.変換に成功すれば、このdllが必要なプラグインであることを説明し、プラグインの初期化を行うことができます.
プラグインコードがメインプログラムと通信する必要がある場合は、プラグインを初期化するときに関連パラメータを渡すだけです.
上記のコード疑似コードは以下の通りです.
転載先:https://www.cnblogs.com/swarmbees/p/10831111.html
機能のダイナミックロード、つまり私たちが普段言っているプラグイン化、プラグインはホットスワップをサポートします.
前の仕事で、ちょうどこの部分に触れたことがあります.以下はQtがdllをロードする方法で、dllをロードした後、PluginInterfaceインタフェースに変換してみることができます.変換に成功すれば、このdllが必要なプラグインであることを説明し、プラグインの初期化を行うことができます.
プラグインコードがメインプログラムと通信する必要がある場合は、プラグインを初期化するときに関連パラメータを渡すだけです.
void ReadPluginsInfo( const QString & pluginsDirPath /*= ""*/ )
{
QString pluginsPath = pluginsDirPath;
if (pluginsDirPath.isEmpty())
{
pluginsPath = QApplication::applicationDirPath();
}
QDir pluginsDir(pluginsPath);
pluginsDir.cd("Plugins");
QFileInfoList pluginsFile = pluginsDir.entryInfoList(QStringList() << "*.dll", QDir::Files);
foreach(QFileInfo fileInfo, pluginsFile)
{
QPluginLoader loader(fileInfo.absoluteFilePath());
bool isLoad = loader.isLoaded();
QString info = loader.errorString();
if (QObject * plugin = loader.instance())
{
if (PluginInterface * pinterface = dynamic_cast(plugin))
{
pinterface->install(PluginParam());//
m_lstPluginInterFace.push_back(pinterface);
}
}
else
{
qDebug() << loader.errorString();
}
}
}
上記のコード疑似コードは以下の通りです.
void ReadPluginsInfo( const QString & pluginsDirPath /*= ""*/ )
{
dll
foreach(dll )
{
QPluginLoader
if ( )
{
}
}
}
転載先:https://www.cnblogs.com/swarmbees/p/10831111.html