WndProc пропускаются сообщения WM_DEVICECHANGE
От: Alex74 Россия  
Дата: 20.10.20 15:28
Оценка:
Здравствуйте.
Есть прибор, у которого несколько блоков, каждый подключается по USB. эмуляция COM-портов.
Пока портов было не больше двух — все работало нормально.
С появлением третьего (а в будущем, может и 4-й и 5-й появятся) появилась проблема.
при включении прибора, "одновременно" добавляются три COM порта COM3, COM6 и COM12.
По факту, при включении прибора, программа видит подключение только COM3 и COM12 (DeviceManager — видит появление всех).
а при отключении — видит только отключение COM6 и COM12.

 protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_DEVICECHANGE)
            {
                switch ((int)m.WParam)
                {
                    case DBT_DEVNODES_CHANGED:
                        break;
                    case DBT_DEVICEARRIVAL:
                        pHdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));
                        if (pHdr.dbcd_devicetype == DBT_DEVTYP_PORT)
                        {
                            Msg = Marshal.PtrToStringUni((IntPtr)(m.LParam.ToInt32() +
                                      Marshal.SizeOf(typeof(DEV_BROADCAST_PORT_Fixed))));
                            System.Diagnostics.Debug.Print("{0} Connected", Msg);
                        }
                        break;
                    case DBT_DEVICEREMOVECOMPLETE:
                        pHdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));
                        if (pHdr.dbcd_devicetype == DBT_DEVTYP_PORT)
                        {
                            Msg = Marshal.PtrToStringUni((IntPtr)(m.LParam.ToInt32() +
                                      Marshal.SizeOf(typeof(DEV_BROADCAST_PORT_Fixed))));
                            System.Diagnostics.Debug.Print("{0} Disconnected", Msg);
                        }
                        break;

                    default:
                        break;
                }
            }

            base.WndProc(ref m);
        }


При включении питания прибора выводится:
COM12 Connected
COM3 Connected
При отключении питания прибора:
COM12 Disconnected
COM6 Disconnected

Если прибор уже включен и выдергивать кабель от каждого USB, то детектирование подключения и отключения происходит без ошибок.

Можно как-то вылечить эту проблему?
wndproc wm_devicechange dbt_devicearrival dbt_deviceremovecomplete
Re: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 20.10.20 15:53
Оценка: -1
Здравствуйте, Alex74, Вы писали:

A>при включении прибора, "одновременно" добавляются три COM порта COM3, COM6 и COM12.


Это безусловно означает, что кривые или USB-контроллер прибора, или USB-контроллер компьютера, или винда. На этом фоне вряд ли имеет смысл разбираться дальше с WM_DEVICECHANGE — нужно сперва привести аппаратуру и/или систему в исправное состояние.

P.S. Пардон, неправильно процитировал. Надо было цитировать вот это: "Если прибор уже включен и выдергивать кабель от каждого USB, то детектирование подключения и отключения происходит без ошибок".
Отредактировано 20.10.2020 15:56 Евгений Музыченко . Предыдущая версия .
Re[2]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Alex74 Россия  
Дата: 20.10.20 16:27
Оценка:

Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Alex74, Вы писали:

A>>при включении прибора, "одновременно" добавляются три COM порта COM3, COM6 и COM12.

ЕМ>Это безусловно означает, что кривые или USB-контроллер прибора, или USB-контроллер компьютера, или винда. На этом фоне вряд ли имеет смысл разбираться дальше с WM_DEVICECHANGE — нужно сперва привести аппаратуру и/или систему в исправное состояние.

ЕМ>P.S. Пардон, неправильно процитировал. Надо было цитировать вот это: "Если прибор уже включен и выдергивать кабель от каждого USB, то детектирование подключения и отключения происходит без ошибок".


1. прибор — каждый usb-контроллер работает независимо, можно включать отключать. независимо от других.
2. компьютер — стандартный и современный на процессоре Intel
3. Windows-10 со всеми последними обновлениями.

по отдельности устройства (до двух подключенных одновременно) из прибора работают уже несколько месяцев и ни каких нареканий не было. Все стабильно (от отслеживания программой подключения и отключения до обмена данными)

Еще раз повторюсь... подключение каждого (любого из устройств) по очереди в любом порядке (путем подсоединения кабели или подачи на устройство питания) отслеживается правильно. с отключением — так-же.
Проблема возникает именно когда при подаче питания, подключаются одновременно все устройства. и соответственно, когда питание снимается и все три устройства одновременно отключаются.

