• ベストアンサー

マルチスレッド処理?

例えば、次のようなコードがあるとします。 Private Sub Command1_Click() i = 0 Do While (1) a = i i = i + 1 Loop End Sub このとき、Command1をクリックしても反応しないと思います。 ここで、Command1をクリックすれば反応してa = 0にリセット できるというような割り込み処理?を行えるようにするには どうすればよいですか? ご存知の方お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

どのVBか分からなかったので.netで書いてみました。 Public Class Form1  Private a As Integer = 0  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   If a = 0 Then    Call add()   Else    a = 0   End If  End Sub  Private Sub add()   Do While (1)    Me.Label1.Text = a    System.Windows.Forms.Application.DoEvents()    a = a + 1   Loop  End Sub End Class とりあえず、aの中身をlabelに表示してみました。 質問の内容であれば上記で条件を満たしているとは思いますが。。。 このままでは、何をしたいのかさっぱりわかりませんね。。。

Rossana
質問者

お礼

回答ありがとうございます。VB6.0の場合でも同じようにできるのでしょうか? VB.NETが手元にないので検証できないのですが、なんとなく System.Windows.Forms.Application.DoEvents() がない場合は本来Me.Label1.Textにaの内容が表示されるはずがフリーズしてしまう気がします。それをSystem.Windows.Forms.Application.DoEvents() http://dobon.net/vb/dotnet/vb6/doevents.html を入れることでフリーズしないようにできるということでしょうか?

その他の回答 (3)

  • inaba502
  • ベストアンサー率23% (22/94)
回答No.4

No.3です。 お礼、有難うございます。 >DoEventsがVB.NETではInvoke関数になったという感じでしょうか? .NETのInvokeは、スレッド間で同期を取るためのメソッドです。 DoEventsは、単純に制御をOSに戻すだけですので、違います。 No2様の回答を拝見する限り VB6.0のDoEventsは、.NETでは、Forms.Application.DoEvents() に対応すると思います。

Rossana
質問者

お礼

単純明快な説明ありがとうございます。分かりやすかったです。

  • inaba502
  • ベストアンサー率23% (22/94)
回答No.3

Private Sub Command1_Click()   a = 0   Do While (1)    a = i    i = i + 1    DoEvents   Loop End Sub DoEventsは、制御を一旦Windowsへ戻すメソッドです。

Rossana
質問者

お礼

回答ありがとうございます。VB6.0の方でプログラムの動作を以下の2つについて確認致しました。コード1の方はテキストの内容が変化しない上途中でフリーズするのに対して、コード2の方はテキストの内容が変化し、フリーズもなく正常に動作しました。 DoEventsがVB.NETではInvoke関数になったという感じでしょうか? (コード1) Private Sub Command1_Click() a = 0 Do While (1) a = i i = i + 1 Text1.Text = i Loop End Sub (コード2) Private Sub Command1_Click() a = 0 Do While (1) a = i i = i + 1 Text1.Text = i DoEvents Loop End Sub

  • unamana19
  • ベストアンサー率62% (56/89)
回答No.1

DoEventsで割り込めるようにして、現在ループしているか どうかのフラグで分岐処理してみては?

Rossana
質問者

お礼

回答ありがとうございます。具体的にはどういうコードで実現できるのでしょうか?(この質問のあとにTimerコントロールを使えばCommand1のコード内はフラグを使ってTimerコントロールを有効・無効にし、ループ処理はTimerコントロールで代わりに行えばよいことに気付きました。しかし、これは仮の手段です。)

