複数の Do While をうごかすには?


ミルク  2004-07-30 00:35:09  No: 115195  IP: [192.*.*.*]

たとえば
      Private Sub Command1_Click()
    Do While aaaa<0
      Label1.Caption=ほにゃらら
    DoEvents
    Loop
と明記して  コマンド1をクリックして  DO While関数をうがして
      Private Sub Command1_Click()
      Do While bbbb<0
      Label2.Caption=ほにゃらら
    DoEvents
    Loop

とした場合に

コマンド2をクリックすると  コマンド2のDO whileは動くけど
コマンド1のDo whileがとまってしまいます。

二つ同時に動かすことはできないのでしょうか?
また、こういったLOOP処理を別の方法で2つ同時に動かすこととかはできるのでしょうか?
初心者的な質問で申し訳ありません。

編集 削除
ミルク  2004-07-30 01:25:32  No: 115196  IP: [192.*.*.*]

ごめんなさい  二つ目のソースのCOMMAND1はCOOMMAND2です

編集 削除
ガッ  2004-07-30 08:49:57  No: 115197  IP: [192.*.*.*]

オススメしないが、別スレッドで動かす…
か、http://www.int21.co.jp/pcdn/vb/noriolib/ ここを参照しる。
どちらも面倒っぽいので、他のロジックを組むことをオススメする。

編集 削除
特攻隊長まるるう  2004-07-30 09:08:31  No: 115198  IP: [192.*.*.*]

>オススメしないが、別スレッドで動かす…
複数のスレッド立ててるとインタプリタなんかで一行ずつ
実行しながらデバッグしてると訳わかんなくなる事は
あるかもねぇ(^^;)
…で個人的には複数スレッドは避けてきたので、何とも
言えませんが、質問の処理はフラグだけ立てて Do Loop
は一箇所にまとめてもできそう。個人的にはそちらの方が
管理しやすいと思いますです。

編集 削除
人造人間ヴィビーン  2004-07-30 15:09:30  No: 115199  IP: [192.*.*.*]

フォームをわければ難しくないかも

'Form1側
Private Sub Command1_Click()
Form2.Visible = False
Form2.Text1.Text = "Start"
Dim aaaa As Integer
aaaa = 0
    Do While aaaa < 5
      Label1.Caption = Label1.Caption & "なんじゃら "
      aaaa = aaaa + 1
    Loop
End Sub


'Form2側    'ボタンの代わりにテキストボックス使用
Private Sub Text1_Change()
If Text1.Text = "Start" Then
Dim aaaa As Integer
aaaa = 0
    Do While aaaa < 5
      Form1.Label2.Caption = Form1.Label1.Caption & "かんじゃら "
      aaaa = aaaa + 1
    Loop
Text1.Text = ""
End If
End Sub

編集 削除
ミルク  2004-07-30 16:28:08  No: 115200  IP: [192.*.*.*]

みなさまありがとうございます。
特攻隊長まるるうさま
フラグを立てる?っていうと具体的にどんな風にまとめればいいのでしょうか?

人造人間ヴィビーンさま
それだとコマンド1を押したら  2つ目のDO  LOOPもうごいてしますよね?
コマンド1とコマンド2の押すタイミングは違います。

最大で16個のループ処理が必要になる可能性があるプログラムをつくってるのですが・・・
なにか方法ありまんかねぇ・・・

編集 削除
特攻隊長まるるう  2004-07-30 17:21:11  No: 115201  IP: [192.*.*.*]

>フラグを立てる?っていうと具体的にどんな風にまとめればいいのでしょうか?
・Boolean 型の変数(フラグ)を16個用意してボタン押下でやるのはフラグの変更と
DoLoop する関数(1つにまとめる)の呼び出しのみ。
・DoLoop する関数は16個のフラグをチェックして、フラグにが True なら
対応する処理を呼び出す。
・全てのフラグが False の時 DoLoop する関数は停止

…でできるんじゃない?

編集 削除
ガッ…  2004-07-30 23:15:57  No: 115202  IP: [192.*.*.*]

完全な並列じゃぁないが、Timerで並列みたいなことができる。

-----Class1-----
'クラスモジュールを作成
Option Explicit

Public nowCount As Long
Public thisName As String

