みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

VB ループ中の値をゆっくり出力

VB初心者です。

ループの中で変化する値を数秒おきにループの途中で
休みを入れて結果の画面上に数秒間隔で数値を更新して
出力したいと考えております。

そこで,タイマを使うやり方と,InputBoxを使う方法を
試してみましたが,いずれもすべての処理が終わった後で
一番最後のデータだけがループ上で所望の時間Xループ回数
分の時間後に表示されるか,InputBoxの場合はループ回数
だけメッセージボックスに入力してこちらも最後の結果だけ
が最後に出力されるだけになってしまいます。

Timerの場合は
 Do While Timer XXX>Timer
DoEvents
Loop
としてスリープ状態にはならないようにしておりますが
うまく途中の結果を出してくれる出力画面を出すことが
できません。

何かうまい方法はないでしょうか?
よろしくお願いいたします。

投稿日時 - 2009-02-22 13:59:02

QNo.4739272

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

#1です。なんとなくムフフンな感じなので
ちょっと踏み込んで調べてみました。

http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer.aspx

ここのサンプルリストを元にいじくってみます。
まずは、とりあえず3秒毎に一時停止版からです。

Public Class Class1
Private Shared myTimer As New System.Windows.Forms.Timer()
Private Shared alarmCounter As Integer = 1
Private Shared exitFlag As Boolean = False

' This is the method to run when the timer is raised.
Private Shared Sub TimerEventProcessor(myObject As Object, myEventArgs As EventArgs)
myTimer.Stop()

' Displays a message box asking whether to continue running the timer.
'ここのMsgBoxに表示させたい内容を設定する。
If MessageBox.Show("ここねココ、ココ。", _
MessageBoxButtons.YesNo) = DialogResult.Yes Then
' Restarts the timer and increments the counter.
alarmCounter += 1
myTimer.Enabled = True
Else
' Stops the timer.
exitFlag = True
End If
End Sub

Public Shared Sub Main()
' Adds the event and the event handler for the method that will
' process the timer event to the timer.
AddHandler myTimer.Tick, AddressOf TimerEventProcessor

' Sets the timer interval to 3 seconds.
myTimer.Interval = 3000
myTimer.Start()

' んで、ここがループさせたい処理の部分。
While exitFlag = False
' 実際に処理されるループの内側です。
Application.DoEvents()
End While
End Sub
End Class


メッセージボックスで停止しているので、
YES押さないと処理は続行されません。
NO押すと終了してしまいます。

そこで、いよいよ期待されている動きっぽい版です。
なお、動作テストしてないうえに
そもそもコーディングの作りが質問者さんのものに適合しているかも判りませんので
あくまでも「期待されている動きをするっぽい版」です。
ちなみに、3秒動いて1秒休止の決め付け仕様なので
流用される際は都合よく調整して下さい。


Public Class Class1
Private Shared myTimer1 As New System.Windows.Forms.Timer1() '3秒動くよ用
Private Shared myTimer2 As New System.Windows.Forms.Timer2() '1秒止まるよ用
Private Shared alarmCounter As Integer = 1 'これ要らなくなくなってない??
Private Shared exitFlag As Boolean = False 'こっちまで要らなくなくなってない??

'こっちは3秒動くよ側のタイマー
Private Shared Sub TimerEventProcessor1(myObject As Object, myEventArgs As EventArgs)
'そいじゃ途中経過表示しますべか。
text1.text = "Aaaa"

'1秒止まる動作(?)稼動開始。
myTimer2.Enabled = True

'停止解除されるの待ちまーす。
myTimer1.Stop()
End Sub

'こちらは1秒とまるよ側のタイマー
Private Shared Sub TimerEventProcessor2(myObject As Object, myEventArgs As EventArgs)
myTimer2.Stop()

'動くよ側の停止を解除してお役御免。
myTimer1.Enabled = True
End Sub

Public Shared Sub Main()
' Adds the event and the event handler for the method that will
' process the timer event to the timer.
AddHandler myTimer1.Tick, AddressOf TimerEventProcessor1
AddHandler myTimer2.Tick, AddressOf TimerEventProcessor2

' Sets the timer1 interval to 3 seconds.
myTimer1.Interval = 3000

' Sets the timer2 interval to 1 seconds.
myTimer2.Interval = 1000

'動くよ側動作開始。
myTimer1.Start()

'・・・正しくはどうやるのだろう。。。
myTimer2.Start()
myTimer2.Stop()

' んで、ここがループさせたい処理の部分。
'ループの条件は調整してくださいね。
While exitFlag = False
' 実際に処理されるループの内側です。
Application.DoEvents()
End While
End Sub
End Class

さて、このドナーさんはうまいこと移植先に適合してくれるでしょうか?

投稿日時 - 2009-02-23 18:24:52

ANo.2

質問の内容と違ってるかもしれませんが、
「ループ中に変化する変数の値を一定期間毎にその時点での値を表示する」
と言う事ならです。
どのVB(VB6?)かわからないのですが、こんなのではどうでしょうか?
Sub sample()
Dim n As Long
Dim t As Single
'以下のDo~Loopがループ処理
Do
'ループ内の処理
n = n + 1
'表示処理
DoEvents '適当な位置に必要
If Timer >= t Then '表示時刻?
t = Timer + 3 '次の表示時刻を設定(この場合3秒後)
'表示処理
Label1 = n
End If
Loop
End Sub

投稿日時 - 2009-02-23 04:29:18

ANo.1

私の記憶があいまいなので
意図される動きとなるか微妙ですが

タイマーの実行間隔を例えば1秒(1000ミリ秒)としたら
タイマーのプロパティで1秒を設定。
表示させたい値をグローバルな変数なりにコピーして
タイマー側ではその値を読んで表示。
例えばこんな感じ。

'***タイマー実行開始
Do While ***ループ条件***
DoEvents
'***値の受け渡し
Loop


「ループで休みを入れて」ということなので、
ループの途中でいったん停止みたいなのが必要なら
タイマーでループの休止フラグのオンオフ制御して
こな感じ。

'***タイマー実行開始
Do While ***ループ条件***
DoEvents
if(休止フラグがONなら)
 値表示
 Do While 休止フラグがOFFになるまで
  DoEvents
 Loop
end if
Loop

ひとまず処理のイメージ版です。

投稿日時 - 2009-02-22 18:33:21

お礼

どうもありがとうございました。

結局ループが回っていてもとまっていて欲しいので
その時間分(例えば3秒)だけとまっていて欲しいと
いうことで、以下の様にしてみましたが、結果は同じ
でした(すべての操作が終わるまでコマンド画面でした)。

Do While Timer+3 > Timer
DoEvents
if Timer+3 > Timer
 text1.text = "Aaaa"
 Do While Timer+3 > Timer
  DoEvents
 Loop
end if
Loop

基本的には何秒間かループの中で止まっていて
くれればよいのですが。
スリープみたいなのでもかまいませんが、その間も
しっかりForm画面を表示をしていて欲しいのですが,
なぜかそれはできないことなんでしょうか?

データを何秒おきかに見に行く際にもやはり、全部読んで
から表示ということはないと思いますので、何らかの
手法があるのではと思いまして。そちらの方法でもかまい
ませんので何かよい例がありましたら教えてください。

投稿日時 - 2009-02-23 02:37:23

あなたにオススメの質問