たとえば
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つ同時に動かすこととかはできるのでしょうか?
初心者的な質問で申し訳ありません。
ごめんなさい 二つ目のソースのCOMMAND1はCOOMMAND2です
編集 削除オススメしないが、別スレッドで動かす…
か、http://www.int21.co.jp/pcdn/vb/noriolib/ ここを参照しる。
どちらも面倒っぽいので、他のロジックを組むことをオススメする。
>オススメしないが、別スレッドで動かす…
複数のスレッド立ててるとインタプリタなんかで一行ずつ
実行しながらデバッグしてると訳わかんなくなる事は
あるかもねぇ(^^;)
…で個人的には複数スレッドは避けてきたので、何とも
言えませんが、質問の処理はフラグだけ立てて Do Loop
は一箇所にまとめてもできそう。個人的にはそちらの方が
管理しやすいと思いますです。
フォームをわければ難しくないかも
'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
みなさまありがとうございます。
特攻隊長まるるうさま
フラグを立てる?っていうと具体的にどんな風にまとめればいいのでしょうか?
人造人間ヴィビーンさま
それだとコマンド1を押したら 2つ目のDO LOOPもうごいてしますよね?
コマンド1とコマンド2の押すタイミングは違います。
最大で16個のループ処理が必要になる可能性があるプログラムをつくってるのですが・・・
なにか方法ありまんかねぇ・・・
>フラグを立てる?っていうと具体的にどんな風にまとめればいいのでしょうか?
・Boolean 型の変数(フラグ)を16個用意してボタン押下でやるのはフラグの変更と
DoLoop する関数(1つにまとめる)の呼び出しのみ。
・DoLoop する関数は16個のフラグをチェックして、フラグにが True なら
対応する処理を呼び出す。
・全てのフラグが False の時 DoLoop する関数は停止
…でできるんじゃない?
完全な並列じゃぁないが、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
恥さらしすまん
Boolean 型もやってみましたがだめでした。
フォームを分けて同じ ものform1とfom2で動かしてみましたが
やっぱり FORM1のほうがとまってしまいます。
特攻隊長まるるうさまのイメージしていたもののサンプルソースとかいただけたらうれしいです。
マグさんのクラスモジュールを使うのもやってみましたが、
Form1の値がクラスモジュールで参照できなくて できませんでした。
お力をおかしていただけるとうれしく思います。
フラグを使うというのは、こういうことなんじゃないですか?
だめという意味が良く分かりませんが。
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
ってフラグを立てるだけです。
Do While 〜 Loopの間にDoEventsを書き忘れてました
編集 削除>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つではありません。採用する方向を決めて成功するまで
やって下さい。提供するだけで無駄になりそうなサンプルを
ボクはわざわざ用意しませんよ?。