|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77, в маршале полезно указывать, какой параметр содержит длину и в каком направлении передаются данные ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 13:32 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Изопропилкакой параметр содержит длину и в каком направлении передаются данные Это как? Ну, cbData в принципе содержит длину lpData , хотя честно говоря cbData -параметр на мой взгляд излишний (вспомогательный), т.е. если массив то его длина и так известна. В VB6, имея указатель, я тупо читал память до '\0' -символа например. Во всяком случае не-указание cbData (или указание неверного значения) к крашу посылателя не приведут и приниматель обычно может вытащить данные и без cbData. Пытаюсь вот читать: Маршалинг по умолчанию для массивов но чет не нахожу ответа. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 13:57 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Короче так и не понял как Dim lpData As Byte() лечить, оставлю Dim lpData As IntPtr, собственно и в VB6 я всегда передавал именно указатель на первый элемент байт-массива Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Кстати интереса ради. Апишная "W" (CharSet:=CharSet.Unicode) это не UTF8 (собственно это очевидно). Еще как понял В UTF8 EN-символ кодируется одним байтом, в "Unicode" все кодируется двумя байтами. А какой ".Net " -кодировке соответствует "W"? ===ИзопропилЕсть форме(контроле) метод. без разницы - из таймера Invoke делать или из другого потока. Нет никаких глюков. В UI потоке будет вызываться Расшифруешь? Слово "Invoke" мне пока мало о чем говорит. Из таймера я могу написать: Me.Text="My caption" Me.Function() А поток меня как я понимаю пошлет с такими претензиями. Или как вызвать этот замечательный "UI поток" ну скажем из Form_Load, чтоб из него все чего хошь можно сделать было? Простенький совсем пример можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 16:52 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77Простенький совсем пример можно? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Дмитрий77А какой ".Net " -кодировке соответствует "W"? что есть "соответсвует" ? как маршаллинг опишешь так и будет. символы и строки в .NET - UTF-16, что в байтовых массивах живёт - заботы приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 19:05 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
ИзопропилДмитрий77А какой ".Net " -кодировке соответствует "W"? что есть "соответсвует" ? как маршаллинг опишешь так и будет. символы и строки в .NET - UTF-16, что в байтовых массивах живёт - заботы приложения. В смысле отправляем так (у меня только два варианта:(1) CharSet.Unicode и (2) CharSet.ANSI -набор из .UTF8, UTF7 здесь отсутствует): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Ну, вот так удалось принять без искажений: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Ну да, значит "W"=.Unicode=UTF-16 (как ты и сказал) -она значит и есть "классический Юникод". ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 21:58 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
ИзопропилДмитрий77Простенький совсем пример можно?... Не понимаю мысли. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
А где тут другой поток? InvokeВыполняет указанный делегат в том потоке, которому принадлежит основной дескриптор окна элемента управления, с указанным списком аргументов. Нажал на кнопку. Время в шапке тикает, а форма сдохла -ни подвинуть, ни закрыть. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 22:58 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77А где тут другой поток? без разницы откуда звать DoIt - из UI потока или любого другого бесконечный цикл в процедуре ui - так нельзя, ui вызывается из цикла обработки сообщений, пока не выйдешь из процедуры ui - окно не получит никаких сообщений ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2015, 23:17 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Изопропил, кажется дошло. Код: 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.
Ну, т.е. для случая mailslot я кручу цикл чтения сообщения в ThreadFunction. Наверно не тупо Do...Loop а там параметры есть в MailSlot API на бесконечное ожидание нового сообщения. По получении message я стучу в ui-ф-цию, например передавая это самое msg в нее в качестве parameter as string Ну а ui уже занимается обработкой, имея доступ ко всем элементам формы. Так? Изопропилui вызывается из цикла обработки сообщений , пока не выйдешь из процедуры ui - окно не получит никаких сообщений В принципе тогда я могу получить то же самое и без .Net конструкции Delegate+Invoke Я могу послать "самому себе" SendMessage (Me.handle, WM_COPYDATA, 0, <parameter as string>) и обработать parameter в основной WndProc. Так ведь? Почему я стал отказываться от WM_COPYDATA (ее преимущество, что она стучится в окно "как только так сразу") в пользу mailslot: 1) Потому что обработка WM_COPYDATA "блокирует" вызывающую сторону (приложение) на время обработки сообщения на принимающей стороне. 2) Потому что нельзя слать WM_COPYDATA между разными User-аккаунтами (например сервис System не может послать сообщение в User окно и наоборот), у mailslot этого недостатка нет. А в комбинации Mailslot+Thread+(Delegate+Invoke) либо Mailslot+Thread+(WM_COPYDATA своему окну) вроде как при преимуществах mailslot решается вопрос с "получил как только так сразу". Не, ну наверно раз в .Net то лучше уж первое. Вроде все красиво. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 12:04 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77, используйте Task'и, это удобнее и практичнее ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 12:07 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Roman Mejtesиспользуйте Task'и, Не рассматриваю, оно кажется с .Net 2 не совместимо. Да Thread думаю нормально. Счас попробую с MailSlot-Read процедурой потестить. Вопрос: myThread.Abort() в Form_Closed достаточно, чтоб поток "под занавес" не "нагадил"? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 13:20 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77В принципе тогда я могу получить то же самое и без .Net конструкции Delegate+Invoke Я могу послать "самому себе" SendMessage (Me.handle, WM_COPYDATA, 0, <parameter as string>) и обработать parameter в основной WndProc. Так ведь? ну не сенд, а post Зачем тебе .net ? Бери в руки с++ иначе будешь трахать мозг себе и людям бесконечно ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 13:21 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77myThread.Abort() за такое завершение потока нужно больно бить по рукам. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 13:22 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Изопропилну не сенд, а post post с WM_COPYDATA не работает, обсуждалось много где неоднократно. Передаваемая структура (обсуждавшийся выше массив байтов) убьется раньше чем принимающая сторона ее прочтет. По этой же причине As Byte() наверняка и не работает. Я думаю предложенное тобой Delegate+Invoke здесь оптимально, поэтому WM_COPYDATA можно не обсуждать. Просто не сразу врубился в твой пример в том виде как ты его написал. ИзопропилДмитрий77myThread.Abort() за такое завершение потока нужно больно бить по рукам. Бить не надо, лучше объясни. Как его завершить в моем примере? Если ничего не сделать, то он продолжит Invok-ать в закрытую форму, что вызовет ошибку при закрытии формы. А метода типа .Stop() я не вижу. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 13:32 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77, создать флаг, при котором цикл завершится. Наверное так. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 13:45 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77, поток должен ждать какого либо события чтобы завершиться штатно. на худой конец может в случае отсутствия работы засыпать на какое-то время( например в ожидании завершения асинхронной операции с заданным таймаутом), пробудившись проверять флаг запроса завершения ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 13:47 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Ну вот, подправил логику чтения из Mailslot с учетом обсуждаемого: Код: 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. 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.
Вроде все отлично, стреляет "как только получено". Но вы пишете. Изопропилза такое завершение потока нужно больно бить по рукам ... поток должен ждать какого либо события Roman Mejtesсоздать флаг, при котором цикл завершится У меня нет "бесконечно долбящего" цикла, у меня поток висит на функции ReadFile, а висит она за счет MAILSLOT_WAIT_FOREVER при создании MailSlot. И вот куда мне этот "флаг" (для корректного выхода из цикла в MailSlotThreadFunction и завершения потока) втыкать? Ну если только закрыть MailSlot до закрытия потока и это сгенерирует какую-нибудь спецошибку в ReadFile ,которую я верну через MailSlotReadFirstInfinite и выйду из цикла. Но это надо играться. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 16:04 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77Ну если только закрыть MailSlot до закрытия потока и это сгенерирует какую-нибудь спецошибку в ReadFile ,которую я верну через MailSlotReadFirstInfinite и выйду из цикла. Но это надо играться. Ну вообще вот так наверно достаточно: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Происходит следующее: При выполнении CloseHandle(hMailSlotHandle) ReadFile находящийся в режиме бесконечного ожидания выходит с ошибкой ERROR_HANDLE_EOF (38) Моя MailSlotReadFirstInfinite возвращает False (номер ошибки думаю можно даже не отслеживать) По этому False я выхожу из цикла -> поток завершается Исключения за счет незакрытого потока не возникает. Вариант? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 16:20 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77У меня нет "бесконечно долбящего" цикла, у меня поток висит на функции ReadFile, а висит она за счет MAILSLOT_WAIT_FOREVER при создании MailSlot. а нужно с таймаутом висеть и по прошествии таймаута флаг проверять - далее чтение в цикле ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 18:09 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77Вариант? да ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 18:10 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
ИзопропилДмитрий77У меня нет "бесконечно долбящего" цикла, у меня поток висит на функции ReadFile, а висит она за счет MAILSLOT_WAIT_FOREVER при создании MailSlot. а нужно с таймаутом висеть и по прошествии таймаута флаг проверять - далее чтение в цикле Какая разница? С таймаутом или бесконечно. Хотя конечно с учетом выхода по ERROR_HANDLE_EOF разница есть: флаг сразу сработает. Только он не нужен если я отслеживаю error. ИзопропилДмитрий77Вариант? да Ну вот на этом и остановимся. Имплементировал в проект, все отлично работает. Кстати в проекте без отработки выхода по ошибке форма закрывается, а прога остается висеть (без крашей) - потому что я не в саму форму "стучу", а в public ф-цию модуля. Так или иначе поток надо закрывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 18:26 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77Какая разница? С таймаутом или бесконечно завершение работы потока закрытием хэндла - частный случай. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 19:49 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Изопропилзавершение работы потока закрытием хэндла - частный случай. Ну, главное что для этого случая все отлично работает. Будут другие случаи, буду смотреть. Но во всех случаях когда в цикле разумно делать тупое засыпание через Sleep(N ms), я предпочту обычный таймер, нежели городить огород с потоком. В данном случае я выигрываю в пользу "как только так сразу", из-за этого таймер с MailSlot-ом таки напрягал, хотя я и читал Messag-ы блоками, т.е. не по одному раз в секунду а все имеющиеся не позже чем через секунду. Напрягают обычно 2 вещи: 1) подвисание UI потока (программа занята длительной операцией) 2) тупой должбеж чего-либо в надежде получить что-нибудь чего может долгое время не быть вообще (проверка таймером или какой нибудь цикл пусть бы и с DoEvent()). Да и в отдельном потоке такое делать - не фонтан. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 20:37 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77Да и в отдельном потоке такое делать - не фонтан. конечно не фонтан - на то и существуют события, асинхронный ввод-вывод, порты завершения, и т д ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 21:01 |
|
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
|
|||
---|---|---|---|
#18+
Дмитрий77Напрягают обычно 2 вещи: 1) подвисание UI потока (программа занята длительной операцией) операции запускать асинхронно, при невозможности - в отдельном потоке. в UI потоке - только рисование PS что характерно воевать с дотнетом нет никакого желания ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2015, 21:06 |
|
|
start [/forum/topic.php?fid=20&msg=38878252&tid=1401915]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
191ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 353ms |
total: | 643ms |
0 / 0 |