С джойстиками замечено два бага:

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 ----------

Цитата Сообщение от [bETA]mEN Посмотреть сообщение
Требуется модем подключенный к com-порту?
Ага. Или модем, или сотовый через шнурок, или сотовый через блютуз. В двух последних случаях только надо чтоб при этом виртуальный 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.