いくつかの計算集約型タスク (マシン ビジョン) 用の C++ クラス ライブラリを開発しています。
// I am a part of a Qt-agnostic library
class Cruncher
{
/* ... */
public:
void doStuff();
};
次に、そのライブラリを使用する Qt GUI があります。ライブラリから負荷の高いルーチンを呼び出すワーカー スレッドを作成しています。
// I am a part of a Qt-based GUI which utilizes the library
class Worker : public QThread
{
/* ... */
protected:
virtual void run()
{
/* ... */
Cruncher c;
for (int i = 0; i < count; ++i)
c.doStuff(); // takes some time, and while it's working
// it should communicate status changes which should
// become visible in the GUI
}
};
doStuff() の内部では多くのことが起こり、doStuff() が戻るのを待たずに、何が起こっているかについてユーザーにフィードバックを提供したいと考えています。1 つには、doStuff() を呼び出すたびにメーターを 1 ステップずつ増やすだけでなく、細かい進捗レポートを作成できる可能性があります。また、doStuff() は、作業の一部を続行できる重大ではない障害に遭遇する可能性がありますが、Cruncher が動作している (および Worker が現在 への呼び出しでビジー状態である) ときに、これが発生したときに GUI にメッセージを表示したいと考えています。 doStuff()))。
ライブラリを Qt に依存しないままにしたいので、Cruncher にシグナルとスロットを追加する気はありません。Qtクラスではない場合にGUIにフィードバックを提供してその作業を報告できるようにする他の方法はありますか?
Worker の実行中に一定の間隔で Cruncher の「status」および「errorMsg」メンバーをポーリングする QTimer を作成することを検討していましたが、これは非常に最適ではないようです。