2017-10-05 7 views
0

割り当て用のクッキー工場シミュレーションプログラムを作成する必要があります。プログラムのGUIは、通常のQtウィジェット(ラベル、ボタン、行編集など)を使用して、シミュレーション変数とオブジェクトを制御します。私はすでにGUIを作成しましたが、シミュレーションの実行方法はわかりません。Qtを使用したシミュレーションループ

私たちの先生は、スレッド(マシンごとに1つ)を使用するように教えてくれました。私はQThreadsを読みましたが、(linkから)他のスレッドからオブジェクトにアクセスするのにはあまり理想的ではないという印象を受けました。それらの作成方法や処理方法はわかりません。

しかし、シミュレーションは1つのループ(1つのスレッド)で行うことができるほど簡単ですが、QMainWindowクラスでこのループを作成する方法はわかりません。

私の主な質問は次のとおりです。GUIにアクセスできるループを実行し、GUIによってアクセスできるようにする(マシンの値を変更できるようにする)ために、マシンにアクセスできますか?私はGUIとシミュレーションをどのように接続するのか本当に分かりません。

ありがとう、長いポストのために申し訳ありません。

編集#1:私が何をしようとしています何の擬似コード:

// Machines' initialization: 
rawMaterialsTransport = new RawTransport(); 
doughMachine->conveyour = doughConveyour; 

// Simulation loop: 
lastTime = 0 
while(running) { 
    // Handle pauses. 
    while(simulationPaused) { 
     sleep(100); 
    } 

    // Update machines/do the simulation 
    timePassed = now() - lastTime 
    lastTime = now() 

    rawMaterialsTransport->update(timePassed); 
    doughMachine->update(timePassed); 
    chocolateMachine->update(timePassed); 
    doughConveyour->update(timePassed); 

    // Update the GUI 
    chocolateGramsProcessedLabel->setText(to_string(chocolateMachine->gramsProcessed())); 

    // Sleep so as to not waste 
    sleep(100); 
} 


// On the GUI side: 
onLineEditEnter() { 
    doughMachine->gramsPerSecond = double(lineEdit->text); 
} 

onPauseButtonPress() { 
    simulationPaused = !simulationPaused; 
} 
+0

正確に何をしようとしているのか分かりません。たぶん、いくつかのコードを表示します。それに応じて私はさまざまな解決策を見ています。おそらく:ループは使用せず、信号とスロットを使用してください。 QCoreApplication :: processEvents()(しない)、QEventLoop、QThread :: exec()、QObject :: moveToThread()、またはQTimer :: singleShot()。また、スレッド間で信号を送信することもできます。 – SteakOverflow

+0

疑似コードを追加しようとします。 – sempiedram

+3

あなたがスレッドを使用しないことに決めたなら、ここでは必要ないように私は同意しました。あなたはQTimerのセットをsleep()の代わりにSlotに接続することをお勧めします。ほとんど決して良い考えではありません。 – Marco

答えて

2

あなたはシグナルとスロットを使用することができます。

GUIでは、GUIアイテム(ボタン、行編集など)によって生成された信号を、ビジネスロジックを実行するカスタムスロットに接続します。たとえば、ボタンを押すとclicked信号が出力されます。

スロット内のビジネスロジックの処理が終了した場合、GUIを更新するウィジェットのスロットに接続された別の信号を送信します。

GUIがハングアップする、つまりビジネスロジックの処理に時間がかかる場合は、ビジネスロジックを実行するために別のスレッドを開始する必要があります。 信号とスロットもスレッド間で動作します。

+0

一時停止ボタンが押されていない限り、シミュレーションが継続的に実行されているため、スロットの使用に問題はありませんか?とにかく、ありがとう。私はちょっと気分が悪い。私はあなたのリンクを読むでしょう。 – sempiedram

+0

@sempiedramそれはあなたの必要に応じて異なります。アイデアを得るために、私はその記事を編集し、スレッドがループを開始する例を追加しました。 –

関連する問題