- PR -

何かをするまで待つ処理をしたい

投稿者投稿内容
わちゃ
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 162
お住まい・勤務地: 東京
投稿日時: 2007-03-29 19:12
現在、VB 2003 で、ユーザからの入力を待つ処理をしたいと思っています。

イメージとしては、ShowDialog に近いかと思うのですが、
ある特定のボタンを押されたら、特定のボタンを押すまで処理を待機するように
したいと思っています。

一応、次のようなイメージで実現はできています。

While Not 入力された?
 Application.DoEvents()
Wend

ただ、CPU を使いっぱなしになってしまいます。
つど、10ms ぐらい Sleep するのも一つかとは思うのですが、
いま一つすっきりしません。

ManualResetEvent とか、Mutex を使うようなイメージで、
うまくやる方法などないでしょうか?

よろしくお願いいたします。



さる
ぬし
会議室デビュー日: 2005/07/14
投稿数: 276
お住まい・勤務地: 実家戻ったw
投稿日時: 2007-03-29 19:30
引用:

わちゃさんの書き込み (2007-03-29 19:12) より:
ある特定のボタンを押されたら、特定のボタンを押すまで処理を待機するように
したいと思っています。


次の特定のボタンが押されたら処理を開始すれば良いんじゃない?
わちゃ
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 162
お住まい・勤務地: 東京
投稿日時: 2007-03-29 20:28
さる殿

アドバイスありがとうございます。

ただ、ShowDialog のように、ユーザの入力の結果が、関数として返ってくると、
コードの見通しがよくなるので、そのようにできればと思っております。

よろしくお願いいたします。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-03-30 08:57
2つめのボタンが押されたイベントを受け取って、そこから処理を続行させれば良いのではないでしょうか?

・・・って何か、そうできない理由があるのでしょうけれど、質問内容からは想像できませんでした。

_________________
R・田中一郎 @ わんくま同盟  -  R.Tanaka.Ichiro’s Blog ← ブログはじめました

[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2007-03-30 08:58 ]
わちゃ
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 162
お住まい・勤務地: 東京
投稿日時: 2007-03-30 09:46
R田中一郎殿

どうも、アドバイスありがとうございます。

ただ、共通化した class として作りたいと思っていたので、
2つ目のボタンを待ってというイメージだと、個別の Form に
ロジックを記述する必要があるので、つらいところでした。

Form の ShowDialog って、あれを .Net framework とか API で、
実装するのって難しんでしょうかね。

みなと
大ベテラン
会議室デビュー日: 2002/06/14
投稿数: 202
お住まい・勤務地: Q州地方の日本海側
投稿日時: 2007-03-30 09:57
おはようございます。

次の処理まで待つ、ということですが、
ほかの方もおっしゃっていますけど、
次のボタンまで基本的にイベントはおきないんじゃないかな
とおもいますです。

なんでそういうことをしなきゃいけないのかの説明があると
回答の方も答えやすいとおもいます。

ところで、入力している間(?)そのコントロール
(と、次のボタン)以外を操作無効とかにするような
感じではどーですかね?
kanai
ベテラン
会議室デビュー日: 2004/09/13
投稿数: 98
投稿日時: 2007-03-30 10:14
kanaiです。

呼び出す側をForm1、呼び出される側(特定のボタンが押されるまで待機するフォーム)をForm2として、次のようなコードはいかがでしょうか。
(Form2にはボタンとテキストボックスを配置)

コード:
    'Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim form2 As New Form2
        Dim userInput As String = form2.ShowDialog()
        MessageBox.Show(userInput)
    End Sub

    'Form2
    Public Shadows Function ShowDialog() As String
        MyBase.ShowDialog()
        Return TextBox1.Text
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Close()
    End Sub



Form1からForm2のShowDialogを呼び出すと、Form2のテキストボックスの入力内容が戻り値として取得できます。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-03-30 10:41
動きがいまいちわかりません。

たとえば次の動きはあっていますか?
フォームに次の3つのボタンがあり

ボタン1−処理1を開始
ボタン2−処理1を一時的に停止
ボタン3−処理1の処理を再開

として、ボタン3をクリックした場合に処理1に対して何らかのメッセージ(返却値)を送り処理を再開する。
この場合 処理1 をクラスとして切り出して、フォームとは別スレッドで動かしてあげればいい気がします。
処理2、処理3があるなら、処理1と同じインターフェイスを実装させれば同じ動きをさせることが出来るはずです。

うーん、はずしているかな。
_________________
かるあ のメモスニペット

スキルアップ/キャリアアップ(JOB@IT)