В этом списке отображаются COM порты хост машины, если ком портов на машине нет, то так и будет
---------- Post added at 03:55 ---------- Previous post was at 02:10 ----------
Обновил эмулятор до версии 2754:
- добавлен хаес-модем написанный Eltaron;
- добавлена возможность выбора джойстика хост-машины
- добавлена возможность выбора джойстика на клавиатурном нумпаде.
![]()
Последний раз редактировалось ZXMAK; 09.06.2013 в 11:56.
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
Последний раз редактировалось ZXMAK; 09.06.2013 в 12:01.
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
С джойстиками замечено два бага:
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.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
Неа, поток-то всё равно другой остался. Падает с той же ошибкой, разве что 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?
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
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)
Последний раз редактировалось Eltaron; 09.06.2013 в 13:54.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)