メインスレッドに潜在的に非常に遅いタスクを含む大規模な MFC ベースのアプリケーションがあります。これにより、長いタスクを実際に処理しているときに、アプリケーションがハングしたように見えることがあります。ユーザビリティの観点から、私はユーザーに進行状況についてもう少しフィードバックを提供したいと考えています。長いタスクを別々のスレッドに分割することはより良い長期的な解決策ですが、実用的な短期的な解決策は、プログレスバーとキャンセルボタンを含むダイアログを備えた独自のオブジェクトにカプセル化された新しい GUI スレッドを作成し、 CWait オブジェクトと同様の方法です。メイン スレッドは、IsCancelled メソッドを介してキャンセル ステータスを監視し、必要に応じてスローを介して終了します。
これは合理的なアプローチですか? もしそうなら、私が使用できる MFC コードが既にいくつかありますか? 最初のスケッチはこんな感じ
class CProgressThread : public CWinThread
{
public:
CProgressThread(int ProgressMax);
~CProgressThread()
void SetProgress(int Progress);
BOOL IsCancelled();
private:
CProgressDialog *theDialog;
}
void MySlowTask()
{
CProgressThread PT(MaxProgress);
try
{
{
{ // deep in the depths of my slow task
PT.SetProgress(Progress);
if (PT.IsCancelled())
throw new CUserHasHadEnough;
}
}
}
catch (CUserHasHadEnough *pUserHasHadEnough)
{
// Clean-up
}
}
原則として、1 つの GUI スレッドと多数のワーカー スレッドを使用する傾向がありますが、このアプローチにより、リファクタリングとテストの手間が省ける可能性があります。深刻な潜在的な落とし穴はありますか?