В DeviсеManager все порты отображаются сразу. а в программе — пропускаются.

Так что, еще раз повторюсь, вижу проблему именно в пропуске сообщений.

Даже если устройство не "отметилось" в моем WinProc, я могу спокойно к нему подключиться и работать.

И хочется понять, пропуск сообщений — это НОРМАЛЬНО? Если это так — буду отслеживать подключение и отключение другими методами...
Re[3]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 20.10.20 16:39
Оценка:
Здравствуйте, Alex74, Вы писали:

A>Проблема возникает именно когда при подаче питания, подключаются одновременно все устройства. и соответственно, когда питание снимается и все три устройства одновременно отключаются.

A>В DeviсеManager все порты отображаются сразу. а в программе — пропускаются.

Попробуйте проверить сторонними средствами — например, USBLogView от NirSoft.
Re[4]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Alex74 Россия  
Дата: 20.10.20 16:55
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Alex74, Вы писали:


A>>Проблема возникает именно когда при подаче питания, подключаются одновременно все устройства. и соответственно, когда питание снимается и все три устройства одновременно отключаются.

A>>В DeviсеManager все порты отображаются сразу. а в программе — пропускаются.

ЕМ>Попробуйте проверить сторонними средствами — например, USBLogView от NirSoft.




мой текст WinProc в первом сообщении
Re[5]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Alex74 Россия  
Дата: 20.10.20 17:00
Оценка:
Здравствуйте, Alex74, Вы писали:

A> Здравствуйте, Евгений Музыченко, Вы писали:


ЕМ>>Здравствуйте, Alex74, Вы писали:


A>>>Проблема возникает именно когда при подаче питания, подключаются одновременно все устройства. и соответственно, когда питание снимается и все три устройства одновременно отключаются.

A>>>В DeviсеManager все порты отображаются сразу. а в программе — пропускаются.

ЕМ>>Попробуйте проверить сторонними средствами — например, USBLogView от NirSoft.


A>Image: vfot3h8XFPc8cg


A>мой текст WinProc в первом сообщении


дополнение:
Microsoft Visual Studio Community 2019
Версия 16.7.5

.NET Framework 4.5
Re[6]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Alex74 Россия  
Дата: 20.10.20 17:45
Оценка:
Здравствуйте, Alex74, Вы писали:

A>Здравствуйте, Alex74, Вы писали:


A>> Здравствуйте, Евгений Музыченко, Вы писали:


ЕМ>>>Здравствуйте, Alex74, Вы писали:


A>>>>Проблема возникает именно когда при подаче питания, подключаются одновременно все устройства. и соответственно, когда питание снимается и все три устройства одновременно отключаются.

A>>>>В DeviсеManager все порты отображаются сразу. а в программе — пропускаются.

ЕМ>>>Попробуйте проверить сторонними средствами — например, USBLogView от NirSoft.


A>>Image: vfot3h8XFPc8cg


A>>мой текст WinProc в первом сообщении


A>дополнение:

A>Microsoft Visual Studio Community 2019
A>Версия 16.7.5

A>.NET Framework 4.5


Вот еще пара скриншотов

Подключил все через USB-хаб. При отключении и включении хаба — то же самое. USBLogView детектирует правильно, а обработчик WndProc — пропускает
Re[7]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 20.10.20 18:24
Оценка: +1
Здравствуйте, Alex74, Вы писали:

A>Подключил все через USB-хаб. При отключении и включении хаба — то же самое. USBLogView детектирует правильно, а обработчик WndProc — пропускает


Если USBLogView ловит все события, значит, аппаратура и система работают правильно, и нет смысла пробовать хабы, менять порты и т.п. Проблема в Вашей программе.

Попробуйте поставить отладочные печати сразу после case — возможно, где-то лажают преобразования. Попробуйте сделать минимальное тестовое приложение на чистом C/C++ с тем же кодом — возможно, лажают переходники .NET.
Re[8]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Alex74 Россия  
Дата: 21.10.20 03:17
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Alex74, Вы писали:


A>>Подключил все через USB-хаб. При отключении и включении хаба — то же самое. USBLogView детектирует правильно, а обработчик WndProc — пропускает


ЕМ>Если USBLogView ловит все события, значит, аппаратура и система работают правильно, и нет смысла пробовать хабы, менять порты и т.п. Проблема в Вашей программе.


