|
|
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
Мне удалось собрать всю необходимою информацию для того, чтобы продолжить своё занятие в отпуск. Разобрался, как использовать Queue для организации надежной передачи данных в основной поток без использования дополнительных списков (пришлось таки поставить современную Delphi с поддержкой Queue и поэкспериментировать с анонимными процедурами :). Удалось подготовить наглядный пример, который показывает все аспекты работы Queue. Всем спасибо за участие! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2020, 00:44 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
Vlad F Dmitry Arefiev, Единственное, что в этом зажигательном спиче показалось интересным, так это "почти не вызовет". Прошу пояснить.)) По тем же причинам Synchronize/Queue на работают в dll. По тем же причинам Synchronize/Queue на работают нигде до вызова Application.Run. А из-за костыля, который лечит дедлоки этого механизма, вызов метода TThread.WaitFor (а он вызывается и в деструкторе) в главном потоке - грузит проц на 100%. В общем, Synchronize/Queue - это то, чего не надо было делать в Delphi и использовать тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2020, 09:29 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
YuRock, Со всем этим не спорю, но тогда так и надо прямо писать. А то получается как "немного беременна". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2020, 10:15 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
DmSer rgreat Queue вообще не является способом передачи данных, это способ выполнения кода в главном потоке. В официальной документации про Queue практически ничего нет. Зачем его делали - непонятно. Synchronize - является способом передачи данных в основной поток, SendMessage, PostMessage - являются. А вот Queue - не является. SendMessage, PostMessage - рождает кучу трудноуловимых багов в VCL. По тем проектам, на которые я попадал, я только за этот год поймал и пофиксил около 3-х багов ими вызванных первоначально, как только массово вошла в эксплуатацию 10-ка, этих багов было вообще пруд пруди ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2020, 11:49 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
DmSer В каких случаях Вы используете метод TThread.Queue и почему? Dmitry Arefiev Последнее подходит для каких-либо прогрессов выполнения DmSer В случае PostMessage мы может передавать данные через wParam и lParam, мы имеем полный контроль над своей программой. В случае Queue нет никаких wParam и lParam ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2020, 12:44 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
vavan но все что нужно можно запихать в собственный враппер использующий механизм Queue/StaticQueue локализованный код легче исправить и отладить а то на KiUserCallbackDispatcher в багрепортах уже глаз дёргать начинает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2020, 13:50 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) если бы VCL не писали криворукие, может быть и работало бы SendMessage, PostMessage нормально. Но чуть тронешь в их обработчике гуи, то может быть конкретный пипец SendMessage, PostMessage - рождает кучу трудноуловимых багов в VCL. По тем проектам, на которые я попадал, я только за этот год поймал и пофиксил около 3-х багов ими вызванных А то я чото правда не могу придумать, использовал всегда и горя не знал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2020, 01:16 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
YuRock kealon(Ruslan) если бы VCL не писали криворукие, может быть и работало бы SendMessage, PostMessage нормально. Но чуть тронешь в их обработчике гуи, то может быть конкретный пипец SendMessage, PostMessage - рождает кучу трудноуловимых багов в VCL. По тем проектам, на которые я попадал, я только за этот год поймал и пофиксил около 3-х багов ими вызванных А то я чото правда не могу придумать, использовал всегда и горя не знал.
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2020, 07:28 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Не видел такого никогда.. А как добиться этих ошибок с помощью Post/SendMessage? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2020, 09:32 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
YuRock, Такие ошибки возникают, когда программист не может правильно реализовать синхронизацию с основным потоком VCL. И это не зависит от Send/Postmessage или Synchronize. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2020, 10:09 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
YuRock kealon(Ruslan), Не видел такого никогда.. А как добиться этих ошибок с помощью Post/SendMessage? ваш софт багрепорты делает? (EurekaLog, Madshi) вот, например, причина "Canvas don't allow drawing" Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2020, 10:12 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), А что тут не устраивает? Девайс контекст после вызова процедуры станет невалидным, его таким и помечают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2020, 10:33 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис kealon(Ruslan), А что тут не устраивает? Девайс контекст после вызова процедуры станет невалидным, его таким и помечают. старый контекст нужно сохранять и восстанавливать назад, иначе при попытке использовать такой Canvas из-за блокировки будет Canvas don't allow drawing" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2020, 12:14 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), 1. Нет, багрерорты не делает. Хватает подробных логов. 2. Из-за этого может возникнуть проблема (ну я так вижу), только если перекрыть WM_PAINT, вызвать inherited и потом что-то пытаться рисовать через канвас. Ну это как бы обычно сразу не работает, если еще и логику с ветвлениями не наворотить... В общем, у меня с этим проблем не было. Ну, и главное - я не понял, при чем здесь Post/SendMessage. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2020, 13:57 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
YuRock, 1. стоит добавить. много интересного приходит чего никогда не наблюдаешь и повторить не получается, но после фикса багрепорты исчезают 2. нет, схема простая, у тебя идёт рисование, дальше "случайно" срабатывает обработчик сообщения, в котором тоже по различным причинам срабатывает эта же прорисовка - вот тебе неявная рекурсия, дальше обработчик возвращается в прорисовку и получаешь фейл, т.к. Canvas.Handle = 0. А так как багрепорты у тебя не настроены, стандартный обработчик покажет пользователю окно с ошибкой, а он его благополучно закроет и забудет. но если софт пишется для 10-ка человек, то конечно можно и дальше не заморачиваться на мелочи, типа 1 раз за млн запусков ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2020, 14:45 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) схема простая, у тебя идёт рисование, дальше "случайно" срабатывает обработчик сообщения, в котором тоже по различным причинам срабатывает эта же прорисовка - вот тебе неявная рекурсия Тут даже обсуждать нечего. Всё так же не понятно, при чем здесь Post/SendMessage (ну кроме SendMessage (из WM_PAINT!!!), у которого в обработчике UpdateWindow или выкрутка ) kealon(Ruslan) А так как багрепорты у тебя не настроены, стандартный обработчик покажет пользователю окно с ошибкой, а он его благополучно закроет и забудет. kealon(Ruslan) софт пишется для 10-ка человек Нет, еще три нуля - порядок где-то таков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2020, 16:16 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
YuRock, плохо копаешь, копай WM_PRINT где юзается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2020, 23:45 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) YuRock, плохо копаешь, копай WM_PRINT где юзается В сфере моих программ такие сообщения не приходят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2020, 01:27 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
YuRock Возможно. В сфере моих программ такие сообщения не приходят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2020, 09:38 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) YuRock Возможно. В сфере моих программ такие сообщения не приходят. Я вообще не использую VCL давно, свою библиотеку использую. Но и сейчас, и раньше, когда использовал - не было проблем с отправкой и обработкой сообщений (видимо, компоненты, стреляющие мне в ногу, не попадались). Чего не могу сказать про Synchronize - в библиотеках-драйверах для СУБД эта гадость нет-нет, да используется, бывает, ну и доставляет тогда проблем, которые обходить приходится костылями, или переписывать их код на Send/PostMessage. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2020, 18:10 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
YuRock Да нет, не добавлю. Я вообще не использую VCL давно, свою библиотеку использую. Но и сейчас, и раньше, когда использовал - не было проблем с отправкой и обработкой сообщений (видимо, компоненты, стреляющие мне в ногу, не попадались). Чего не могу сказать про Synchronize - в библиотеках-драйверах для СУБД эта гадость нет-нет, да используется, бывает, ну и доставляет тогда проблем, которые обходить приходится костылями, или переписывать их код на Send/PostMessage. так то и у меня есть, но приходится жить с тем за что денюжку платят - потому разговор про то как с ней жить:-) PS: те кто используют Synchronize и не дают чем её имплементировать, молодцы конеш - тоже таких встречал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2020, 20:12 |
|
||
|
|

start [/forum/topic.php?fid=58&gotonew=1&tid=2038163]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
160ms |
get topic data: |
10ms |
get first new msg: |
7ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 248ms |
| total: | 515ms |

| 0 / 0 |
