2011-01-20 17 views
0

たとえば、ソフトウェアのインストール中など、いくつかのステッププロセスがあるとします。UIプログラミングのコールバックの代替手段はありますか?

各ステップはテキストボックスを表示し、ユーザーが「次へ」ボタンをクリックするのを待ちます。

それを行うための標準的な方法は、このようなコールバックを持っていることです。この技術は、コードはかなり読めなくなります

process 
{ 
    Dialog1() // Will call callback2 when closed 
} 

callback2() 
{ 
    Dialog2() // Will call callback3 when closed 
} 

callbak3() 
{ 
    Dialog3() // Will call callback4 when closed 
} 

あなたは 除算に持っているように、ステップの多くがあるときは、各連続に加工コールバック関数( コンテキストを1つから別のものに保存することはもちろんありません)。

これを行うのが簡単な方法はありますか?理想的には、プロセスは 次のように読んでください。これで

process() 
{ 
    Dialog1() 
    callback1() // stop method until closed 
    Dialog2() 
    callback2() // stop method until closed 
    Dialog3() 
    callback3() // stop method until closed 
} 

問題は、あなたがUIスレッドを止めることができないということです。どのようなアイデアや回避策も非常に高く評価されます。

PS:このCやObjective Cの中で

ANSWER

を動作させるようにコルーチンマーティンBへの感謝を発見した後、私は、このページ見つけた:https://stackoverflow.com/posts/4746722/editをして、このコードを使用して終了しました:

+0

機能的な構造を持たないため、私はCを嫌いです。これは関数型言語で完全に表現することができます(例:javascript)を使って*継続*。 –

答えて

2

あなたは正確にあなたが探している概念を提供する、coroutinesを探しています:終了せずに関数から制御が降伏ここ

は私が有効だと思うの例との投稿ですそれ。本質的には、あなたのコードは次のようになります。

process() 
{ 
    Dialog1() 
    yield 
    Dialog2() 
    yield 
    Dialog3() 
} 

残念ながら、コルーチンは、CやObjective Cのでネイティブにサポートし、醜いハックに頼ることなく、一般的に実装するのは難しいですされていません。しかし、あなたの状況に合わせた特別なケースの構築の出発点として、このコンセプトを採用することができます。

+1

実際には、「コールバック」という方法でダイアログをデザインすることを、「継続継承スタイル」**(Googleのこの用語)と呼びます。コルーチンは通常、CPSを使用して実装されます。 1つの良い方法は、次に何をするかを記述するコールバック(*継続*)をダイアログルーチンに渡すことです。問題は、Cがこれをきれいに行う機能的な構造を持たないということです。 –

+0

それはとても面白そうです。以前はコルーチンについて聞いたことがありません。 – CodeFlakes

0

私はこの問題をよく理解していません。モーダルダイアログが表示されないのはなぜですか?それらが却下されるまで、あなたのロジックは次のようになりますので、モーダルダイアログをブロック:

Dialog1() 
Dialog2() 
Dialog3() 

別の解決策は、あなたのダイアログやコールバックを持つことであるかのイベントを送るものは何でも。それらのイベントにバインドします。

bind $rootWindow <<Step1>> showDialog1 
bind $rootWindow <<Step2>> showDialog2 
bind $rootWidow <<Step3>> showDialog3 
# kick off the first step 
event generate $rootWindow <<Step1>> 

:あなたのメインロジックは、この(申し訳ありませんが、私はC/Objective-Cの中にGUIの例を行う方法がわからないので、その非常に読みやすいので、私はTcl/Tkを使用します)のようになります。 showDialogX関数は、必要な処理を行い、「完了しました。次のステップに備える」というイベントを生成します。

関連する問題