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

わんくま同盟

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

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


(過去ログ 150 を表示中)
■87419 / )  Re[5]: USBゲームパッドを使えるようにしたい
□投稿者/ ままぞん (5回)-(2018/05/19(Sat) 22:31:23)
いろいろ試してみたのですが
https://github.com/sharpdx/SharpDX-Samples/blob/master/Desktop/DirectInput/JoystickApp/Program.cs

このページを参考にすることで
ゲームパッドの信号を読み取ることに成功しました。

以下はフォームアプリケーションです。


    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

        Dim dinput As DirectInput = New DirectInput
        ' Search for device
        For Each device As DeviceInstance In dinput.GetDevices(DeviceClass.GameController, DeviceEnumerationFlags.AttachedOnly)
            ' Create device
            Try
                Joystick = New Joystick(dinput, device.InstanceGuid)
                Exit For
            Catch ex As DirectInputException

            End Try

        Next
        If (Joystick Is Nothing) Then
            Throw New Exception("No joystick found")
        End If

        For Each deviceObject As DeviceObjectInstance In Joystick.GetObjects
            If ((deviceObject.ObjectType And ObjectDeviceType.Axis) <> 0) Then
                Joystick.GetObjectPropertiesById(CType(deviceObject.ObjectType, Integer)).SetRange(-100, 100)
            End If

        Next

        Joystick.Properties.BufferSize = 128   


        Dim MultiProgram_GamePad As System.Threading.Thread = New Thread(Sub() GamePad_run()) With {.IsBackground = True}

        MultiProgram_GamePad.Start()


    End Sub

    Private Sub GamePad_run()

        Do

            If Joystick.Acquire.IsSuccess Then
                Joystick.Poll()



                For Each state In Joystick.GetBufferedData

                    frm.BeginInvoke(SetTextBox_dgl, frm.TextBox4, Joystick.GetCurrentState().X.ToString)

                Next state

            End If

        Loop


    End Sub


のようにして、マルチスレッドにして、Do無限ループでコントローラーの動作を読み取るようにしています。
しかし、この方法だとCPUの一つのスレッドの使用率が100%になってしまいます。
4コア8スレッドだとCPU使用率が12.5%になってしまいます。

一方で、87409にコードを参考にして、MessagePump.Runを利用して


以下はコンソールアプリケーションです。

    Sub main()

        Dim form = New RenderForm("SlimDX - DirectInput Sample")
        Dim factory = New Factory
        Dim target = New WindowRenderTarget(factory, New WindowRenderTargetProperties() With {.Handle = form.Handle, .PixelSize = form.ClientSize})


        Dim dinput As DirectInput = New DirectInput
        ' Search for device
        For Each device As DeviceInstance In dinput.GetDevices(DeviceClass.GameController, DeviceEnumerationFlags.AttachedOnly)
            ' Create device
            Try
                Joystick = New Joystick(dinput, device.InstanceGuid)
                Exit For
            Catch ex As DirectInputException

            End Try

        Next
        If (Joystick Is Nothing) Then
            Throw New Exception("No joystick found")
        End If

        For Each deviceObject As DeviceObjectInstance In Joystick.GetObjects
            If ((deviceObject.ObjectType And ObjectDeviceType.Axis) <> 0) Then
                Joystick.GetObjectPropertiesById(CType(deviceObject.ObjectType, Integer)).SetRange(-100, 100)
            End If

        Next



        Joystick.Properties.BufferSize = 128


        MessagePump.Run(
form,
Sub()
    If Joystick.Acquire.IsSuccess Then
        Joystick.Poll()
        For Each state In Joystick.GetBufferedData

            form.Text = Joystick.GetCurrentState().X.ToString

        Next
    End If
    target.BeginDraw()
    target.Clear()
    target.EndDraw()
End Sub
)

End Sub

のようにすると、CPU使用率が1%程度までしか上がりません。

MessagePump.RunはSlimDXのコンポーネントであることは分かったのですが
どのようなものなのか分かりませんでした。

MessagePump.Runをフォームアプリケーションでも使いたいのですが、

        MessagePump.Run(
Me,
Sub()
    If Joystick.Acquire.IsSuccess Then
        Joystick.Poll()
        For Each state In Joystick.GetBufferedData

            TextBox6.Text = Joystick.GetCurrentState().X.ToString

        Next
    End If
End Sub
)

というコードをForm1_Loadに入れてみたのですが、


型 'System.InvalidOperationException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました

追加情報:単一スレッド上で 2 回目のメッセージ ループを開始することは有効な操作ではありません。Form.ShowDialog を使用してください。

というエラーが出てしまいます。
一体どのようにすれば良いでしょうか?


返信 編集キー/


管理者用

- Child Tree -