|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Добрый день! Подскажите как реализовать нижеследующую задумку. Задача следующая: Есть сканер штрих-кодов, работающий в режиме эмуляции COM-порта. Необходимо получить из него за один раз, тот объем считанных данных, который был в штрих-коде, а не в буфере приема. Если просто расположить на форме компонент SerialPort, считывание принятых данных осуществляется через событие DataReceived. Однако вызов этого события происходит не в "Основном", а в дополнительном "Рабочем" потоке. Если писать код используя размещение компонента на форме, то с аккумулированием и передачей данных разом проблем нет. Используя делегат и свойство InvokeRequired класса Control формы в которой объявлен SerialPort, можно очень просто передать данные в "Основной" поток. Я хочу написать свой класс, допустим BarCodeScanner, который уже будет иметь в себе SerialPort, и событие окончания приема данных, допустим ReceivingEnd. Вот тут и возникает проблема, каким же образом передать, полученные данные, в "Основной" поток, ведь свойство InvokeRequired класса Control у нас больше нет, и как же обратиться к "Основному" потоку. Код: 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. 69. 70. 71.
Множество примеров просмотрел в интернете, но во всех используется объект Console, и либо рассказывается про использование InvokeRequired. Как быть подскажите... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 14:41 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Очевидно, реализовать какое-то событие успешного чтения у BarCodeSanner, на него подписать форму и там чудить чего тебе нужно ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 16:03 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Pallarisреализовать какое-то событие успешного чтения у BarCodeSanner Код: vbnet 1. 2. 3.
Pallarisна него подписать форму и там чудить чего тебе нужно Код: vbnet 1. 2. 3.
Собственно, в выше указанном примере я это и делаю, и это не будет работать, так как объект Me.TextBoxBarCode создан в "Основном" потоке и получить доступ к нему из "Рабочего" не выходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 16:09 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Будет, если перед обновлением контрола проверять InvokeRequired, и если true, то вызывать control.Invoke и в нем присваивать text ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 17:11 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Pallaris, Может быть, прежде чем отвечать, нужно прочитать первое сообщение? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 17:29 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Maksym_tВот тут и возникает проблема, каким же образом передать, полученные данные, в "Основной" поток, ведь свойство InvokeRequired класса Control у нас больше нет, и как же обратиться к "Основному" потоку. Я прочитал про "свойства InvokeRequired больше нет" и этого было достаточно ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 17:31 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Pallaris, Достаточно для чего? Или то, что Controls, ни разу не принадлежит объекту scanner не очевидно? Передавать ссылкой Controls? Так тогда нет смысла мне заморачиваться за BarCodeScanner, это не мой путь. Я хочу разобраться с потоками внутри класса BarCodeScanner, без всяких "Вбросов" в него. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 17:43 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Maksym_t, достаточно для того, чтобы понять, что ты невнимательно читал про InvokeRequired Вот первая же ссылка http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 17:51 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Pallaris, Ок, упущение в первом посте. Использование класса Control, внутри BarCodeScanner, мягко говоря не уместно. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 18:13 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Maksym_tPallaris, Ок, упущение в первом посте. Использование класса Control, внутри BarCodeScanner, мягко говоря не уместно. Тебе не нужно его использовать внутри BarCodeScanner. Ты же подписал форму на событие, так и сделай там вот так примерно Код: c# 1. 2. 3. 4. 5. 6.
Почему ты решил, что из другого потока ты не можешь обратиться вообще к контролу? Поле InvokeRequired как раз и создавалось, чтобы понять, что ты юзаешь контрол в другом потоке. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 18:47 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Pallaris, Так смысл класса, BarCodeScanner, как раз в том, чтобы не использовать этот велосипед с InvokeRequired, на форме он нужен не спорю, упрощает жизнь. Но я не хочу использовать этот гребаный хук, я как раз и хочу, чтобы событие было не двусмысленно. Если оно возвращает значение, то единственное чтобы в дальнейшем осталось, это всего лишь присвоить это значение туда куда нужно. Облеплять это событие совершенно бесполезным кодом, для того, чтобы потом кто-то сидел и чесал репу "как это работает" это любимый метод работы Майкрософта, я хочу этот идиотизм остановить. По крайней мере в классе BarCodeScanner. Вот и все, что я хочу сделать =) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 19:02 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Maksym_t По крайней мере в классе BarCodeScanner. Мнэээ, у тебя метод scanner_ReceivingEnd(ByVal sender as Object, ByVal e As BarCodeScanner.ScannerEventArgs) в классе MyForm. BarCodeScanner вообще ничего не знает про него и знать не должен. Какие проблемы? Что у тебя не получается? Ты сделал как я написал? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 19:05 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Pallaris, Да, есть такое, тут просто редактировать уже созданное сообщение нельзя. Я там пару раз ошибся: 1) В процедуре scanner_ReceivingEnd для параметра e не правильный тип, должен быть ScannerEventArgs 2) В процедуре sPort_DataReceived вызов процедуры Me.EndReceived нужно заменить на Me.EndOfReceive Вставлял из уже написанного класса он просто большой, тут для понимания немного изменил названия. Проблема в том, что я не хочу использовать класс Control, но так как он каким-то же образом реализован, а это значит, что технически реализовать частично его функциональность можно. А именно обращение к "Основному" потоку, так как New для BarCodScanner выполняется в именно в "Основном" потоке. То, что ты написал будет работать, но у меня задача не сделать "как придётся, лишь бы работало", а сделать так "как нужно". Сейчас дома, что-то попробовать смогу только завтра, у меня рабочий день с 11.00 по Москве. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 19:45 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Поправка, не с 11:00, а с 7:00 по Москве. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 19:47 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Там, где я писал Control, везде заменить на TextBoxBarCode. Не знаю, на кой я написал слово Control. Вообще, то, что ты создаешь экземпляр BarScanner в UI-потоке, никакого значения не имеет. Имеет значение, что завершение чтения происходит в другом потоке, и подписанное событие, соответственно, тоже вызывается в нем. Но т.к. визуальные элементы управления в WinForms нельзя менять в потоке, отличном от потока, в котором они были созданы, то изменение нужно обернуть в Invoke/BeginInvoke, чтобы они произошли в UI-потоке. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 19:59 |
|
Многопоточность в VisualBasic
|
|||
---|---|---|---|
#18+
Pallaris, А какая разница хоть, там будет Me (в данном случае Form) или TextBox, они оба от Control произрастают =) То есть, ты хочешь сказать, что без InvokeRequired не как не обойтись? Почему-то мне кажется, Threadings мне все же поможет, просто я ещё не обладаю достаточными знаниями, организацией управлением потоками. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 20:21 |
|
|
start [/forum/topic.php?fid=20&msg=39309196&tid=1400349]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 265ms |
total: | 411ms |
0 / 0 |