関連するQ&A

  • Excel VBA で処理中断(DoEvents)ができなくて困ってい

    Excel VBA で処理中断(DoEvents)ができなくて困っています。 まず、CommandButton1ボタンでSampleをコールし、Sample処理の中でループを廻し、途中でCommand1ボタンをクリックして、処理中断(DoEventsによって)をいれたいと思っています。 しかし、Command1ボタンをクリックしても処理中断がきかないのです。 グローバル変数fStopにはCommand1ボタンをクリックしたときにTrueが入っていることは、MsgBoxで確認していますが、Sample処理の方に値がつたわっていないようで、ループが最後まで止まりません。 コードが悪いのでしょうか、それとも、DoEventsの使い方が悪いのでしょうか。 もし、DoEventsが使えないのであれば、代替手段はありますでしょうか。 (長時間の印刷中の処理中断に応用したいと思っています) 環境はExcel 2002 SP3 , VB 6.0 , Windows XPです。 なお、DoEventsのコードは以下のURLを参考にして作成しました。 http://officetanaka.net/excel/vba/function/DoEvents.htm コードは以下のとおりです。 '********* Dim fStop As Boolean 'グローバル変数を宣言 '********* Sub Sample() Dim i As Long fStop = False For i = 1 To 1000000 DoEvents If fStop = True Then MsgBox "処理が中断されました" Exit For End If Next i End Sub '******** Private Sub CommandButton1_Click() Call Sample End Sub '******** Private Sub Command1_Click() fStop = True MsgBox "fStop=" & fStop End Sub

  • Currency (通貨型)に関して教えてください

    Currency (通貨型)に関して教えてください。(VB5です) Private Sub Command1_Click() Dim a As Currency a = 222222 For i = 1 To a Next i End Sub 上のコードではFor文が一度も実行されずに終わってしまいます。 Private Sub Command1_Click() Dim a As Currency a = 22222 For i = 1 To a Next i End Sub これだとちゃんとiが22222まで実行されます。 一体どうしてでしょうか。 よろしくお願いします。

  • ビジュアルベーシックのお絵かき掲示板

    まったくの初心者です。初歩的な質問で申し訳ありません。 カラーのところでクリックが実行できません。 なぜなのかよくわかりません。お暇なときご教授下さい。  そしてもう一つ質問ですが以下のコードを追加したいの ですがどこに挿入すればいいのですか。 →private sub image_click() ccolor = 7 end sub ここまでのコードを追加したいです。 ーーーーーーーーーーーーーーーーーーーーーーーーーー Private Sub Command1_Click() Form1.Cls End Sub Private Sub Command2_Click() End End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Form1.DrawWidth = 3 If Button = 1 Then PSet (X, Y), QBColor(ccolor) End If End Sub Private Sub Label1_Click() cccolor = 14 End Sub Private Sub lavel2_click() cccolor = 0 End Sub Private Sub label3_click() ccolor = 9 End Sub Private Sub label4_click() ccolor = 12 End Sub Private Sub label5_click() ccolor = 10 End Sub

  • Do~Loopステートメント

    Do~Loopステートメントで使わな方が良いステートメントとは? Do~Loopステートメントで「古いから使わない方がよい」、と言われたことがあるのですが どれの事だか忘れてしまいました。 Sub test() セルのA1~A10に1~10を入力する i = 1 Do While i < 11 Worksheets("Sheet1").Cells(i, 1).Value = i i = i + 1 Loop End Sub これは一般的だから使ってもよいと思います。 Sub test() セルのA1~A10に1~10を入力する i = 1 Do Until i = 11 Worksheets("Sheet1").Cells(i, 1).Value = i i = i + 1 Loop End Sub これもよく見かけます。 Do While,Do Until以外にもloopステートメントってありますか? あと使わない方が良いステートメント、私の勘違いでなければ教えてください。

  • マクロでフォーム処理の繰り返し

    よろしくお願いします。 マクロでフォームを作成したとき同じような処理がたくさんある時、繰り返し処理は可能でしょうか? 例えば以下のような処理をループ処理できないでしょうか? Private Sub Label1_Click() Label1.BackColor = RGB(255, 0, 0) End Sub Private Sub Label2_Click() Label2.BackColor = RGB(255, 0, 0) End Sub Private Sub Label3_Click() Label3.BackColor = RGB(255, 0, 0) End Sub   ・   ・   ・ Private Sub Label100_Click() Label100.BackColor = RGB(255, 0, 0) End Sub

  • Form_Load 終了後

    Form_Load  省略 End Sub フォームが表示された後、 private sub test  do   省略  loop while() End sub test関数内の処理(do...loop)を処理したいのですが フォームロード関数終了(End sub)後にtest関数の処理をしたい 場合どのようにすれば、良いのでしょうか  よろしくお願いします Timer関数以外で対応したいと考えています

  • 割り込み処理

    Application.OnTimeで一定時間後に処理をさせたいのですが For文のループ処理を完了してからApplication.OnTimeが実行されてしまいます。 ループ処理中にApplication.OnTimeを優先して実行させることって出来るのでしょうか? Option Explicit Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Private Sub CommandButton1_Click() Call M1 End Sub Private Sub M1() Dim i As Integer Application.OnTime Now() + TimeValue("00:00:03"), "Sheet1.M2" For i = 0 To 30 Range("A1") = i Sleep 1000 Next i End Sub Sub M2() MsgBox ("123") End Sub

  • 簡単なエクセルVBA

    最近エクセルのVBAを勉強し始めたのですが、 1×1=1 1×2=2 1×3=3  ・  ・ 9×9=81 と出るようにしたいのですが、 Sub kuku() Do While i < 9 i = i + 1   Do While j < 9   j = j + 1   a = i * j   Debug.Print i; "×"; j; "="; a   Loop Loop End Sub としたところ1×9=9までしかでません。 どうすれば上手くループするようになるでしょうか? お願いします。

  • VBA:助けてください。呼び出してもいないのに独立なプロシージャへ、処理が飛んでしまう。アドバイスお願い致します。

    Useform1のコマンドボタンをクリックすると Private Sub CommandButton1_Click() Call 処理 End Sub というように、「処理」を呼び出し。これで終わるようにしていました。しかし、不具合が出てしまい、ステップインで見てみると「処理」からEndSubに行き、その後Useform2のコマンドボタンイベントのEnd Withへ Private Sub CommandButton1_Click() With Userform1 .... End With ←    ・・・ End Sub 上のように矢印の部分へ飛んでしまいます。全く、独立な、コマンドイベントへ飛んで処理されているのです。それも、飛んだ箇所がEnd Withからです。こんなことがあるのでしょうか? Private Sub CommandButton1_Click() Call 処理 Exit Sub End Sub 上のようにExit Subを追加してもやはりそこから飛んでしまいます。 なぜでしょうか?詳しい方アドバイスお願い致します。

  • エクセル VBA リストボックス 一覧処理

    エクセル VBA リストボックス 一覧処理 シートから文字列を検索 ↓ リストボックス表示 ↓ 表示結果をクリック ↓ 空欄時入力 ↓ 更新 上記の流れをVBAで行いたいのですが、結果表示されたリストを選択 詳細を表示し、空欄においては都度入力した物を更新ボタンでセルへ 反映させるにはどの様にすればいいのでしょうか? Public Sub 検索(ByVal Namae As String, ByRef MeNamae As Object) Dim Nagasa As Integer Dim i As Long Dim MaxRows As Long Dim SAGASU As Object Dim KensakuChar As String Dim ListNamae As String Dim ListChar As String Dim KBanme As Integer Dim LBanme As Integer Set SAGASU = Worksheets("2月") MaxRows = SAGASU.UsedRange.Rows.Count Nagasa = Len(Namae) MeNamae.ListBox1.Clear For i = 3 To MaxRows ListNamae = SAGASU.Cells(i, 3) KBanme = 0 LBanme = 0 Do Do While Nagasa >= KBanme KBanme = KBanme + 1 KensakuChar = Mid(Namae, KBanme, 1) If KensakuChar <> " " Then Exit Do End If Loop Do While Nagasa >= LBanme LBanme = LBanme + 1 ListChar = Mid(ListNamae, LBanme, 1) If ListChar <> " " Then Exit Do End If Loop If KensakuChar = ListChar Then If Nagasa = KBanme Then With MeNamae .ListBox1.AddItem (ListNamae) End With End If Else Exit Do End If Loop Until Nagasa <= KBanme Next End Sub --------------- Private Sub UserForm_Initialize() Set SAGASU = Worksheets("2月") Maxl = SAGASU.UsedRange.Rows.Count End Sub --------------- Private Sub CommandButton1_Click() Dim Namae As String Dim MeNamae As Object Namae = TextBox1.Text Set MeNamae = KensakuForm Call 検索(Namae, MeNamae) End Sub ---------------- Private Sub CommandButton2_Click() End End Sub ---------------- Private Sub ListBox1_Click() ListIdx = ListBox1.ListIndex Namae = ListBox1.List(ListIdx) End Sub 文字数制限の為、一部抜いていま

専門家に質問してみよう