ЕМ>Попробуйте поставить отладочные печати сразу после case — возможно, где-то лажают преобразования. Попробуйте сделать минимальное тестовое приложение на чистом C/C++ с тем же кодом — возможно, лажают переходники .NET.


может быть дело в VisualStudio ?
я в шоке

вот исходники c# и с++ https://yadi.sk/d/OTrucipPPx162g минимум кода. Даю целиком, что-бы при частичном копировании что-то не упустить.
обе программы из 3-х сообщений стабильно видят только два иногда, очень редко, проскакивают все три.
еще раз добавлю. при то только при одновременном подключении и отключении трех портов. по одиночке — все нормально.

Уже склоняюсь, сделать так: при подключении любого из портов, проводить сканирование портов через setupapi.dll и подключаться.
но это не очень красиво
Re: WndProc пропускаются сообщения WM_DEVICECHANGE
От: okman Беларусь https://searchinform.ru/
Дата: 21.10.20 06:08
Оценка:
Здравствуйте, Alex74.

Я бы посоветовал ловить не DBT_DEVTYP_PORT, а DBT_DEVTYP_DEVICEINTERFACE (GUID интерфейса — GUID_DEVINTERFACE_COMPORT).
Насколько мне известно, нотификации port/volume оставлены для совместимости со старыми приложениями и в некоторых случаях могут возникать
проблемы с их доставкой (например, если в разделе конфигурации устройства в реестре еще не заполнены определенные параметры).

Вы можете для эксперимента попробовать просто выводить в лог все, что прилетает в WM_DEVICECHANGE/DBT_DEVICEARRIVAL.
Уверен, DBT_DEVTYP_DEVICEINTERFACE там будет всегда.
Re[2]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Alex74 Россия  
Дата: 21.10.20 09:37
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, Alex74.


O>Я бы посоветовал ловить не DBT_DEVTYP_PORT, а DBT_DEVTYP_DEVICEINTERFACE (GUID интерфейса — GUID_DEVINTERFACE_COMPORT).

O>Насколько мне известно, нотификации port/volume оставлены для совместимости со старыми приложениями и в некоторых случаях могут возникать
O>проблемы с их доставкой (например, если в разделе конфигурации устройства в реестре еще не заполнены определенные параметры).

O>Вы можете для эксперимента попробовать просто выводить в лог все, что прилетает в WM_DEVICECHANGE/DBT_DEVICEARRIVAL.

O>Уверен, DBT_DEVTYP_DEVICEINTERFACE там будет всегда.

Лог подключения и отключения:
DBT_DEVICEARRIVAL dbcd_devicetype=3
COM12 Connected
DBT_DEVICEARRIVAL dbcd_devicetype=3
COM3 Connected
COM12 Disconnected
COM6 Disconnected
DBT_DEVICEARRIVAL dbcd_devicetype=3
COM12 Connected
DBT_DEVICEARRIVAL dbcd_devicetype=3
COM3 Connected
COM12 Disconnected
COM6 Disconnected

Видно что при подключении появляются устройства только одного типа. DBT_DEVTYP_PORT

                    case DBT_DEVICEARRIVAL:
                        pHdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));
                        System.Diagnostics.Debug.Print("DBT_DEVICEARRIVAL dbcd_devicetype={0}", pHdr.dbcd_devicetype);
                        if (pHdr.dbcd_devicetype == DBT_DEVTYP_PORT)
                        {
                            Msg = Marshal.PtrToStringUni((IntPtr)(m.LParam.ToInt32() +
                                      Marshal.SizeOf(typeof(DEV_BROADCAST_PORT_Fixed))));
                            System.Diagnostics.Debug.Print("{0} Connected", Msg);
                            //Connect_Device(Msg);
                        }
                        break;
Re[2]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Alex74 Россия  
Дата: 21.10.20 09:50
Оценка:
O>Вы можете для эксперимента попробовать просто выводить в лог все, что прилетает в WM_DEVICECHANGE/DBT_DEVICEARRIVAL.
O>Уверен, DBT_DEVTYP_DEVICEINTERFACE там будет всегда.

