джойстик работает нормально
http://i.imgur.com/ypG88ri.png
это норма?
Вид для печати
джойстик работает нормально
http://i.imgur.com/ypG88ri.png
это норма?
В этом списке отображаются COM порты хост машины, если ком портов на машине нет, то так и будет
---------- Post added at 03:55 ---------- Previous post was at 02:10 ----------
Обновил эмулятор до версии 2754:
- добавлен хаес-модем написанный Eltaron;
- добавлена возможность выбора джойстика хост-машины
- добавлена возможность выбора джойстика на клавиатурном нумпаде.
http://savepic.org/3583645.png
С джойстиками замечено два бага:
1. От этого падает если в системе два или больше джойстиков:
Скрытый текст
Error 13:53:04.953 Exception System.Reflection.TargetInvocationException: Адресат вызова создал исключение.
в System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
в System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
в System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
в System.Activator.CreateInstance(Type type, Boolean nonPublic)
в System.Activator.CreateInstance(Type type)
в ZXMAK2.Controls.FormMachineSettings.CreateConfigScreenControl(BusManager bmgr, Object objTarget) в c:\Projects\zxmak2-clean\ZXMAK2\Controls\FormMachineSettings.cs:строка 404
в ZXMAK2.Controls.FormMachineSettings.initWorkBus() в c:\Projects\zxmak2-clean\ZXMAK2\Controls\FormMachineSettings.cs:строка 460
InnerException System.InvalidOperationException: Сбой при сравнении двух элементов массива.
в System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
в System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 comparer)
в System.Collections.Generic.List`1.Sort(Int32 index, Int32 count, IComparer`1 comparer)
в System.Collections.Generic.List`1.Sort()
в ZXMAK2.MDX.DirectJoystick.Select() в c:\Projects\zxmak2-clean\ZXMAK2\MDX\DirectJoystick.cs:строка 352
в ZXMAK2.Controls.Configuration.CtlSettingsJoystick.BindTypeList() в c:\Projects\zxmak2-clean\ZXMAK2\Controls\Configuration\CtlSettingsJoystick.cs:строка 28
в ZXMAK2.Controls.Configuration.CtlSettingsJoystick..ctor() в c:\Projects\zxmak2-clean\ZXMAK2\Controls\Configuration\CtlSettingsJoystick.cs:строка 22
InnerException System.ArgumentException: По крайней мере в одном объекте должен быть реализован интерфейс IComparable.
в System.Collections.Comparer.Compare(Object a, Object b)
в System.Collections.Generic.ObjectComparer`1.Compare(T x, T y)
в System.Collections.Generic.ArraySortHelper`1.SwapIfGreaterWithItems(T[] keys, IComparer`1 comparer, Int32 a, Int32 b)
в System.Collections.Generic.ArraySortHelper`1.QuickSort(T[] keys, Int32 left, Int32 right, IComparer`1 comparer)
в System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
---
Full StackTrace:
в ZXMAK2.LogAgent.Error(Exception ex)
в ZXMAK2.Controls.FormMachineSettings.initWorkBus()
в ZXMAK2.Controls.FormMachineSettings.Init(VirtualMachine vm, RenderVideo renderVideo)
в ZXMAK2.Controls.FormMain.menuVmOptions_Click(Object sender, EventArgs e)
в System.Windows.Forms.MenuItem.OnClick(EventArgs e)
в System.Windows.Forms.MenuItem.MenuItemData.Execute()
в System.Windows.Forms.Command.Invoke()
в System.Windows.Forms.Command.DispatchID(Int32 id)
в System.Windows.Forms.Control.WmCommand(Message& m)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ScrollableControl.WndProc(Message& m)
в System.Windows.Forms.ContainerControl.WndProc(Message& m)
в System.Windows.Forms.Form.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
в System.Windows.Forms.Application.Run(Form mainForm)
в ZXMAK2.Program.Main(String[] args)
[свернуть]
Фикс простой:
Скрытый текст
Код:Index: HostDeviceInfo.cs
===================================================================
--- HostDeviceInfo.cs (revision 26670)
+++ HostDeviceInfo.cs (working copy)
@@ -2,7 +2,7 @@
namespace ZXMAK2.Entities
{
- public class HostDeviceInfo
+ public class HostDeviceInfo : IComparable
{
public string Name { get; private set; }
public string HostId { get; private set; }
@@ -17,5 +17,10 @@
{
return Name;
}
+
+ public int CompareTo(object obj)
+ {
+ return ToString().CompareTo(obj.ToString());
+ }
}
}
[свернуть]
2. От этого не падает, но джойстики просто не работают в некоторых случаях:
Скрытый текст
Error 14:01:17.332 Exception System.InvalidOperationException: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "FormMain" не из того потока, в котором он был создан.
в System.Windows.Forms.Control.get_Handle()
в Microsoft.DirectX.DirectInput.Device.SetCooperativeLevel(Control parent, CooperativeLevelFlags flags)
в ZXMAK2.MDX.DirectJoystick.CaptureHostDevice(String hostId) в c:\Projects\zxmak2-clean\ZXMAK2\MDX\DirectJoystick.cs:строка 101
---
Full StackTrace:
в ZXMAK2.LogAgent.Error(Exception ex)
в ZXMAK2.MDX.DirectJoystick.CaptureHostDevice(String hostId)
в ZXMAK2.Engine.InputAggregator.Capture()
в ZXMAK2.Engine.InputAggregator..ctor(IHostKeyboard hostKeyboard, IHostMouse hostMouse, IHostJoystick hostJoystick, IKeyboardDevice[] keyboards, IMouseDevice[] mouses, IJoystickDevice[] joysticks)
в ZXMAK2.Engine.VirtualMachine.runThreadProc()
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()
[свернуть]
Фикс:
Скрытый текст
Код:Index: DirectJoystick.cs
===================================================================
--- DirectJoystick.cs (revision 26670)
+++ DirectJoystick.cs (working copy)
@@ -69,6 +69,13 @@
}
}
+ // Should be executed in the FormMain thread
+ public delegate void FormMainDelegate(Form form, Device joystick);
+ public static void SetCooperativeLevel(Form form, Device joystick)
+ {
+ joystick.SetCooperativeLevel(form, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive);
+ }
+
public void CaptureHostDevice(string hostId)
{
try
@@ -98,7 +105,8 @@
var joystick = new Device(deviceInstance.InstanceGuid);
try
{
- joystick.SetCooperativeLevel(m_form, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive);
+ // multithreaded joystick.SetCooperativeLevel analogue
+ m_form.Invoke(new FormMainDelegate(SetCooperativeLevel), m_form, joystick);
joystick.SetDataFormat(DeviceDataFormat.Joystick);
joystick.Acquire();
}
[свернуть]
---------- Post added at 14:27 ---------- Previous post was at 14:17 ----------
Ага. Или модем, или сотовый через шнурок, или сотовый через блютуз. В двух последних случаях только надо чтоб при этом виртуальный COM-порт создавался.
---------- Post added at 14:41 ---------- Previous post was at 14:27 ----------
И наверное есть смысл сделать так:
Скрытый текст
Код:Index: CtlSettingsJoystick.cs
===================================================================
--- CtlSettingsJoystick.cs (revision 26670)
+++ CtlSettingsJoystick.cs (working copy)
@@ -37,7 +37,7 @@
m_bmgr = bmgr;
m_device = device;
- cbxType.SelectedIndex = -1;
+ cbxType.SelectedIndex = 0;
for (var i = 0; i < cbxType.Items.Count; i++)
{
var hdi = (HostDeviceInfo)cbxType.Items[i];
[свернуть]
Иначе если запустить эмулятор, а перед запуском отключить тот джойстик, который прописан в конфиге, то при входе в Settings и нажатии Apply вылетает окошко про NullReferenceException.
Неа, поток-то всё равно другой остался. Падает с той же ошибкой, разве что Stacktrace уменьшился на одну строчку.
Скрытый текст
Error 14:50:26.667 Exception System.InvalidOperationException: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "FormMain" не из того потока, в котором он был создан.
в System.Windows.Forms.Control.get_Handle()
в ZXMAK2.MDX.DirectJoystick.CaptureHostDevice(String hostId) в c:\Projects\zxmak2-clean\ZXMAK2\MDX\DirectJoystick.cs:строка 101
[свернуть]
ах ну да, а если хэндл окна в конструкторе сохранять и потом использовать готовый, без обращения к mainform?
Haldle же всего лишь объект ядра, число. Оно вроде неизменное на всём протяжении работы программы.
Но счас попробую.
Ошибся, не число, а IntPtr это. Работает! :)
---------- Post added at 15:49 ---------- Previous post was at 15:34 ----------
Еще баг - если вытащить джойстик во время работы, то падает в районе DirectJoystick.cs:43 с разными ошибками. Было и "Коллекция была изменена; невозможно выполнить операцию перечисления", и что-то про невозможность перечисления пустой коллекции. Эмулятор при этом прекращает работу.
Ой, строка 43 - это же у меня после разных изменений :) В общем, тут падает:
Код:var guidList = m_devices.Keys;
foreach (var guid in guidList)