|
|
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
В современных версиях Delphi присутствует метод TThread.Queue, который позволяет дополнительному вызвать метод или анонимную процедуру в контексте главного потока. Метод TThread.Queue отличается от TThread.Synchronize тем, что он возвращает управление сразу, а не дожидается, когда главный поток произведёт вызов процедуры. В связи с этим, благодаря TThread.Queue мы получаем проблемы, которых не было при использовании Synchronize, например: - проблема многопоточного доступа к объектам / массивам / строкам Если сравнивать Queue с PostMessage, то PostMessage выглядит более универсальным, т.к. он позволяет надёжно передать данные в основной поток. На мой взгляд, Queue не является надёжным способом передачи данных в основной поток, зато он является кроссплатформенным способом выполнить вызов метода или анонимной процедуры в контексте основного потока, а уже при вызове процедуры можно запросить необходимые данные из доп. потока. В каких случаях Вы используете метод TThread.Queue и почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2020, 19:02 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
DmSer На мой взгляд, Queue не является надёжным способом передачи данных в основной поток Хотя кривыми руками сломать что угодно можно. Ну и на последок: Queue вообще не является способом передачи данных, это способ выполнения кода в главном потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2020, 19:59 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
rgreat DmSer На мой взгляд, Queue не является надёжным способом передачи данных в основной поток Хотя кривыми руками сломать что угодно можно. Мне сложно представить, сколько лет нужно готовить Delphi-программиста, чтобы он смог корректно использовать метод Queue и не волновался о форме своих рук :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2020, 22:24 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
rgreat Queue вообще не является способом передачи данных, это способ выполнения кода в главном потоке. В официальной документации про Queue практически ничего нет. Зачем его делали - непонятно. Synchronize - является способом передачи данных в основной поток, SendMessage, PostMessage - являются. А вот Queue - не является. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2020, 22:27 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
DmSer Мне сложно представить, сколько лет нужно готовить Delphi-программиста, чтобы он смог корректно использовать метод Queue и не волновался о форме своих рук :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2020, 22:34 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
DmSer В официальной документации про Queue практически ничего нет. Зачем его делали - непонятно. Документация есть. Может ты не там ищешь? http://docwiki.embarcadero.com/Libraries/Rio/en/System.Classes.TThread.Queue "Unlike Synchronize, execution of the current thread is allowed to continue" Что непонятного? Synchronize - является способом передачи данных в основной поток В той же степени как лодочное весло является способом передачи людей с одного берега реки на другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2020, 22:39 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
Для простоты можешь считать что Queue=PostMessage ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2020, 23:02 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
rgreat DmSer В официальной документации про Queue практически ничего нет. Зачем его делали - непонятно. Документация есть. Может ты не там ищешь? http://docwiki.embarcadero.com/Libraries/Rio/en/System.Classes.TThread.Queue "Unlike Synchronize, execution of the current thread is allowed to continue" Что непонятного? Про назначение метода Queue вопросов нет. Проблема в том, что его добавили, как правильно пользоваться не объясняют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2020, 23:43 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
DmSer Проблема в том, что его добавили, как правильно пользоваться не объясняют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2020, 23:52 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
white_nigger Для простоты можешь считать что Queue=PostMessage Хотелось бы так считать, но не получается. В случае PostMessage мы может передавать данные через wParam и lParam, мы имеем полный контроль над своей программой. В случае Queue нет никаких wParam и lParam. Есть только 2 варианта передачи данных: 1) заранее сохранить данные в полях класса, а затем их обработать при вызове процедуры из главного потока; 2) использовать анонимную процедуру и надеяться, что в момент вызова процедуры данные будут теми же, что и при вызове метода Queue. Получается, что очередь вызовов у нас есть, а очередь данных - как повезёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2020, 23:55 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
Если тебя 2 жалких инта в качестве передаваемых данных полностью устраивают - флаг тебе в руки. Потому что если нет - то Send/PostMessage в плане передачи данных ничем не отличаются от других вариантов что ты перечислил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2020, 00:17 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
rgreat Если тебя 2 жалких инта в качестве передаваемых данных полностью устраивают - флаг тебе в руки. Потому что если нет - то Send/PostMessage в плане передачи данных ничем не отличаются от других вариантов что ты перечислил. В SendMessage / PostMessage я могу передать ссылку на объект, который создаю перед вызовом и заполняю необходимыми данными. В случае Queue, если использовать такую же схему, нужно будет проверять, что окажется захвачено в анонимной процедуре: ссылка на созданный объект или ссылка на переменную. Проверю позже. Так ведь ещё пишут, что при уничтожении потока будут автоматически уничтожены все необработанные вызовы, которые добавил метод Queue, а в таком случае получим сразу 2 проблемы: 1) вызов Queue был, а запуска в главном потоке не было; 2) объект был создан, код удаления вызван не будет, произойдёт утечка памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2020, 00:33 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2020, 00:39 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
будут автоматически уничтожены все необработанные вызовы Если первым параметром передать nil, то вызовы будут обработаны в любом случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2020, 01:38 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
DmSer В каких случаях Вы используете метод TThread.Queue и почему? Странный вопрос. Да почти везде использую, где нужно выполнить что-то в контексте главного потока из других. synchronize - не использую, потому что вызовов много, и в итоге они дружно так завешивают все наглухо. А насчет опасности - да нет там никакой опасности. Если где-то есть вероятность наложения - критсекциями обмазываешь нужный кусок кода и вперед. P.S. Ну и конечно подчищать очередь перед убиением потока, как написали уже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2020, 08:12 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
Ещё такую хрень нужно учитывать: https://stackoverflow.com/questions/42280937/delphi-queue-and-synchronize ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2020, 09:17 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
DmSer, Ты опять папины трусы одел? Настоящий DmSer под уровню опыта и эрудиции на две головы выше тебя. Странно слышать такие вопросы по этим ником ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2020, 09:57 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
DmSer Ещё такую хрень нужно учитывать: https://stackoverflow.com/questions/42280937/delphi-queue-and-synchronize учитывать, что автор вопроса не понимает, как это все вообще устроено? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2020, 10:02 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
Vizit0r DmSer Ещё такую хрень нужно учитывать: https://stackoverflow.com/questions/42280937/delphi-queue-and-synchronize учитывать, что автор вопроса не понимает, как это все вообще устроено? Как это всё устроено я в курсе. Меня интересует best practices по использованию Queue. Если это важно, отмечу, что я не использовал Queue и не было таких планов. Вопрос я задал для других целей, каких именно - позже узнаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2020, 11:23 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
DmSer Vizit0r пропущено... учитывать, что автор вопроса не понимает, как это все вообще устроено? Как это всё устроено я в курсе. я вообще про автора вопроса с SO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2020, 12:09 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
rgreat Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Данный способ передачи данных мне представляется наиболее надёжным, подойдёт в качестве примера. Но тут Queue используется лишь для уведомления главного потока о том, что подготовлены данные. Если кто-то поделится ещё примерами буду рад. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2020, 13:09 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
TThread.Queue и Synchronize 1) Никуда не передают данные и не должны. Я вообще не понимаю такого термина как передача данных между потоками. Потоки это способ асинхронного выполнения кода. 2) Используя эти методы проблем с доступом к коллекциям/объектам не будет, если они иммутабельны или потокобезопасны. 3) Задача TThread.Queue - асинхронно выполнить в контексте главного потока переданный код относительно потока, в котором был вызван (Обычно для обновления VCL-компонентов) 4) Задача TThread.Synchronize - синхронно выполнить в контексте главного потока переданный код относительно потока, в котором был вызван (Обычно для обновления VCL-компонентов) Другие задачи в методах которые были вызваны используя Queue и Synchronize решать нельзя. Для этого существуют другие примитивы и подходы. TThread.Queue - используется везде, где необходимо обновить визуальную составляющую VCL, когда обработка пришедших данных (REST/HTTP/TCP) приходит в потоках отличных от главного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2020, 18:40 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
DmSer В официальной документации про Queue практически ничего нет. Зачем его делали - непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2020, 21:01 |
|
||
|
В каких случаях вы используете метод TThread.Queue?
|
|||
|---|---|---|---|
|
#18+
Никто ничего не понимает ... Ну кроме Белого Негра (да простят меня все за рассизм). По сути, Queue / Synchronize помещают сообщения в очередь сообщений, обрабатываемых в основном потоке вызовом CheckSynchronize. По умолчанию, CheckSynchronize вызывается библиотеками когда основной поток простаивает. Консольное приложение почти не вызовет CheckSynchronize. Synchronize ждет обработки сообщения, Queue - не ждет. И та и другая получают либо обработчик либо анонимный метод. Это и определяет как будет жить контекст. В том же обработчике ни кто не запрещает вызвать Self.Destroy. Так что это очередь объектных сообщений для главного потока. Как с ней обращаться - каждый сам решает. Примеры: * поток хочет известить главный поток срочно и дождаться - Synchronize * поток хочет известить главный поток и пофигу когда тот отреагирует - Queue Последнее подходит для каких-либо прогрессов выполнения. Первое - ... для большинства остального, когда исполнпение обработчика может повлиять на основной код. И тд ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2020, 23:01 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39976250&tid=2038163]: |
0ms |
get settings: |
4ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
157ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 255ms |
| total: | 472ms |

| 0 / 0 |
