私は実装したゲームのためのスレッドを形成する最良の方法についてちょっと混乱します。ゲームはとてもシンプルです。あなたの宇宙船を操り、入ってくる壁をかわす必要があります。RTOSとスレッドを使用する
現時点では、私のコードは宇宙船が爆破するまでループします。 (ゲームオーバーであればnotBlownUp()
はfalseを返します)このwhileループによって表される:アップデートには依存宇宙船
while(notBlownUp()) {
osSignalSet(tid_taskDisplay, 1U);
}
は、これはtaskDisplay()
void taskDisplay(void const *argument){
for (;;) {
osSignalWait(1U, osWaitForever);
drawEverything();
osSignalSet(tid_taskWall, 1U);
osSignalSet(tid_taskSpaceship, 1U);
}
}
void taskDisplay(void const *argument);
osThreadId tid_taskDisplay;
osThreadDef(taskDisplay, osPriorityAboveNormal, __FI, 0);
するための信号を設定し、すべてのtaskWall
とは何ですユーザ入力:
void taskSpaceship(void const *argument){
for (;;) {
osSignalWait(1U, osWaitForever);
updateSpaceship();
}
}
osThreadId tid_taskSpaceship;
osThreadDef(taskSpaceship, osPriorityAboveNormal, __FI, 0);
taskWall
はと全く同じです357壁を更新するだけです。
私の質問は、何度も何度もやっているときにスレッドを持っている点です。あるいは、私はこれを完全に間違っているのですか?
コードは、基本的にこの順序で実行されている:
taskDisplay - > taskWall - > taskSpaceship - > taskDisplay - > taskWall - > taskSpaceship
私には、それのシーケンシャルネスは、私を作ります間違ったスレッドを使っていると思います! - 経過時間に基づいて駒を動かす>ゲーム物理学のアップデート
キーボードイベント - >プロセスユーザー入力
その方法
クロック・チックのイベント:
プログラムが純粋に連続している場合は、実際にはスレッドを使用する必要はありません。つまり、スレッディングはまだ素晴らしい抽象化を提供し、正しく使用するとコードの一部を単純化するのに役立ちます。誤って使用すると、作業がはるかに複雑になる可能性があります。 "なぜスレッドを使うのか"を素早く検索すると、[this](http://stackoverflow.com/questions/2857184/when-should-i-use-threads)などの興味深い結果が得られました。編集:[this](https://www.cs.mtu.edu/~shene/NSF-3/e-Book/FUNDAMENTALS/threads.html)大学レベルのcsクラスのWebページ。 – mgarey
ええ、それは私が考えていることを参照してください。しかし、実際にはプログラムは完全にシーケンシャルなので、プログラムを作成して、できる限りスレッドに移行したいと思っていました。 @ mgareyそして私は必ずしも必要ではないことを知っていますが、学習目的のために私はしたいと思います。私は、 'taskSpaceship'と' taskWall'は何とか非同期的に実行できると信じています。 – user3667111
あなたのコードでは、 'taskWall'と' taskSpaceship'は並行して実行されませんか? – agbinfo