|
|
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Всем привет! Вот решил сформировал такую мысль. ЯПри работе с потоками, лучше всего использовать следующую элементарную концепцию: Любой поток должен иметь 2 возможных исхода: Успех и ошибка. В Делфи это сводиться к 2м обратным вызовам(синхронным): OnSuccess и OnError В общем-то, такой же подход используется в Ajax. Элементарно? - да, элементарно. Очевидно? - да, очевидно Но на Делфи я такого не видел. Я это реализовал примерно так. Хоть это и не претендует на истину последней инстанции. Код: 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. И пример использования: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 12:08 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Valery_B, - Доктор, я жить буду? - А смысл?? Зачем передавать треду кучу специализированных обработчиков, что, кстати, противоречит, в общем смысле, принципам инкапсуляции, когда можно передать один лишь хэндл супервизора, по которому посылать потом соответствующие сообщения, синхронно/асинхронно по вкусу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 12:46 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Valery_BПри работе с потоками, лучше всего использовать следующую элементарную концепцию: Любой поток должен иметь 2 возможных исхода: Успех и ошибка. В такой концепции потоки не нужны тебе, поскольку она подразумевает, что кому-то приходится ждать завершения потока. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 13:38 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovValery_BПри работе с потоками, лучше всего использовать следующую элементарную концепцию: Любой поток должен иметь 2 возможных исхода: Успех и ошибка. В такой концепции потоки не нужны тебе, поскольку она подразумевает, что кому-то приходится ждать завершения потока. Хоть интерфейс не морозится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 13:54 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
wadman, - Михаил Сергеевич, все куры сдохли! - Ничего, зато у меня еще много полезных идей!! (с) :D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 14:02 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Valery_BПри работе с потоками, лучше всего использовать следующую элементарную концепцию: Любой поток должен иметь 2 возможных исхода: Успех и ошибка. Valery_BЭлементарно? - да, элементарно. Очевидно? - да, очевидноВсё наоборот. Поток - это просто выполняющийся код. Чем меньше он зависит от других потоков (и чем меньше другие потоки зависят от него и результатов его выполнения) - тем лучше. Valery_BНо на Делфи я такого не видел.Повезло, а я видел много раз, в т.ч. на этом форуме. Чуть не каждый первый, обнаружив проблемы с синхронизацией данных между потоками, запускает поток и начинает ждать его окончания, или (еще хуже, но из той же оперы) засовывает код потока в synchronize. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 14:19 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Valery_B Код: pascal 1. А это - вишенка на торте. Этим еще и убиваешь возможность управления своим потоком. Уже не говоря про грабли, которые возникнут при использовании в dll. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 14:21 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Любой поток должен иметь еще один вариант исхода - прерван досрочно. А Synchronize - это замаскированное под удобство зло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 14:33 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Василий 2Любой поток должен иметь еще один вариант исхода - прерван досрочно. Terminate? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 14:41 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Василий 2Любой поток должен иметь еще один вариант исхода - прерван досрочно. Что касается вариантов исхода потока, то всё придумано давно и изначально: функция потока возвращает ExitCode (В TThread - это свойство ReturnValue, в винде по хендлу потока его можно получить через GetExitCodeThread). Но это всё, конечно, не интересно, а надо изобретать велосипеды новые и разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 14:46 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Василий 2Любой поток должен иметь еще один вариант исхода - прерван досрочно. Всё верно. Но я не хотел перегружать описание. wadmanTerminate? Не совсем. Terminate вызывается в любом случае. Но есть и отмена. Например, как SMSS при выполнении запроса есть 3 варианта: 1. Успех 2. Ошибка 3. Отмена запроса (не явно) Как понятно, отмена запроса в таком случае может быть и не вызвана. И когда она будет поток сможет выполнить "отмену" - неизвестно. Но когда бы он его не отменил, пусть выполнит сразу выполнит OnCancel . Я делаю так: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 15:02 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Valery_BНе совсем. Чем не угодил метод, который лишь флажок выставляет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 15:08 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
YuRockА это - вишенка на торте. Этим еще и убиваешь возможность управления своим потоком. Своим потоком я могу управлять до тех пор, пока он работает. Когда он не работает - я не могу им управлять. Ты путаешь управление потоком с результатами его выполнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 15:09 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
wadmanЧем не угодил метод, который лишь флажок выставляет? Valery_BTerminate вызывается в любом случае. В не зависимости от того, была ли ошибка, не было ей или поток прерван. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 15:11 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Valery_BYuRockА это - вишенка на торте. Этим еще и убиваешь возможность управления своим потоком. Своим потоком я могу управлять до тех пор, пока он работает. Когда он не работает - я не могу им управлять. При FreeOnTerminate=True ты не знаешь, работает он еще или уже нет. Т.к. не знаешь даже, валидна ли еще ссылка на объект класса потока, или уже нет. Valery_BТы путаешь управление потоком с результатами его выполнения.Нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 15:17 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Valery_BwadmanЧем не угодил метод, который лишь флажок выставляет? Valery_BTerminate вызывается в любом случае. В не зависимости от того, была ли ошибка, не было ей или поток прерван. Вот смотрю на твое первое сообщение (тему) и не понимаю о чем ты споришь или чему возражаешь? Василий сетовал на отсутствие возможности прервать, я ему ответил. Что-то мне подсказывает, что события вызываются до Destroy. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 15:20 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
YuRockПри FreeOnTerminate=True ты не знаешь, работает он еще или уже нет. Т.к. не знаешь даже, валидна ли еще ссылка на объект класса потока, или уже нет. Я всегда знаю, выполняется поток или нет. Valery_B Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 15:25 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Valery_BYuRockПри FreeOnTerminate=True ты не знаешь, работает он еще или уже нет. Т.к. не знаешь даже, валидна ли еще ссылка на объект класса потока, или уже нет. Я всегда знаю, выполняется поток или нет. Valery_B Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. А, ну да, там же Synchronize - твой поток, если решит разрушиться, будет ждать, пока ты будешь пытаться им управлять. Т.е. для того, чтобы управлять потоком, надо еще обязательно не забыть свойство OnTerminate выставить и в нём обнилять ссылку на объект (в твоём велосипедном случае - в двух местах). Очень удобно и красиво, чо. Пользуйся на здоровье. P.S. При этом не забывай, что Synchronize полностью не работает в консоли и в dll, в обычном оконном режиме - полность не работает до Application.Run, а даже если все необходимые условия выполнены - твои потоки будут постоянно ждать тормозов главного потока, и еще - будут время от времени появляться взаимные блокировки (при ожидании событий этих дочерних потоков - это часто надо), решать проблему которых придется героически. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 15:45 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
YuRock, Ты пытаешься найти причины, что бы не использовать OnError/OnSuccess ? Или говоришь о нюансах работы Delphi в консоли или dll ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 16:06 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
YuRockнадо еще обязательно не забыть свойство OnTerminate выставить и в нём обнилять ссылку на объект (в твоём велосипедном случае - в двух местах) На счёт велосипеда - согласен. Случаев даже не 2, а 3 (не явный OnCancel). Но да, можешь сделать ещё один CallBack - на OnTerminate. Если это красивее - можно и так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 16:09 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Valery_BТы пытаешься найти причины, что бы не использовать OnError/OnSuccess ? Я давно нашел причины для того, чтобы никогда не использовать Synchronize (и из-за этого - OnTerminate). Не использовать OnError/OnSuccess я буду не только по этим (вполне достаточным) причинам, а и потому, что это архитектурно неверно - ждать (в любом виде) событий о результате действий потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 16:14 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
YuRock, хм... Да, наверное, надо переименовать TBasicThread в TGUIThread. Но сути это не меняет. По поводу OnError/OnSuccess - это не моё изобретение. Это изобретение jQuery. Я лишь озвучил его. Думаю, большинство всё таки использует данную концепцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 16:22 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Valery_BЭто изобретение jQueryНе знаю, кто это, но сути дела это не меняет - это архитектурно неверно. Valery_BДумаю, большинство всё таки использует данную концепцию.Это сути дела тоже не меняет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 16:25 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
Valery_BTGUIThread Лучше другое придумай. Таким названием ты введешь людей в заблуждение - они подумают, что этот твой поток работает с гуи (рисует окна и т.п., т.е. имеет по умолчанию очередь выкрутки сообщений как минимум, такой "Бэйсик класс" как раз может быть полезен). А ты назови лучше TBasicSynchronousThread - это ближе по смыслу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 16:28 |
|
||
|
Простой шаблон для работы с потоками
|
|||
|---|---|---|---|
|
#18+
авторВ Делфи это сводиться к 2м обратным вызовам(синхронным): OnSuccess и OnError В общем-то, такой же подход используется в Ajax. Думаю, разработчики на JS такому подходу удивятся. В JS давно есть промисы, которые устраняют необходимость писать каллбэки в виде разбросанных по коду функций. А теперь есть ещё и async/await, который радикально упрощает асинхронное программирование и избавляет от необходимости в таких каллбэках. Причем от программиста знание многопоточного программирования не требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2019, 17:18 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39760280&tid=2039910]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
150ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 477ms |

| 0 / 0 |
