|
いろいろ試してみたのですが
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 を使用してください。
というエラーが出てしまいます。
一体どのようにすれば良いでしょうか?
|