DBT_DEVNODES_CHANGED
DBT_DEVICEARRIVAL dbcd_devicetype=3
COM12 Connected
DBT_DEVNODES_CHANGED
DBT_DEVICEARRIVAL dbcd_devicetype=3
COM3 Connected
COM12 Disconnected
DBT_DEVNODES_CHANGED
COM6 Disconnected
DBT_DEVNODES_CHANGED
DBT_DEVICEARRIVAL dbcd_devicetype=3
COM12 Connected
DBT_DEVNODES_CHANGED
DBT_DEVICEARRIVAL dbcd_devicetype=3
COM3 Connected
DBT_DEVNODES_CHANGED
DBT_DEVNODES_CHANGED
COM12 Disconnected
DBT_DEVNODES_CHANGED
COM6 Disconnected

                    case DBT_DEVNODES_CHANGED:
                        System.Diagnostics.Debug.Print("DBT_DEVNODES_CHANGED");
                        break;
                    case DBT_DEVICEARRIVAL:
                        pHdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));
                        System.Diagnostics.Debug.Print("DBT_DEVICEARRIVAL dbcd_devicetype={0}", pHdr.dbcd_devicetype);
                        if (pHdr.dbcd_devicetype == DBT_DEVTYP_PORT)
                        {
                            Msg = Marshal.PtrToStringUni((IntPtr)(m.LParam.ToInt32() +
                                      Marshal.SizeOf(typeof(DEV_BROADCAST_PORT_Fixed))));
                            System.Diagnostics.Debug.Print("{0} Connected", Msg);
                            //Connect_Device(Msg);
                        }
                        break;


количество DBT_DEVNODES_CHANGED совпадает с DBT_DEVICEARRIVAL (и DBT_DEVICEREMOVECOMPLETE при отключении)
Видимо сообщения теряются где-то на самом раннем этапе.
Re[3]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: okman Беларусь https://searchinform.ru/
Дата: 21.10.20 11:53
Оценка: +1
Здравствуйте, Alex74, Вы писали:

A>...

A>Видно что при подключении появляются устройства только одного типа. DBT_DEVTYP_PORT

Нужен еще вызов RegisterDeviceNotification с кодом DBT_DEVTYP_DEVICEINTERFACE.
И можно либо задать GUID интересующего интерфейса (поле dbcc_classguid), либо передать значение DEVICE_NOTIFY_ALL_INTERFACE_CLASSES,
тогда уведомления будут приходить для всех device interfaces в системе.
Re: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Alex74 Россия  
Дата: 24.10.20 12:53
Оценка:
Здравствуйте, Alex74, Вы писали:

A>Можно как-то вылечить эту проблему?


РЕЗЮМЕ по итогам (помимо этого форума, общался с некоторыми программистами windows):
У сообщений в главную форму "НЕТ ГАРАНТИИ ДОСТАВКИ". Т.е. если сообщений несколько и они идут СЛИШКОМ быстро, то могут быть потеряны. Если во время прихода сообщений в основном потоке производятся какие-нибудь вычисления, то все УСУГУБЛЯЕТСЯ. (в качестве примера приведу: если по нажатию кнопки запустить какое-нибудь длительное вычисление, то ФОРМА перестанет реагировать на нажатия клавиш и мышь, то есть сообщения ТЕРЯЮТСЯ (ИГНОРИРУЮТСЯ))

Если кто-то не согласен — проблема описана, дайте ГОТОВОЕ НАДЕЖНОЕ решение. пустословия — не надо.

Как решил проблему:
отключения — ловятся по Exception при обращении.

Подключения — пока все устройства (порты) не подключены, по таймеру идет периодическое сканирование списка доступных портов System.IO.Ports.SerialPort.GetPortNames(), их проверка на соответствие требованиям и подключение.

Всем СПАСИБО.

PS. Если кто-то сможет показать более красивое, при этом НАДЕЖНОЕ, решение буду признателен.
Re[2]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 24.10.20 15:51
Оценка: 1 (1) +1 -1
Здравствуйте, Alex74, Вы писали:

A> У сообщений в главную форму .


Что такое "сообщения в главную форму"? Те сообщения, что Вы заказываете у системы, доставляются в окно (в его очередь сообщений).

A> "НЕТ ГАРАНТИИ ДОСТАВКИ"


Это оговорено в документации, или фантазии "некоторых программистов windows"?

A> Т.е. если сообщений несколько и они идут СЛИШКОМ быстро, то могут быть потеряны.


"Слишком быстро" для современных систем — это минимум тысячи сообщений в секунду, приходящих извне, когда система не может регулировать скорость их поступления. В данном случае все сообщения извне идут по USB, и система, судя по Вашим описаниям, всегда обрабатывает их корректно (все устройства успешно подключаются, доступны, не зависают, не теряются и т.п.). Сообщения о подключении/отключении устройств и интерфейсов создаются самой системой в процессе установки/удаления устройств. Этих сообщений — единицы в секунду, они занимают мизерное количество памяти, им физически негде "теряться".

A> (в качестве примера приведу: если по нажатию кнопки запустить какое-нибудь длительное вычисление, то ФОРМА перестанет реагировать на нажатия клавиш и мышь


Поздравляю, Вы открыли для себя принцип обработки сообщений в Windows, который не менялся с конца 80-х годов прошлого века. Это намек на то, что перед написанием не совсем примитивных программ таки стоило бы почитать документацию хотя бы в самых общих чертах.

A> то есть сообщения ТЕРЯЮТСЯ (ИГНОРИРУЮТСЯ))


Нет, сообщения просто ждут в очереди, пока их оттуда достанут.

A> Если кто-то не согласен — проблема описана, дайте ГОТОВОЕ НАДЕЖНОЕ решение. пустословия — не надо.


Разрешите выполнять бегом?

A>PS. Если кто-то сможет показать более красивое, при этом НАДЕЖНОЕ, решение буду признателен.


Надежное решение подразумевает разделение синхронных и асинхронных операций. Поскольку Вы, в нарушение элементарных правил, смешали все в одну кучу, надежной обработки асинхронных событий не будет.
Re[3]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Alex74 Россия  
Дата: 25.10.20 09:02
Оценка: -3
Здравствуйте, Евгений Музыченко, Вы писали:



ЕМ>Что такое "сообщения в главную форму"? Те сообщения, что Вы заказываете у системы, доставляются в окно (в его очередь сообщений).

Им надоедает ждать в очереди и они разбегаются туда где веселей

A>> "НЕТ ГАРАНТИИ ДОСТАВКИ"


ЕМ>Это оговорено в документации, или фантазии "некоторых программистов windows"?

Если Вы такой грамотный, укажите в какой документации и на какой странице написано о ГАРАНТИИ ДОСТАВКИ


ЕМ>Нет, сообщения просто ждут в очереди, пока их оттуда достанут.

Где эта очередь? и чем достать?

A>> Если кто-то не согласен — проблема описана, дайте ГОТОВОЕ НАДЕЖНОЕ решение. пустословия — не надо.

ЕМ>Разрешите выполнять бегом?
Опять же повторюсь... Если Вы такой умный — исходники выложены, минимум кода, УКАЖИТЕ ГДЕ ОШИБКА (что сделано неправильно).


A>>PS. Если кто-то сможет показать более красивое, при этом НАДЕЖНОЕ, решение буду признателен.

ЕМ>Надежное решение подразумевает разделение синхронных и асинхронных операций. Поскольку Вы, в нарушение элементарных правил, смешали все в одну кучу, надежной обработки асинхронных событий не будет.
О!!! и как мне разделить синхронные и асинхронные в СИНХРОННОЙ программе?
Re[3]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Alex74 Россия  
Дата: 25.10.20 09:20
Оценка: -2
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Alex74, Вы писали:


A>> У сообщений в главную форму .


ЕМ>Что такое "сообщения в главную форму"? Те сообщения, что Вы заказываете у системы, доставляются в окно (в его очередь сообщений).


A>> "НЕТ ГАРАНТИИ ДОСТАВКИ"


ЕМ>Это оговорено в документации, или фантазии "некоторых программистов windows"?


A>> Т.е. если сообщений несколько и они идут СЛИШКОМ быстро, то могут быть потеряны.


ЕМ>"Слишком быстро" для современных систем — это минимум тысячи сообщений в секунду, приходящих извне, когда система не может регулировать скорость их поступления. В данном случае все сообщения извне идут по USB, и система, судя по Вашим описаниям, всегда обрабатывает их корректно (все устройства успешно подключаются, доступны, не зависают, не теряются и т.п.). Сообщения о подключении/отключении устройств и интерфейсов создаются самой системой в процессе установки/удаления устройств. Этих сообщений — единицы в секунду, они занимают мизерное количество памяти, им физически негде "теряться".


A>> (в качестве примера приведу: если по нажатию кнопки запустить какое-нибудь длительное вычисление, то ФОРМА перестанет реагировать на нажатия клавиш и мышь


ЕМ>Поздравляю, Вы открыли для себя принцип обработки сообщений в Windows, который не менялся с конца 80-х годов прошлого века. Это намек на то, что перед написанием не совсем примитивных программ таки стоило бы почитать документацию хотя бы в самых общих чертах.


A>> то есть сообщения ТЕРЯЮТСЯ (ИГНОРИРУЮТСЯ))


