2017-05-22 10 views
0

私は現在、リモートサーバーとのデータ同期を必要とするゲームプロジェクトに取り組んでいます。このデータは、ロックされていないレベルやプレーヤーアイテムのようなゲーム状態に過ぎません。だから私は、非同期HTTPポスト要求を使用してサーバーにローカルデータをプッシュする責任があるシングルトンオブジェクトを持っています。私はこのメソッドをいつ呼び出すのか決定できません。デコンストラクタで非同期メソッドを呼び出した後の結果はどうなりますか?

1つのアイデアは、ゲームを閉じる直前に更新されたゲーム状態を送信することです。私はC++で作業しています。まあ、私はデコンストラクタがこのためではないことを知っていますが、私がデコンストラクタでそれを行うことができれば、すべての進捗状況がサーバにプッシュされることを確信できます。

しかし、私はデコンストラクタで非同期メソッドを呼び出すことの結果を実際には推測できません。少なくとも応答が毎回到着しても、アプリケーションは生き続けることができますか?本当に悪いことをやっているの?

答えて

0

少なくとも応答が毎回到着してもアプリケーションは有効になりますか?

本当に悪いそのような何かをしているのですか?

はい。

デストラクター呼び出しの最後では、すべてのメンバーが割り当ての逆の順序で割り当て解除されます。この解放されたメモリ(つまり非同期関数)を利用しようとする人がいると、コンパイラ/ OS /ソースに応じてアクセス違反/セグメンテーション/未定義の動作になります。

戻り値を保証するには、非同期呼び出しを同期呼び出しにする必要があります。通常、これはロック/通知パターンを使用するか、アプリケーションがマルチスレッドの場合は単純なスレッド結合を使用して実行できます。

0

どのようにコードが配置されているかによって異なります。

デストラクタから非同期メソッドを呼び出すことに本質的に間違っているものはありません。別のスレッドで何かをしたいのであれば、スレッドがオブジェクトからのリソースを必要としないことを確かめることができます。

問題は、応答を待っていて、保存状態がどこかで保持されていることを確認するまでゲームを終了しないようにしているようです。非同期要求を送信した後でmain関数が終了した場合、それは良いことではありません。ただし、非同期要求を行っているスレッドが終了する前に結合されていることを確認することができます。

しかし、設計によっては、データを保存するプログラムが終了する前に呼び出しを行うだけで済みます。例えば。

int main() 
{ 
    Game g; 
    //Game loop 
    ... 

    g.saveState(); 

    return 0; 
} 
関連する問題