C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: マウスでボタンをクリックしている間の処理について


(過去ログ 88 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■52350 / inTopicNo.1)  マウスでボタンをクリックしている間の処理について
  
□投稿者/ やま (1回)-(2010/08/06(Fri) 13:40:24)

分類:[VB.NET/VB2005 以降] 

2010/08/06(Fri) 13:42:18 編集(投稿者)
こんにちは、やま と申します。お世話になります。

使用言語はVisual Basic2005で、
マウスでボタンを押し込んでいる間に処理を繰り返したいと思っています。

以下のようなソースで動作させると、while文の実行中にMouseUpのイベントを読み込めません。
どのようにすれば良いか、ご教授頂ければ幸いです。

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

--------------------------------

Public Class Form1

    Private Sum As Integer
    Private Mouse As Boolean

    Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown

        Mouse = True
        Do
            Sum = Sum + 1
        Loop While Mouse = True

    End Sub

    Private Sub Button1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseUp

        Mouse = False
        MsgBox(Sum)

    End Sub

End Class

引用返信 編集キー/
■52352 / inTopicNo.2)  Re[1]: マウスでボタンをクリックしている間の処理について
□投稿者/ 魔界の仮面弁士 (1735回)-(2010/08/06(Fri) 14:21:49)
No52350 (やま さん) に返信
> マウスでボタンを押し込んでいる間に処理を繰り返したいと思っています。
「実際にやりたい処理」の内容にもよりますが、Timer で処理するのは駄目でしょうか。

> 以下のようなソースで動作させると、while文の実行中にMouseUpのイベントを読み込めません。
この場合、MouseDown イベントの処理が終了するまで MouseUp が発生しません。
ゆえに無限ループとなり、Sum がオーバーフローするまで止まらないと思います。

とりあえず単純な対策としては、ループ中に
 Application.DoEvents()
を入れておくことで一応は回避できますが、この方法は
個人的には避けた方が良いと思います。


> どのようにすれば良いか、ご教授頂ければ幸いです。
実際の繰り返し処理は、別のスレッドに担当させてみては如何でしょう。
http://www.tt.rim.or.jp/~rudyard/torii009.html

Imports System.ComponentModel
Public Class Form1
    Private Sub Button1_MouseDown(…
        BackgroundWorker1.WorkerSupportsCancellation = True
        BackgroundWorker1.RunWorkerAsync(1) '開始値
    End Sub

    Private Sub Button1_MouseUp(…
        BackgroundWorker1.CancelAsync()
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(…
        MsgBox(e.Result)
    End Sub

    Private Sub BackgroundWorker1_DoWork(…
        Dim bgw As BackgroundWorker = DirectCast(sender, BackgroundWorker)
        Dim sum As Integer = CInt(e.Argument)
        Do
            sum += 1
        Loop Until bgw.CancellationPending
        e.Result = sum
    End Sub
End Class

引用返信 編集キー/
■52353 / inTopicNo.3)  Re[2]: マウスでボタンをクリックしている間の処理について
□投稿者/ やま (2回)-(2010/08/06(Fri) 14:49:40)
2010/08/06(Fri) 14:56:19 編集(投稿者)

やまです、こんにちは。
返信ありがとうございます。

今回、実際にやりたい処理は、
RS-232Cで接続したステージを動作(【前進】というボタンを押し続ける間、短い距離を移動させるようなコマンドを
Serialport.Writeで送信し続ける)させることです。

最初、Timerで処理しようと思ってやってみたのですが、Intervalとステージの移動時間の関係で動いて止まっての繰返しになりました。

今回教えて頂いた別スレッドでの処理を使って、対応してみようと思います。ありがとうございます。

言葉の使い方についても、確かにその通りです。リンク先のトップページからいろいろ見ていると、なるほどと思いました。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -