|
потоки в C#
|
|||
---|---|---|---|
#18+
млин как бы еще по образу и подобию tcp бы сделать ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2014, 11:17 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
des1roerмлин как бы еще по образу и подобию tcp бы сделать tcp - не надо, тебе же сообщения/пакеты нужны. по по образу и подобию udp - делай ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2014, 12:21 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
ну я уже сделал))) а почему тсп не надо. я по протоколу тсп же общаюсь а не по удп ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2014, 12:27 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
des1roer, tcp на сообщения нарезать придётся ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2014, 12:28 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
Они в футбол играют лучше чем вы пишете программы. Пойду отсюда... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2014, 14:38 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
вообще, tcp сделал так. может кому понадобится. может подскажите как правильней Код: c# 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. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2014, 14:42 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
des1roerвообще, tcp сделал так. может кому понадобится. может подскажите как правильней Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Это жесть вообще. Но какой смысл тебе подсказывать, если ты всё равно не читаешь? ( один , два ) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2014, 14:50 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
des1roer, des1roerвообще, tcp сделал так. может кому понадобится. может подскажите как правильней 1. мне страшно если ты пример запустил в службе в таком виде как выложил здесь, там надо все обкладывать try..catch и при закрытии порта желательно не забывать отписываться от событий. это не проработает и недели. 2. то что ты сделал для TCP - это просто синхронно в отдельном потоке, не многим хуже будет работать код с простым таймером ))) если для TCP по образу и подобию, то есть асинхронно, будет примерно так Код: c# 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.
и это пример как "поддерживать" TCP, не сказал бы что "тривиально" посылать запросы и ловить ответы - это надо еще сверху накручивать но у меня устройство не работает в режиме "запрос->ответ", я ему редко что передаю, мне в основном надо читать то что оно шлет, и могут быть задержки по часу, от части по этому я сделал асинхронный прием. у тебя же - "запрос->ответ" в течении 1..3 секунд, Алексей К тебе подсказал действительно заметно более простой и хороший вариант синхронного чтения Код: c# 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.
тут полезно подсмотреть код парсинга, и допилить с учетом того что в твоем варианте нет FRAME_START это реально проще чем асинхронное чтение, и будет правильно использовать одну функцию парсинга и для TCP и для Serial "приемников". ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 01:40 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
Я не понял, причем тут потоки? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 18:20 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
Thread.Sleep - зло. Кроме случая показа пользователю заставки своей супер-пупер программы ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 18:23 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
Не хотелось создавать тему, спрошу тут. Есть прога, которая опрашивает некое множество устройств по com-портам (допустим, 3 порта по 5 устройств на каждом). Для каждого порта я создаю отдельный поток, в котором для каждого устройства отправляю запрос и получаю ответ (или нет в течении таймаута). Теперь возникла необходимость добавить поддержку Ethernet-порта в программе для опроса множества устройств по TCP/IP. Допустим, мне нужно будет опросить 10 устройств с максимальной скоростью. Планирую работать через TcpClient. Мой первый опыт с ним. Имеет смысл опрашивать устройства в разных потоках? Как лучше построить работу с устройствами при условии минимизации времени на получение ответов и отсылку запросов? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2014, 18:48 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
Pallaris для опроса множества устройств по TCP/IP. Допустим, мне нужно будет опросить 10 устройств с максимальной скоростью. Socket.Select и никаких лишних потоков. а лучше асинхронный ввод вывод и для COM портов и для сокетов ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2014, 18:54 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
Изопропила лучше асинхронный ввод вывод и для COM портов и для сокетов Речь о NetworkStream.BeginRead? Я чуть-чуть подкорректирую вводные: 1. Есть поток, который через одинаковые интервалы (допустим, 50 мс) опрашивает ряд устройств. 2. Есть поток (GUI), который по клику что-то на одно из устройств отправляет. При этом устройство на команду отвечает. Как синхронизироваться? Т.е. первый поток ожидает одно, а ему приходит в ответ ответ от устройства по случаю 2? При работе с SerialPort я делал lock, посылал запрос, читал ответ и не парился - а тут как? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 16:08 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
а покажите свои наработки с serial port ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2014, 07:05 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
Pallaris1. Есть поток, который через одинаковые интервалы (допустим, 50 мс) опрашивает ряд устройств. в чём заключается опрос? Просто ожидание данных или посылка запроса с ожиданием ответа? PallarisКак синхронизироваться? Если ожидается ответ на команду - устройство исключается из общего опроса до получения ответа или истечения таймаута ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2014, 08:25 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
Изопропилв чём заключается опрос? Просто ожидание данных или посылка запроса с ожиданием ответа? Посылка запроса с ожиданием, да. Если ожидается ответ на команду - устройство исключается из общего опроса до получения ответа или истечения таймаута Исключить-то исключим, но как быть, если из другого потока устройству пошла управляющая команда (и на нее устройство тоже отвечает) в тот момент, как пошла посылка запроса из основного потока? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2014, 09:16 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
PallarisИсключить-то исключим, но как быть, если из другого потока устройству пошла управляющая команда (и на нее устройство тоже отвечает) в тот момент, как пошла посылка запроса из основного потока? в очередь сукины дети (с) поток gui ничего сам отправлять не должен, один поток должен заведовать вводом-выводом ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2014, 09:29 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
Изопропилв очередь сукины дети (с) поток gui ничего сам отправлять не должен, один поток должен заведовать вводом-выводом Т.е. выходит заводим очередь сообщений для каждого объекта устройства, когда внешний поток хочет что-то отправить, он в эту очередь свое сообщение записывает. А поток ввода/вывода проходит по очереди, их выбрасывает в сеть, потом выполняет свои опросы (либо наоборот). Блин, скорость отклика, т.е. срабатывания, очень важна. Боюсь, как бы из-за этой очереди не возникли потери времени. Тут без экспериментов не обойтись, наверное. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2014, 10:01 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
des1roerа покажите свои наработки с serial port Было бы что показывать namespace SolarComm { public class CommPortSerial:CommPort,ISectioning { private int baudRate_ = 9600; private int dataBits_ = 8; private Parity portParity_ = Parity.None; private StopBits stopBits_ = StopBits.One; private int readTimeOut_ = 40; private int writeTimeOut_ = 40; private SerialPort sp = new SerialPort(); public int baudRate { set { baudRate_ = value; } get { return baudRate_; } } public int dataBits { set { dataBits_ = value; } get { return dataBits_; } } public Parity portParity { set { portParity_ = value; } get { return portParity_; } } public StopBits stopBits { set { stopBits_ = value; } get { return stopBits_; } } public int readTimeOut { set { readTimeOut_ = value; } get { return readTimeOut_; } } public int writeTimeOut { set { writeTimeOut_ = value; } get { return writeTimeOut_; } } public CommPortSerial() { name_ = ""; } public override string ReadString(CommDevice dev_) { if (sp.IsOpen) { try { return sp.ReadLine(); } catch { } } return String.Empty; } public override void ReadData(CommDevice dev_, ref byte[] response, int startIndex) { ReadData(dev_, ref response, startIndex, response.Length); } public override void ReadData(CommDevice dev_, ref byte[] response, int startIndex, int length) { if (response == null) return; if (sp.IsOpen) { //lock (lockObject_) { try { for (int i = startIndex; i < length; i++) { if (i < 0 || i >= response.Length) break; response[i] = (byte)(sp.ReadByte()); } } catch (Exception ex) { } } } } public override void ReadData(CommDevice dev_, ref byte[] response) { ReadData(dev_, ref response, 0, response.Length); } public override int ReadByte() { if (sp.IsOpen) { //lock (lockObject_) { try { return sp.ReadByte(); } catch { } } } return -1; } public override byte[] ReadData(CommDevice inDev,int length_) { base.ReadData(inDev,length_); if (length_ > 0 && sp.IsOpen) { byte[] response = new byte[length_]; //lock (lockObject_) { try { for (int i = 0; i < response.Length; i++) { response[i] = (byte)(sp.ReadByte()); } } catch (Exception ex) { } } return response; } return null; } public override byte[] ReadData(CommDevice dev_) { base.ReadData(dev_); if (sp.IsOpen) { int length_ = sp.BytesToRead; if (length_ > 0) { byte[] response = new byte[length_]; //lock (lockObject_) { try { for (int i = 0; i < response.Length; i++) { response[i] = (byte)(sp.ReadByte()); } } catch (Exception ex) { } } return response; } } return null; } public override void WriteData(CommDevice dev_,string msg_) { //lock (lockObject_) { base.WriteData(dev_,msg_); DiscardOutputBuffer(); if (sp.IsOpen) { sp.WriteLine(msg_); } } } public override void WriteData(CommDevice dev_, byte[] buffer) { //lock (lockObject_) { base.WriteData(dev_,buffer); DiscardOutputBuffer(); try { if (sp.IsOpen) { sp.Write(buffer, 0, buffer.Length); } } catch (Exception ex) { } } } public override void Open() { //lock (lockObject_) { base.Open(); try { if (!sp.IsOpen) { //Assign desired settings to the serial port: sp.PortName = name_; sp.BaudRate = baudRate_; sp.DataBits = dataBits_; sp.Parity = portParity_; sp.StopBits = stopBits_; sp.ParityReplace = (byte)0; sp.ReadTimeout = readTimeOut_; sp.WriteTimeout = writeTimeOut_; sp.Open(); } } catch { } } if (sp.IsOpen) { isOpened_ = true; } else { isOpened_ = false; } } public void DiscardInputBuffer() { if (sp.IsOpen) { //lock (lockObject_) { sp.DiscardInBuffer(); } } } public void DiscardOutputBuffer() { if (sp.IsOpen) { //lock (lockObject_) { sp.DiscardOutBuffer(); } } } public override void Prepare() { base.Prepare(); DiscardInputBuffer(); DiscardOutputBuffer(); } public override void Close() { base.Close(); //Ensure port is opened before attempting to close: if (sp.IsOpen) { try { sp.Close(); } catch { } } if (sp.IsOpen) { isOpened_ = true; } else { isOpened_ = false; } } } } ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2014, 10:07 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
des1roerа покажите свои наработки с serial port Забыл тег кода добавить, е-мое Было бы что показывать Код: c# 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. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2014, 10:08 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
PallarisА поток ввода/вывода проходит по очереди, их выбрасывает в сеть, потом выполняет свои опросы (либо наоборот). не проходит, а постоянно ожидает, получает запрос - в порт/сокет асинхронно отправляет данные, ждёт дальше - запросов в очереди, завершения записи в порты/сокеты, прихода данных портов/сокетов и следит за таймаутами ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2014, 10:17 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
Изопропилне проходит, а постоянно ожидает, получает запрос - в порт/сокет асинхронно отправляет данные, ждёт дальше - запросов в очереди, завершения записи в порты/сокеты, прихода данных портов/сокетов и следит за таймаутами Я порассуждаю чуть-чуть: 1. Пусть в какой-то момент в очереди появилось три сообщения: А. Считать данные с устройства Б. Записать 1 в ячейку 0 В. Записать 0 в ячейку 1 2. Поток посылает асинхронно сообщения А, Б, В - объединив их в одну посылку. 3. По завершению отправки считываем входной буфер. 4. Распарсиваем байты на три блока и сохраняем ответы. Причем ответы нужно сопоставить с посылками, ведь теоретически на посылку Б устройство могло не ответить, и нужно понять, что там, где ожидался ответ на Б - пришел ответ на В. 5. Что, если на момент считывания входного буфера еще не все данные до нас дошли? Продолжаем ждать в течении какого-то таймаута? 6. Ждем новых посылок в очереди Прокомментируй пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2014, 11:33 |
|
потоки в C#
|
|||
---|---|---|---|
#18+
Pallaris, всё от устройства зависит. одни устройства могут только по очереди команды обрабатывать( пока клиенту устройство ответ не отправило - устройство команды игнорирует) другие могут принять несколько команд( да хоть в UART своём держать) и ответы поочереди выдать третьи имеют возможность пометить команды тэгом и в произвольном порядке завершить выполнение (в ответном сообщении будет присутствовать этот тэг) По третьему варианту работают, например, PTP/MTP устройства, они ещё и асинхронные события могут инициировать ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2014, 12:24 |
|
|
start [/forum/topic.php?fid=20&msg=38677071&tid=1402711]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 164ms |
0 / 0 |