2017-01-13 3 views
1

すべてがタイトル:)スレッド/アプリケーションをフリーズせずにメソッドの実行を遅らせるには?</p> <p>私はQtのC++で小さなプレイ可能な数独ゲームを作成しました:私はこれが必要な理由

です。私はそれを解決するための古典的なバックトラッキング方法を作った。ユーザーは、解像度の進行状況をリアルタイムで確認できます。私はユーザーが解像度の速度を調整できるようにスライダーを入れました。

私はプロセスを遅くするために解決方法の物乞いに入れているものです:

sleep_for(milliseconds(delay)); //delay is a toggleable static variable 

が、ユーザが解像度を起動するのでので、彼はスピード(遅延)を変更することはできませんアプリケーションはほとんどの時間眠っています。

他の方法で処理を遅らせますか?

PS:私のラフな英語を言い訳してください:/

+0

Qthread – eyllanesc

+1

を使用する必要があります。QTimerがお手伝いをするかもしれません。 –

答えて

3

timerEvent()を使用します。 QObjectにはタイマーサポートが組み込まれています。各ゲームステップをtimerEvent()に入れ、必要な間隔でstartTimer()を呼び出します。これははるかに簡単な方法です。

1

睡眠は、ユーザーが速度を変更できるようにしたい場合は、他のことを行うためのプロセッサまでそれ自由のようなアプリケーションを遅くするための良い方法です。別のスレッドでこれを実行する必要があります。その時間が変更されると、スリープしているスレッドが中断し、新しい遅延が設定されます。

+0

スリープ中のスレッドを中断する代わりに、共有変数へのアクセスを同期することもできます。 ( 'std :: atomic'で十分でしょう) – qxz

+0

@qxz sleepオプションに0-10sの範囲を許可するとします。その後、10秒から0秒に変更すると最大10秒かかることがあります。中断は解決する1つの方法です(他にもあります)。 –

-2

さてあなたがループを作るとはWindows.h

int fps = 1000/30; 
while(running){ 
    Sleep(fps); 
    draw(); 
} 

または

それらを組み合わせることで含めることによって間隔

int interval = 0; 
while(running){ 
    interval++; 
    if(interval == 60){ 
     draw(); 
    } 
} 

や睡眠を使用してのセットでドロー/書き込み機能を呼び出します

int fps = 1000/30; 
int interval = 0; 
while(running){ 
    interval++; 
    Sleep(fps); 
    if(interval == 30){//every more or less 1 sec 
     draw(); 
    } 
} 
+2

私はビジーウェイトに対してアドバイスをします。なぜなら、それらはCPU時間を使い果たしてしまうからです。あなたは忙しいウェイターで、正確に数を使って遊ぶことなく、正確な魔法の定数を知っていなくても、ただ一つのマシンの魔法の定数を知っています。 「スリープ」は、どのマシンでも正確な量(多かれ少なかれ)でスリープ状態になります。そして、あなたの忙しい例では、_ draw _関数が一度_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ –