コードにバグがあり、どこに何が原因なのかわかりません。
私は顧客向けのアプリケーションを書いています。スプラッシュ画面中に、アプリは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
}