Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Грубо, есть функция DeviceReceiveThread. Выполняется в своем потоке, ожидающем сигнала о том что есть "входящий телефонный вызов". На всякий случай приведу ее оригинал (из MS SDK) целиком под спойлером: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. Смысл такой. Бесконечно ждет через WaitForMultipleObjects одного из 2-х "сигналов": (1) Сигнал на выход из функции (реализован внутри библиотеки) Т.е. когда пользователь решил не использовать "девайс" для приема вызовов, по этому сигналу функция самозавершается. Код: plaintext 1. Это меня устраивает. (2) Сигнал о том, что есть входящий вызов, на который надо реагировать. В тестовой SDK-библиотеке это реализовано так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Т.е. этот объект следит за изменением атрибутов файлов в заданной папке g_pDeviceInfo[dwDeviceId]->Directory через FindFirstChangeNotification. и как только я поменял какой-то атрибут у какого-то файла, это будет "звоночек в функцию". Это сделано для теста. Меня устраивает (1) и я не хочу это менять но ясен пень не устраивает (2). (2) я хочу реализовать так. читать MailSlot в этой ф-ции, как-только есть сообщение это означает "звоночек" и WaitForMultipleObjects выходит. Т.е. мне надо стукнуть в DeviceReceiveThread из другого приложения (при этом желат. получить ответ, но это уже другой вопрос). Как мне увязать WaitForMultipleObjects и MailSlot? MailSlot обычно читается циклом, (либо бесконечное ожидание). Т.е. мне нужно внутри ф-ции сделать hWaitObjects[1] который бы стучал в WaitForMultipleObjects "в MailSlot есть сообщение". Я не могу одновременно бесконечно ждать сообщение MailSlot (через ReadFile) и бесконечно ждать ->ExitEvent (через WaitForMultiple(Single)Objects). Если я сделаю цикл с небесконечными ожиданиями, то не работает принцип "как только так сразу" для любого из событий, и не уверен что это есть хорошо. Как извернуться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 20:54 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Как извернуться? изворачиваться не надо, ибо MailSlot поддерживает Overlapped I/O и WaitForMultipleObjects вполне может ждать заодно и чтения из мейлслота. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 21:30 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Изопропил, Пока каша. Вот в этом примере: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365785(v=vs.85).aspx есть &ov в ReadFile(hSlot, и есть Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. мне это пока ни о чем не говорит. В C я обычно читаю его циклом (таймаут задан в CreateMailSlot, могу в этом цикле делать еще что-то) Код: plaintext 1. 2. В .Net я многопоточность так толком и не освоил (а в VB6 ее в рабочем виде и не было никогда), поэтому роскошь сидеть и ждать позволить не могу в CreateMailSlot таймаут =0 и читаем таймером скажем 300мс нет ли чего но опять же без последнего параметра Код: vbnet 1. Т.е. я не догоняю как сделать и WaitForMultipleObjects вполне может ждать заодно и чтения из мейлслота. мне даже не само чтение нужно, а "сигнал", Мне нужен аналог вот этого: Код: plaintext 1. 2. Хоть пример кода бы какой что-ли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 21:58 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77В .Net я многопоточность так толком и не освоил (а в VB6 ее в рабочем виде и не было никогда), поэтому роскошь сидеть и ждать позволить не могу overlapped для того и нужен, чтоб избежать многопоточности Последним параметром в ReadFile передавать нужно адрес OVERLAPPED структуры, а ждать события, хэндл которого ты вписал в эту структуру. Примеры могут быть любыми - с файлами, сокетами, именоваными каналами - разницы никакой (собственно потому практически отсутствуют примеры с асинхронными mailslot ) придётся накидать пример - чуть позже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 22:13 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Изопропил, Я вот тут погуглил, нашел вот это WaitForSingleObject and mailslot IPC Там идея интересная: авторYes you can. You will need to create a named event using CreateEvent in your server and then use OpenEvent in the client to get a handle to it. So, in the server: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. And in the client: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Для "стукануть" похоже подойдет даже без самого mailslot. Идея, что приложение ведающее телефонией получив Incoming Call должно стукануть в девайс через DeviceReceiveThread в FSP, а оттуда уже все запускается. При этом DeviceReceiveThread может отсутствовать (устройство не принимает входящие вызовы), в случае если приемник-MailSlot, тогда он тоже отсутствует и отправитель получит ошибку сразу. Но может и присутствовать (устройство принимает входящие вызовы) но при этом не иметь статус Код: plaintext 1. (т.е. устройстро уже занято обработкой другого вх. или исх. вызова). Поэтому устройство должно по любому дать ответ, чтобы если оно "занято делом", перейти к опросу следующего. Нет свободного, телефонное приложение футболит вызов со статусом BUSY. Но это уже логика, счас задача просто "стукануть", чтоб инициализировать работу FSP при входящем вызове (с исходящими более менее логику взаимодействия понял). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 23:18 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, лови кусок говнокода - запись в мейлслот по конрол-С, таймер - для большей достоверности примера Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 00:09 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Изопропил, Я тут пока с Event тест их 2-х VB сделал, как в примере что накопал, хотя в примере перепутано немного. Т.е. приемник создает Event (вместо mailslot) и ждет когда в него просигналят: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. А передатчик сигналит в этот Event вот так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. Все работает. Отличие от MailSlot в том что Event не передает "сообщение". Возможно Event достаточно если просто "стукануть" без передачи параметров. SA кстати в Event можно такой же запихивать как в MailSlot? (это когда сервис с не-сервисом общается и т.п. чтоб все всех видели, есть у меня эта ф-ция). ===== Если все-таки нужно сообщение, можно конечно пихнуть в DeviceReceiveThread Event+MailSlot (по сигналу Event читаем MailSlot), но не перебор ли. Поэтому попытаюсь осознать твой код. Я так понял, таймер там для "второго объекта" кот. в моем случае ->ExitEvent ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 01:32 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77 SA кстати в Event можно такой же запихивать как в MailSlot? (это когда сервис с не-сервисом общается и т.п. чтоб все всех видели, есть у меня эта ф-ция). SA да, такой же. Но для Event этого недостаточно. Надо еще Global\ к имени приписывать: " Global\\ SomeUniqueName". Ну, с Event у меня все прокатило. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. Блин, как в вашем C (13-я студия) настроить редактор кода, чтобы он {TAB}-ом отступы не добавлял. Просто открываешь приличный код (где отступы забиты пробелами), дописываешь свой, а потом весь код прыгает, хотя бы когда его сюда копируешь. И как исправить, если уже табов поналяпано. Я задолбался ручками табы на пробелы менять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 03:48 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
А вроде нашел: Сервис-> Параметры-> Текстовый редактор -> C/C++ ->Табуляция =Вставлять пробелы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 03:56 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Изопропил, спасибо за код. Поэкспериментировал в .Net, возникло понимание Вроде фурычит как хотелось. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. Там по хорошему ERROR_INSUFFICIENT_BUFFER проверять надо, и если что перечитывать синхронно, получив точный lBufferSize через GetMailslotInfo. В VB люблю аккуратность. Но в C этого все одно делать не буду, Redim не осилю и т.п. ставлю буфер=1000 с запасом, и проверками особо не балуюсь. Все равно в mailslot мое же приложение и кладет, и больше 1000 точно не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 07:38 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, в студии(в "нашем" С) есть комбинация клавиш для форматирования исходников Cntrl-K Cntrl-D Cntrl-K Cntrl-F и много других полезных комбинаций https://msdn.microsoft.com/ru-ru/library/da5kh0wa.aspx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 07:40 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Там по хорошему ERROR_INSUFFICIENT_BUFFER проверять надо опустил в полном сознании, ибо задал макс размер в CreateMailSlot если не задать - будут лёгкие проблемы , ибо при запуске асинхронного чтения размер сообщения ещё не известен,а если прилелетело ERROR_INSUFFICIENT_BUFFER - нужно синхронно прочитать это сообщение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 07:45 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Надо еще Global\ к имени приписывать с этим поаккурантее и в полном сознании https://msdn.microsoft.com/en-us/library/windows/desktop/aa382954(v=vs.85).aspx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 08:17 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
ИзопропилДмитрий77Там по хорошему ERROR_INSUFFICIENT_BUFFER проверять надо опустил в полном сознании, ибо задал макс размер в CreateMailSlot если не задать - будут лёгкие проблемы , ибо при запуске асинхронного чтения размер сообщения ещё не известен,а если прилелетело ERROR_INSUFFICIENT_BUFFER - нужно синхронно прочитать это сообщение Я не задаю макс размер в CreateMailSlot, но в C-кодах делаю без проверки ERROR_INSUFFICIENT_BUFFER, полагаясь на то что отсылаемое(моей же программой) сообщение не может быть длиннее 1000, которую задаю. Но если все таки ERROR_INSUFFICIENT_BUFFER придет, то проблемы будут большие, след. сообщение уже не прочтешь. ИзопропилДмитрий77Надо еще Global\ к имени приписывать с этим поаккурантее и в полном сознании https://msdn.microsoft.com/en-us/library/windows/desktop/aa382954(v=vs.85).aspx А чем я рискую? Я надеюсь оно по сети не будет стучать на соседний компьютер или по RDP если там такое же приложение запущено. Ну, для Windows Store такие приложения не пишутся. Скорее Windows Store сдохнет, чем MS разрешит для него писать через нормальные классические API. FSP -всегда сервис (и уже сразу во время тестов, это dll, запускаемая MS службой Fax), второе приложение (телефонная начинка) - потом видимо будет отдельным сервисом, или вообще запускаться из-под dll, но в процессе тестов и изысканий - естественно не service, поэтому по другому никак. С mailslot никакого global не надо, думаю ограничусь mailslot, чтоб не разводить зоопарк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 16:43 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Я не задаю макс размер в CreateMailSlot, но в C-кодах делаю без проверки ERROR_INSUFFICIENT_BUFFER, полагаясь на то что отсылаемое(моей же программой) сообщение не может быть длиннее 1000, которую задаю. Многовато, может не дойти https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa365147(v=vs.85).aspx If CreateFile specifies a domain or uses the asterisk format to specify the system's primary domain, the application cannot write more than 424 bytes at a time to the mailslot. If the application attempts to do so, the WriteFile function fails and GetLastError returns ERROR_BAD_NETPATH. Тут тоже упоминается 424 https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa365130(v=vs.85).aspx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 16:53 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77SA да, такой же. Но для Event этого недостаточно. Надо еще Global\ к имени приписывать: " Global\\ SomeUniqueName". Ну, с Event у меня все прокатило. Не везде прокатывает, там еще права надо давать, чтобы из других сессий до него добраться. 18479811 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 17:04 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Dima TМноговато, может не дойти Тут тоже упоминается 424 Ну, таких длинных не посылаем. Буфер в 1000 это перестраховка из-за нежелания обрабатывать ERROR_INSUFFICIENT_BUFFER в C. Тогда вообще можно не париться и не переживать, раз длинное все одно не дойдет. В VB я всегда делаю 260, при этом с обработкой ERROR_INSUFFICIENT_BUFFER. Dima TДмитрий77SA да, такой же. Но для Event этого недостаточно. Надо еще Global\ к имени приписывать: " Global\\ SomeUniqueName". Ну, с Event у меня все прокатило. Не везде прокатывает, там еще права надо давать, чтобы из других сессий до него добраться. 18479811 Ну, это я в курсе, об этом я как раз в первую очередь подумал, до того как про Global доперло. Функцию ниже писал для mailslot но она одинаково подходит и для Event. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. Короче сделал я с Mailslot, все получилось, примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. Типа лог: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 18:50 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Дмитрий77Буфер в 1000 это перестраховка из-за нежелания обрабатывать ERROR_INSUFFICIENT_BUFFER в C. Тогда вообще можно не париться и не переживать, раз длинное все одно не дойдет. В VB я всегда делаю 260, при этом с обработкой ERROR_INSUFFICIENT_BUFFER. хозяин-барин, но это извращение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 19:05 |
|
||
|
Как совместить чтение Mailslot и WaitForMultipleObjects?
|
|||
|---|---|---|---|
|
#18+
Изопропил, ИзопропилДмитрий77, лови кусок говнокода - запись в мейлслот по конрол-С, таймер - для большей достоверности примера Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. У меня в аналогичном коде OVERLAPPED ov; ov = {}; на 2005-й студии выдает ошибки на строчке такой как вторая. (1734) : error C2059: syntax error : '{' (1734) : error C2143: syntax error : missing ';' before '{' Как извернуться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2017, 04:20 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39391755&tid=2018208]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
165ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 308ms |
| total: | 573ms |

| 0 / 0 |
