2016-06-26 37 views
4

私は、外部マイクロコントローラデバイスがシリアルポート経由でコンピュータに接続されているJavaプロジェクトを開発中です。私は、Javaアプリケーションで待機ダイアログを持って、マイクロコントローラデバイス上で実行するコマンドを待っています。マイクロコントローラが10秒以内に応答しない場合、アプリケーションはシャットダウンします。whileループは実行されません

問題は、コマンドが速すぎるため、待機ダイアログがアクティブになる前にマイクロコントローラが応答することです。これにより、アプリケーションは10秒後にシャットダウンします。ここで

は私が見えるようにダイアログを待つ考え最初のアイデアです:

new Thread() { 
    public void run() { 
     while (!Main.mainFrame.waitDialog.isVisible()) {} 
     Main.usbManager.start(); 
    } 
}.start(); 

しかし、アプリケーションは、whileループで立ち往生し、待機ダイアログが表示されますが、私はいくつかのランダムな文を追加した場合されますwhileループには、例えばSystem.out.flush();のように動作し、ダイアログが見えるときにプログラムはwhileループから抜ける。

どのようにダイアログが表示されるのを待つことができますか?

おかげ

答えて

5

ほとんどのGUIライブラリはシングルスレッドです。つまり、スレッドへの呼び出しはスレッドセーフではないかもしれません。変更を確認することは決して保証されません。特にbooleanの値はインライン化することができるので、ある点の後に値の変更が表示されないことがあります。

ループを遅くするものを使用すると、しばらくコードを最適化しない(これは信頼できません)か、System.out.flush()のようなメモリバリアがあります。この最適化は行われません。

ポーリングするより良い方法は、Thread.yield()またはを使用して、いくつかのCPUを節約することです。

+0

ありがとう! 'Thread.yield()'がトリックをしました! – Cako

3

私は.isVisible()メソッドおよび一般whileループの使用を失敗に問題があると思います。

私はwhileループにいくつかのランダムな文を追加する場合、例えば、System.out.flush();,それは

を作品に似問題との質問「Why does while(true) loop just run once - Java」がありますループ

ながら、それはのSystem.out.println(のようなランダムな方法で実行されます)

私はあなたがたときに何かを呼ぶべきだと思いますこのスレッドでは、他のスレッドの実際のウィンドウが閉じているので、待つ必要はありません。

+0

ありがとうございます!私はイベント駆動型開発についてもっと読むべきです。 – Cako

関連する問題