2

私は自分で問題を解決しました。ダイアログを閉じるイベントの問題により、syncCustomers() を複数回呼び出しました。JDialogコンストラクターで親JFrameを提供することで解決しました。私の側ではかなり愚かなエラーです。

私のアプリケーションには、Web サービスおよびローカル データベースと同期するタスクが含まれています。このタスクには数分かかる場合があります。したがって、単純なダイアログ (Swing) を使用して、この時間のかかるプロセスについてユーザーに通知したいと考えています。同期プロセスの実行中にユーザーが作業を続行することは想定されていません。

だから私は考えました:

  1. ユーザーへの通知でモーダル ダイアログを開く
  2. 別のスレッドで同期プロセスを開始する
  3. 同期プロセスが完了したら、モーダル ダイアログを閉じます

ユーザーがボタンをクリックして同期プロセスを開始しました:

private void syncCustomers() {
    if (checkWebserviceAuth()) {

        SyncDialog dialog = new SyncDialog();
        dialog.setLocationRelativeTo(this);
        dialog.setVisible(true);

        SyncCustomersTask task = new SyncCustomersTask(dialog, getCoach());
        task.run(); // task.start() will result in the same problem

    } else {
        openAuthorizeDialog(true);
    }
}

public class SyncDialog extends javax.swing.JDialog {

    public SyncDialog() {
        initComponents();
        // I already noticed that the modal dialog won't work for me since it interrupts within syncCustomers()
        //this.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);

        this.setTitle(Application.getApplicationTitle());
    }

    ...

}

public class SyncCustomersTask extends Thread {

    private void doWork() {
        System.out.println("Start doWork() and sleep for 10 seconds...");
        try {
            // for testing purpose
            Thread.sleep(10000);
        } catch (InterruptedException ex) {
        }
        System.out.println("Done with doWork().");
    }

    @Override
    public void run() {
        doWork();
        if (getCallback() != null) {
            System.out.println("Invoke callback...");
            getCallback().dispose();
            System.out.println("Callback invoked.");
        }
    }

    ...
}

これにより、次の無限ループが発生します。

Start with doWork()...
Start doWork() and sleep for 10 seconds...
Done with doWork().
Invoke callback...
Callback invoked.

コメントアウトしたら

getCallback().dispose();

、ループは 2 回目の実行後に停止します。

Start with doWork()...
Start doWork() and sleep for 10 seconds...
Done with doWork().
Invoke callback...
Callback invoked.
Start with doWork()...
Start doWork() and sleep for 10 seconds...
Done with doWork().
Invoke callback...
Callback invoked.

理解できません。何度も何度も実行するスレッドを起動するのは何ですか?

この全体は、最初から良い考えではないと思いますが、ProgressMonitor のようなものも動作させることができませんでした。:(

4

2 に答える 2

2

start()ではなく、を呼び出しrun()ます。後者は単にスレッドを実行しますが、別のスレッドでは実行しません!このstart()メソッドは新しいスレッドをインスタンス化し、その新しいスレッドでのみメソッドを呼び出しますrun()

ところで、これは驚くべき一般的な問題です。

于 2013-02-22T11:25:08.080 に答える
0

run()を呼び出しても、新しいスレッドでコードは実行されません。

于 2013-02-22T11:26:30.397 に答える