Public Sub Init(ByVal namestring As String)
    thisName = namestring
    nowCount = 0
End Sub

-----Form1-----
'Command1、Timer1を貼り付ける。
Option Explicit

Dim TestTask As New Collection

Private Sub Command1_Click()
    Dim st As String
    Dim x As New Class1
    x.Init Timer
    TestTask.Add x, x.thisName
End Sub

Private Sub Form_Load()
    Timer1.Interval = 10
End Sub

Private Sub Timer1_Timer()
    Dim v As Variant
    For Each v In TestTask
        v.nowCount = v.nowCount + 1
        Debug.Print "Task",
        If v.nowCount = 100 Then
            Debug.Print v.thisName, "End"
            TestTask.Remove v.thisName
        Else
            Debug.Print v.thisName, v.nowCount
        End If
    Next
End Sub

恥さらしすまん

編集 削除
ミルク」  2004-07-31 21:24:34  No: 115203  IP: [192.*.*.*]

Boolean 型もやってみましたがだめでした。
フォームを分けて同じ  ものform1とfom2で動かしてみましたが
やっぱり  FORM1のほうがとまってしまいます。
特攻隊長まるるうさまのイメージしていたもののサンプルソースとかいただけたらうれしいです。

マグさんのクラスモジュールを使うのもやってみましたが、
Form1の値がクラスモジュールで参照できなくて  できませんでした。

お力をおかしていただけるとうれしく思います。

編集 削除
Max  2004-08-01 00:34:12  No: 115204  IP: [192.*.*.*]

フラグを使うというのは、こういうことなんじゃないですか?
だめという意味が良く分かりませんが。

Do While True
 If blnFlg1 Then
   DoFunc1  '処理1を実行
   blnFlg1=False
 End if
 If blnFlg2 Then
   DoFunc2  '処理2を実行
   blnFlg2=False
 End if
Loop

コマンドボタンでは
Private Sub Command1_Click()
 blnFlg1=True
End Sub

Private Sub Command2_Click()
 blnFlg2=True
End Sub

ってフラグを立てるだけです。

編集 削除
Max  2004-08-01 00:36:02  No: 115205  IP: [192.*.*.*]

Do While 〜  Loopの間にDoEventsを書き忘れてました

編集 削除
特攻隊長まるるう  2004-08-02 09:53:35  No: 115206  IP: [192.*.*.*]

>Max さん
サンプル書込みありがとうございます(^^)

>Boolean 型もやってみましたがだめでした。
>フォームを分けて同じ  ものform1とfom2で動かしてみましたが
>やっぱり  FORM1のほうがとまってしまいます。
それは DoLoop を1つにまとめてないからでしょ?
1つの DoLoop 処理に入ってしまうとそれが繰り返し
行われて、もう1つの DoLoop が実行されてないんだと
思います。あくまで DoLoop 処理は1つ。フラグで処理を
分けるだけ…そう書いたつもりなんですが…。Max さんの
サンプルで基本はOKです。あとは

・プログラム終了時にフラグを全て False にする処理を
入れてないとプログラムが終了しなくなる。
・ある条件が揃うまで DoLoop を繰り返し待機するプログラム
の場合、Sleep とか入れてないと CPU 100%使って条件が
揃うまで Loop 処理を走らせるから他のプログラムの動作
に支障が出る。
・Max さんのサンプルでは DoLoop はつねに動いてるっぽい
ですが、フラグが全て False の時は止めてもいいかなぁ?

…くらいが気になったところ(改善できる点)でしょうか?

そう言えばなぜ Timer を使わないのか聞いていませんでした。
一般的には精度の問題が言われますが…『ある程度の時間を
待つ』程度の処理なら Timer を使ったほうが簡単かもしれ
ません。なぜ DoLoop なんでしょう?DoLoop を今まで
使ったことがありますか?目的や条件・ミルクさんの実力
によって回答が変わってくるのでその辺りの事も書いて
欲しいです。

>やってみましたがだめでした
それは助言が悪いのか…ミルクさんのやり方が悪いのか…
回答を見て分かると思いますが、答えとなるプログラムは
1つではありません。採用する方向を決めて成功するまで
やって下さい。提供するだけで無駄になりそうなサンプルを
ボクはわざわざ用意しませんよ?。

編集 削除