ЕМ>Нет, сообщения просто ждут в очереди, пока их оттуда достанут.


A>> Если кто-то не согласен — проблема описана, дайте ГОТОВОЕ НАДЕЖНОЕ решение. пустословия — не надо.


ЕМ>Разрешите выполнять бегом?


A>>PS. Если кто-то сможет показать более красивое, при этом НАДЕЖНОЕ, решение буду признателен.


ЕМ>Надежное решение подразумевает разделение синхронных и асинхронных операций. Поскольку Вы, в нарушение элементарных правил, смешали все в одну кучу, надежной обработки асинхронных событий не будет.


Проблема описана ОЧЕНЬ ПОДРОБНО. Ни одного ДЕЛЬНОГО ответа от Вас не поступило, сплошные обвинения в НЕГРАМОТНОСТИ.
Намного ли Вы ГРАМОТНЕЕ меня?

PS. Если нечего РЕАЛЬНО полезного сказать — лучше НИЧЕГО не пишите. (промолчите, тогда может за умного сойдете) ПУСТОСЛОВОВ и без Вас полно.
Re[4]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 25.10.20 09:43
Оценка: 1 (1) +1 -2
Здравствуйте, Alex74, Вы писали:

A>исходники выложены, минимум кода, УКАЖИТЕ ГДЕ ОШИБКА (что сделано неправильно).


Я не нанимался разбираться в Ваших исходниках. А неправильно прежде всего то, что Вы не понимаете, как работает система, под которую Вы взялись программировать. Поэтому Вам следует сперва освоить азы, и только затем делать какой-то код. Иначе Вы и дальше будете наступать на те же грабли.

A> О!!! и как мне разделить синхронные и асинхронные в СИНХРОННОЙ программе?


Синхронная программа не обрабатывает асинхронных событий. Она получает на входе набор готовых данных, выполняет над ним заданные операции, и выдает результат. Логика ее работы полностью определяется набором входных данных. Это, собственно, тоже азы программирования, если что.
Re[5]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Alex74 Россия  
Дата: 25.10.20 09:51
Оценка: -3
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Alex74, Вы писали:


A>>исходники выложены, минимум кода, УКАЖИТЕ ГДЕ ОШИБКА (что сделано неправильно).


ЕМ>Я не нанимался разбираться в Ваших исходниках. А неправильно прежде всего то, что Вы не понимаете, как работает система, под которую Вы взялись программировать. Поэтому Вам следует сперва освоить азы, и только затем делать какой-то код. Иначе Вы и дальше будете наступать на те же грабли.



Вы такой УМНЫЙ и знающий... Но несколько строк кода (умещающихся на одну страницу) посмотреть слабо. А точнее ПО СУЩЕСТВУ сказать нечего, проще ОПУСТИТЬ других и подняться ПОВЫШЕ...


A>> О!!! и как мне разделить синхронные и асинхронные в СИНХРОННОЙ программе?


ЕМ>Синхронная программа не обрабатывает асинхронных событий. Она получает на входе набор готовых данных, выполняет над ним заданные операции, и выдает результат. Логика ее работы полностью определяется набором входных данных. Это, собственно, тоже азы программирования, если что.


Ну да, АЗЫ... НА ВОПРОС "Как обрабатывать входные данные если они теряются?" ГДЕ ОТВЕТ? ГДЕ НАЙТИ ДАННЫЕ, которые НЕ ДОШЛИ?
Re[6]: WndProc пропускаются сообщения WM_DEVICECHANGE
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 25.10.20 10:09
Оценка: 1 (1) +1 -1
Здравствуйте, Alex74, Вы писали:

A>несколько строк кода (умещающихся на одну страницу) посмотреть слабо


Во-первых, это бессмысленно, поскольку Вы, еще раз повторю, не понимаете основ, без которых Вам не сделать надежно работающей программы. Ковыряя код и применяя интуитивные костыли, Вы в лучшем случае сделаете кривую поделку, за которую кто-то заплатит, как за качественную программу. Не вижу смысла помогать Вам в этом.

Во-вторых, Ваше необоснованное, но старательно демонстрируемое возмущение там, где следовало бы быть вдумчивости, совершенно не порождает желания идти навстречу.

A>ГДЕ НАЙТИ ДАННЫЕ, которые НЕ ДОШЛИ?


В грамотно (в соответствии с системными принципами и рекомендациями) написанную программу все эти данные доходят всегда.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.