1

コードにバグがあり、どこに何が原因なのかわかりません。

私は顧客向けのアプリケーションを書いています。スプラッシュ画面中に、アプリはMysqlが実行されているかどうかを確認して後で接続できるようにします。mysqlがオンの場合、アプリは起動を継続します。mysqlが実行されていない場合は、それを起動して再確認します。

最初はmysqlpidを見つけていましたが、何らかの理由で、アンマネージコードを使用しないと取得できません。

そこで、xamppソースコードで別の方法を見つけ、それを使用することにしました。

vstudioデバッガーでアプリを実行すると、ブレークポイントでステップまたは停止しても完全に機能しますが、ステップなしで実行すると、アプリはmysqlサーバーを起動しますが、それを検出できず、最終的にアプリケーションが停止します(データベースに障害が発生した場合にアプリの読み込みを続行したくない) )。

この動作により、1つ以上の変数が実行時に破棄されてから、再度使用できるようになると思いました。

この問題をどのように解決するかわからないので、手を必要とします。

編集:問題は、Jan&SWEKOが言ったように、mysqlがまだアプリを中断せずに実行し始めていないことでした。遅延を追加すると完全に機能します

スプラッシュ画面のロードコード。

// App booting tasks
void Load()
{

 // License validation ok
 Boolean licensecheck = BootChecks.LicenseCheck();

 if (! licensecheck)
 {
   MessageBox.Show("License Error Conta ct Technical Support","Error",MessageBoxButtons.OK,MessageBoxIcon.Stop);
            Application.Exit();
}

bar.Width += 10; // feed progress bar ( it's a custom drawn label )
this.Refresh();  // update form to paint it
Application.DoEvents(); // process all pooled messages

// Mysql check
Boolean dbcheck = BootChecks.DbCheck();

// THE ISSUE IT'S HERE RUNNING WITHOUT STEPPING , ALWAYS FIRES THE ERROR
if ( ! dbcheck )
{
MessageBox.Show("Can't init Mysql. Contact Technical Support", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            Application.Exit();
 }

 bar.Width += 10;
 this.Refresh();
 Application.DoEvents();

 // more stuff

}

データベースチェックコード

public static bool DbCheck()
{

Boolean norun = MysqlController.CheckMysqlIsRunning(Constants.dbpidfile);

// check if running
if ( norun ) return true;

// if not running, I start it
MysqlController.StartMysql(Constants.dbexe,Constants.dbopts);

Boolean rerun = MysqlController.CheckMysqlIsRunning(Constants.dbpidfile);

// if really running all it's ok
if ( rerun ) return true;

// really a fault
return false;

}

実際のmysqlチェック

コメント:この方法はxamppパッケージで見つかりました。mysqlが実行されているかどうかを知るには、mysql pidファイルを見つけて、名前付きイベントを開きます。間違いなくmysqlが実行されている場合。

public static Boolean CheckMysqlIsRunning(String pathtopidfile)
{
    try
    {
        Int32 pid;
        using ( StreamReader sr = new StreamReader(pathtopidfile) )
        {
            pid = int.Parse(sr.ReadToEnd());
        }

        IntPtr chk = OpenEvent(SyncObjectAccess.EVENT_MODIFY_STATE, false, 
            String.Format("MySQLShutdown{0}", pid.ToString()));

        if ( chk != null ) return true;

        return false;
    }
    catch (Exception) { return false;}
}

public static void StartMysql(String path, String aargs)
{
  // All ok. Simply spawn a process
}
4

3 に答える 3

3

ある種のループをコーディングする必要があります。mysqlプロセスを開始し、その直後にチェックすると、プロセスはまだ存在せず、falseを返します。

次のようなものを試してください。

// if not running, I start it
MysqlController.StartMysql(Constants.dbexe,Constants.dbopts);
// wait 10 seconds max.
int timeout = 10;
bool mySqlIsRunning = false;

while(!MysqlController.CheckMysqlIsRunning(Constants.dbpidfile)) {
    // wait a while
    Thread.Sleep(1000);
    if (timeout-- == 0) {
        // timeout error
        // show message to user ...
    }
}

// here mysql is running or your timeout is expired.
于 2012-11-09T12:34:38.820 に答える
1

チェックを実行したときに終了していないバックグラウンドプロセスを生成することが問題である可能性があると思います。

デバッグしているとき、MySQLには、開始するのにかかる時間内に開始するのに十分な時間があります。

MysqlController.StartMysql(Constants.dbexe,Constants.dbopts);

Boolean rerun = MysqlController.CheckMysqlIsRunning(Constants.dbpidfile);

ただし、実際にアプリを実行している場合はそうではない場合があります。簡単なテストとして、Thread.Sleep(2000)チェックを再度実行する前に数秒待つ簡単なものを追加してみてください。

于 2012-11-09T12:36:11.690 に答える
0

IMHOは、メソッドにチェックを実行し、次に初期化も実行すると言うのは悪い形式です。チェックのコードを2つに分割します。次に、チェック後にメインコードで初期化を行います。フォームのプロパティとして保持することにより、データベースへの参照を保持します。

于 2012-11-09T12:35:27.677 に答える