ゆとりーなの日記

日記的な事を書いて行くと思はれる

main関数が凄い事に

うちのngy313ライブラリでは多重起動を検出するためのクラスがあるのですが、こいつを使うとなるとmain関数の中が二重tryということになってしまいそうです。

#include <ngy313/process/process.hpp>
#include <ngy313/process/multiplex_starting_check.hpp>
using namespace ngy313::process;

int main() {
  try {
    // こいつのインスタンスが生きてる間だけ多重起動が検出できる
    // こいつはミューテクスの初期化に失敗すると例外を投げるのでtryブロックの外はまずいかもしれない
    const multiplex_starting_check check("henohenomoheji");
    try {
      if (check.multiplex_starting()) {
        // 多重起動はできませぬ
        return 0;
      }
      return run([] {/* 毎フレームする処理とか */}); 
    } catch(const std::exception &error) {
      // その他のエラー表示
      return 0:
    }
  // さすがにmultiplex_starting_checkがこけてたら多重起動検出は諦めざるを得ないからここはいい
  } catch(const std::exception &error) {
    // multiplex_starting_check checkのエラー表示
    return 0;
  }
}

multiplex_starting_checkのインスタンスが生きている間のみ多重起動を検出できるという事は、内側のtryブロックに置いてしまうと、その他の原因で例外がとんだ時スコープを抜けてしまうのでそのエラー表示中に多重起動の検出が出来ません。というわけで二重try位しか良い方法が思いつかなかったのです。それだけです。