ユーザーが表示された画像上のポイントを選択する一連の手順を実行するプログラムがあります。ユーザーがこれらのポイントを選択している間、実行を一時停止する適切な方法がわかりません。現在、私は次のようなものを使用しています:
while(m_MouseCount < 2)
{
qApp->processEvents(QEventLoop::WaitForMoreEvents);
if(m_cancelFlag){
// disconnect mousePressSignal
return;
}
}
私が遭遇している問題は、このループ中にウィンドウが閉じられたとき、プログラムがバックグラウンドで実行され続けることです。
この場合、有限状態マシンを使用する方が適切であることに気づきました。ここで行ったことは、「恐ろしい疑似同期」プログラミングです。ただし、FSMを使用した場合でも、ユーザーが選択した次の測定に進む前に、FSMがコースを実行するのを待つという問題があります。
ユーザー入力を待つより良い方法はありますか?
編集
QtのUIはイベント駆動型であり、通常は一時停止しないことを理解しています。私のプログラムは次のように機能します。
とにかく、ある種の一時停止や待機の周りは見当たりません。
最終結果がどうなるかは完全にはわかりませんが、UIを操作するときは、通常、独自のコードブロック/ループで何かを待とうとはしません。QT /他のフレームワークに、これらのループがどのように機能する必要があるかを処理させます。これには、「モーダル」ダイアログのブロックが含まれる場合と含まれない場合があります。
代わりに、物事(イベント)が発生するのを待つだけです。この場合、ユーザーが画像内の座標をクリックしたことをQTが通知するのを待ってから、それに応じてやりたいことを実行することをお勧めします。
ユーザーがタスクを完了する前にウィンドウを閉じようとしていることに気がある場合は、そのためのイベントもあります。
実際のコードではありません。
//measurements may want to be a UI thing, such as a table or whatever
//is suitable for your use . You would then also have the ability to go
//back and make corrections, etc.
measurements.push_back(Measurement("Measurement Foo"));
measurements.push_back(Measurement("Measurement Bar"));
currentMeasurement = 0;
myImage->addMouseDownHandler(std::bind(&MyApp::onImageClickedOn, this));
...
void MyApp::startMeasurement()
{
auto &measurement = measurements[currentMeasurement];
delete fromMarker; fromMarker = nullptr;
instructionCtrl->setText(
"Please select two points to define " +
measurement.getName());
}
void MyApp::onImageClickedOn(MouseEvent event)
{
if (!fromMarker)
{ //Create a marker where the from/start point is
//Likely wants to be visual/ui object to aid user
fromMarker = new FromSelectMarker(myImage, event.mousePos);
}
else
{
//Second point
auto from = fromMarker.getPos();
auto to = event.mousePos;
auto &measurement = measurements[currentMeasurement];
measurement.setPositions(from, to);
++currentMeasurement;
if (currentMeasurement < measurements.size()
{
startMeasurement();
}
else
{
//finished, do next thing
}
}
}
何らかの形のナビゲーションを使用して、多数の異なる有限の「状態」を通過する複雑な一連のユーザーが実際にいる場合は、FSMフレームワークが必要な場合があります。または、利用できる単純なものがない場合は、コードを整理して同様のものを取得できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加