|
|
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)основное было делить задачи на несколько потоков т.е. 1 диспетчер раскидывает задания на несколько потоков Из моего класса можно сделать и отдельный менеджер с ограниченным по количеству пулом потоков. Один-бы рулил всеми и не морозил при этом интерфейс. * Исправил и скорректировал работу по таймеру. Теперь таймер отрабатывает точно (миллисекунда в миллисекунду), учитывая время работы процедур потока. Код: pascal 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. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391. 392. 393. 394. 395. 396. 397. 398. 399. 400. 401. 402. 403. 404. 405. 406. 407. 408. 409. 410. 411. 412. 413. 414. 415. 416. 417. 418. 419. 420. 421. 422. 423. 424. 425. 426. 427. 428. 429. 430. 431. 432. 433. 434. 435. 436. 437. 438. 439. 440. 441. 442. 443. 444. 445. 446. 447. 448. 449. 450. 451. 452. 453. 454. 455. 456. 457. 458. 459. 460. 461. 462. 463. 464. 465. 466. 467. 468. 469. 470. 471. 472. 473. 474. 475. 476. 477. 478. 479. 480. 481. 482. 483. 484. 485. 486. 487. 488. 489. 490. 491. 492. 493. 494. 495. 496. 497. 498. 499. 500. 501. 502. 503. 504. 505. 506. 507. 508. 509. 510. 511. 512. 513. 514. 515. 516. 517. 518. 519. 520. 521. 522. 523. 524. 525. 526. 527. 528. 529. 530. 531. 532. 533. 534. 535. 536. 537. 538. 539. 540. 541. 542. 543. 544. 545. 546. 547. 548. 549. 550. 551. 552. 553. 554. 555. 556. 557. 558. 559. 560. 561. 562. 563. 564. 565. 566. 567. 568. 569. 570. 571. 572. 573. 574. 575. 576. 577. 578. 579. 580. 581. 582. 583. 584. 585. 586. 587. 588. 589. 590. 591. 592. 593. 594. 595. 596. 597. 598. 599. 600. 601. 602. 603. 604. 605. 606. 607. 608. 609. 610. 611. 612. 613. 614. 615. 616. 617. 618. 619. 620. 621. 622. 623. 624. 625. 626. 627. 628. 629. 630. 631. 632. 633. 634. 635. 636. 637. 638. 639. 640. 641. 642. 643. 644. 645. 646. 647. 648. 649. 650. 651. 652. 653. 654. 655. 656. 657. 658. 659. 660. 661. 662. 663. 664. 665. 666. 667. 668. 669. 670. 671. 672. 673. 674. 675. 676. 677. 678. 679. 680. 681. 682. 683. 684. 685. 686. 687. 688. 689. 690. 691. 692. 693. 694. 695. 696. 697. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 13:13 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
А просто приаттачить файл к сообщению не судьба ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 13:15 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
defecatorА просто приаттачить файл к сообщению не судьба ? По себе сужу. Отсюда качаю файлы в редких и исключительных случаях. А так хотя-бы код видно. П.С. Там спойлер есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 13:22 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman, немного посмотрел, слишком жёстко, багфиксы Код: pascal 1. 2. 3. 4. иначе под линуксом не компилится Код: pascal 1. 2. 3. убрать, в SyncObjs описан ( в fpc 2.6 точно) Код: pascal 1. 2. 3. 4. и Код: pascal 1. 2. 3. обрамить в FSection.Enter; try ... finally FSection.Leave; FQueue - очередь лучше в отдельный класс вынести с методами PushToFront, ...(в fpc-stl есть очень неплохие реализации) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 20:49 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)иначе под линуксом не компилится Под каким линуксом не компилится? FPC_WIN = WINDOWS. kealon(Ruslan)в SyncObjs описан ( в fpc 2.6 точно) kealon(Ruslan)обрамить в FSection.Enter; try ... finally FSection.Leave; Учел, подумаю. :) kealon(Ruslan)FQueue - очередь лучше в отдельный класс вынести с методами PushToFront, ...(в fpc-stl есть очень неплохие реализации) Мне в некоторых местах нужен такой подход (с отдельной очередью для гуи) и в дельфи. То есть иногда дефайню FPC. Так что его специфические вещи мне навредят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 08:54 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadmankealon(Ruslan)иначе под линуксом не компилится Под каким линуксом не компилится? FPC_WIN = WINDOWS. этого модуля под линуксом нет, в дефайн FPC_WIN он у тебя не включён (выше вписан) Код: pascal 1. 2. 3. 4. 5. wadmankealon(Ruslan)FQueue - очередь лучше в отдельный класс вынести с методами PushToFront, ...(в fpc-stl есть очень неплохие реализации) Мне в некоторых местах нужен такой подход (с отдельной очередью для гуи) и в дельфи. То есть иногда дефайню FPC. Так что его специфические вещи мне навредят. это не помешает, от TList просто унаследуй для дельфей с определением методов, а для fpc бери нативный PS: мне кажется от окна винды стоит отказаться, ты всё равно уже очередь эмулируешь, да и от таймера(его можно отдельным потоком как источник задач создать, используя sleep или лучше TEvent.wait ) PSS:слишком сложно твоим классом пользоваться, надо упрощать - кода много, а на деле дальше While GetMsg do ... не уйти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 22:48 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), не хочешь признаваться, как добился, что модуль не компилируется под линуксом и не надо. :) у меня он работает. Модуль сложный, да. Это "плата" за легкость его использования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2015, 15:04 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadmankealon(Ruslan), не хочешь признаваться, как добился, что модуль не компилируется под линуксом и не надо. :) у меня он работает. Модуль сложный, да. Это "плата" за легкость его использования. вот твоя редакция последняя Код: pascal 1. 2. 3. 4. 5. я тебе сказал что она не компилится, так как модуля Messages под линуксом нет, предложил подправить, вот так : Код: pascal 1. 2. 3. 4. 5. это всё что имелось ввиду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2015, 20:10 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), еще разок: у меня компилируется (и даже работает) под линуксом, ибо в fpc/lazarus есть модуль messages. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 08:54 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman, при использовании в главной нити сообщения не поступают в файл, пока не пройдет цикл обработки сообщений (что очевидно). Очередь при этом растет. А в ней всего 10000 позиций (по умолчанию), этого может оказаться маловато - будут потери записей лога. Простой выход: меняем Код: pascal 1. на Код: pascal 1. 2. 3. 4. Ну и резалт присвоить нужно для порядка, в реализации Код: pascal 1. При высокой нагрузке будут потери записей все одно. Я себе делал класс лога через очередь, с пишущей ниткой, постоянно ждущей и просыпающейся лишь по эвенту (постановка записи в очередь / терминэйт нити). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 16:33 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Во как - тема-то вон какая... Это про "15782361" . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 16:36 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
dred2kпри использовании в главной нити сообщения не поступают в файл, Я как раз и использую отдельный поток. dred2kЯ себе делал класс лога через очередь, с пишущей ниткой, :-) Ну у меня как раз такой и есть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 16:42 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman:-) Ну у меня как раз такой и есть... Я не уточнил - очередь данных (типа TList), а не системная очередь сообщений. При интенсивной записи (в твоей реализации) код обработки, пишущий в файл, "захлебнется" из-за накладных расходов записи - не так это быстро, как ожидается. Очередь сообщений "выбираться" не успеет. PostMessage будет срабатывать не каждый раз, пойдут потери записей лога. Для этой задачи, считаю, надежнее будет обычный threadsafe-буфер + нить записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 16:51 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
dred2kВо как - тема-то вон какая... Это про "15782361" . Ой... Оказалось, там старая версия, а новее не выложил. Хотя с нагрузкой и эта версия отлично справляется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 16:51 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
В принципе, данный код легко модифицируется для защиты от потерь - через буфер, опять же, с попыткой "досылки" сначала из него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 16:53 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadmanХотя с нагрузкой и эта версия отлично справляется. Ну это да, как говорится - если "в мирное время". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 16:54 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadmankealon(Ruslan), еще разок: у меня компилируется (и даже работает) под линуксом, ибо в fpc/lazarus есть модуль messages. Unix mint 17.1 Код: plaintext 1. Код: plaintext 1. PS: к dred2k присоединяюсь, такая штука рухнет под нагрузками (но в принципе почти любая очередь рухнет под нагрузками) нужна блокировка при переполнении канала и Код: pascal 1. - всё же очень плохая вещь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 20:32 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) Код: plaintext FPC 2.6.4 и последний лазарус. Компилируется и работает. kealon(Ruslan)к dred2k присоединяюсь, такая штука рухнет под нагрузками Сэмулируй нагрузку, под которой грохнется. А то при опросе пары сотен штук устройств с киданием десятков сообщений в секунду почему-то не падает. Мне интересны факты, а не теория. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 21:01 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadmanМне интересны факты, а не теория. При использовании обсуждаемой реализации объективно нет возможности гарантировать, что записи лога не начнут пропадать по причине переполнения оконной очереди сообщений. Вот тебе и факт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 21:50 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
dred2kВот тебе и факт. Это не факт, а философия. Из товарища kealon(Ruslan) вытягивал несколько дней факт, почему у него не компилируется. Ну да ладно. Пока логирование в другом потоке не могу выложить, там несколько для меня специфичных вещей. Чуть позже, когда руки дойдут. Либо перепишу на основе wthread. Спасибо за обсуждение. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2015, 08:57 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman, вроде нормальным английским языком, ошибка компиляции wthread.pas(44,6) Fatal: Can not find unit Messages used by WThread. Check if package LCLBase is in the dependencies. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2015, 13:12 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)вроде нормальным английским языком, ошибка компиляции Обнови лазарус. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2015, 13:29 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadmankealon(Ruslan)вроде нормальным английским языком, ошибка компиляции Обнови лазарус. Check if package LCLBase is in the dependencies PS: вот не знаю что ты упираешься, тем более под люниксом эти константы оттуда не нужны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2015, 19:03 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)PS: вот не знаю что ты упираешься, тем более под люниксом эти константы оттуда не нужны Есть этот модуль в 2.6.4., но ты одолел меня. Убрал совсем, нет в нем нужды (нужен был только для wm_user). :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 09:35 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=38943497&tid=2039179]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
30ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 300ms |

| 0 / 0 |
