私は次のことをしようとしています:
- 長時間実行リクエストを送信します(ここで使用します
Events.echoEvent
) - 「キャンセル」ボタンでモーダルダイアログを表示(待機...)
- ユーザーが「キャンセル」を押すと、ダイアログが非表示になり、イベントメソッドは実行されません。
- ユーザーがボタンを押さずに待つ場合。イベントメソッドが呼び出され、待機ダイアログが閉じます
どうやってやるの?
ZKは通常、サーバー上の単一のリクエストに対して単一のスレッドですべての作業を実行します。Events.echoEvent
リクエストを完了し、新しいリクエスト(およびスレッド)ですぐにサーバーにコールバックすることで、これを回避できます。ユーザーがクライアントと対話すると、新しいリクエストが発生するため、これも新しいスレッドになります。
したがって、上記の例では、次の3つのスレッドで作業します。
echoEvent
echoEvent
明らかに、最初の2つは、最後の2つが呼び出されるまでに長い間消えていきますが、これは、問題を解決するために考慮する必要があることです。
StackOverflowについては、2つのスレッドを相互作用させること、より具体的には、1つのスレッドに別のスレッドを中断させることについて多くの議論があります。
「Javaでスレッドを停止する方法」を参照してください。interrupt
受け入れられた回答は、スレッドを直接呼び出すよりも、ある種の「停止フラグ」を共有することを支持していました。
あなたのシナリオでは、これは、停止フラグを定期的にチェックしながら作業を行う長時間実行プロセスで実行されます(単純boolean
)。ユーザーが[キャンセル]をクリックすると、フラグをに切り替える必要がありますtrue
。
あなたが試すことができます
上記のSeanのように、長い操作を実行するスレッドを作成します(これは独立したスレッドであり、ZK要求スレッドではありません)
そのスレッドのステータスを定期的にチェックするタイマーを作成します。(これにより、クライアント側で定期的にajaxリクエストを送信するJavaScriptタイマーが作成されます)
また、ZKクライアントサイドプログラミングでビジーマスクをカスタマイズして、キャンセルボタンを追加します。(ボタンをクリックして別のajaxリクエストを実行します)
stackoverflowの同様の記事を参照してください: ZKの「処理」をオーバーライドする
編集:
私のブログにはいくつかの関連記事があります: