powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / В каких случаях вы используете метод TThread.Queue?
25 сообщений из 46, страница 1 из 2
В каких случаях вы используете метод TThread.Queue?
    #39976250
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В современных версиях Delphi присутствует метод TThread.Queue, который позволяет дополнительному вызвать метод или анонимную процедуру в контексте главного потока.
Метод TThread.Queue отличается от TThread.Synchronize тем, что он возвращает управление сразу, а не дожидается, когда главный поток произведёт вызов процедуры.
В связи с этим, благодаря TThread.Queue мы получаем проблемы, которых не было при использовании Synchronize, например:
- проблема многопоточного доступа к объектам / массивам / строкам

Если сравнивать Queue с PostMessage, то PostMessage выглядит более универсальным, т.к. он позволяет надёжно передать данные в основной поток.
На мой взгляд, Queue не является надёжным способом передачи данных в основной поток, зато он является кроссплатформенным способом выполнить вызов метода или анонимной процедуры в контексте основного потока, а уже при вызове процедуры можно запросить необходимые данные из доп. потока.

В каких случаях Вы используете метод TThread.Queue и почему?
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976266
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
На мой взгляд, Queue не является надёжным способом передачи данных в основной поток
Не правда, если ты понимаешь что делаешь.
Хотя кривыми руками сломать что угодно можно.

Ну и на последок: Queue вообще не является способом передачи данных, это способ выполнения кода в главном потоке.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976296
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
DmSer
На мой взгляд, Queue не является надёжным способом передачи данных в основной поток
Не правда, если ты понимаешь что делаешь.
Хотя кривыми руками сломать что угодно можно.


Мне сложно представить, сколько лет нужно готовить Delphi-программиста, чтобы он смог корректно использовать метод Queue и не волновался о форме своих рук :)
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976298
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Queue вообще не является способом передачи данных, это способ выполнения кода в главном потоке.


В официальной документации про Queue практически ничего нет. Зачем его делали - непонятно. Synchronize - является способом передачи данных в основной поток, SendMessage, PostMessage - являются. А вот Queue - не является.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976299
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Мне сложно представить, сколько лет нужно готовить Delphi-программиста, чтобы он смог корректно использовать метод Queue и не волновался о форме своих рук :)
Если понимание основ многопоточности есть - там нет ничего сложного.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976301
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"
Что непонятного?

Synchronize - является способом передачи данных в основной поток
В той же степени как лодочное весло является способом передачи людей с одного берега реки на другой.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976303
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для простоты можешь считать что Queue=PostMessage
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976309
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 вопросов нет. Проблема в том, что его добавили, как правильно пользоваться не объясняют.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976311
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Проблема в том, что его добавили, как правильно пользоваться не объясняют.
Звери какие!
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976314
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger
Для простоты можешь считать что Queue=PostMessage


Хотелось бы так считать, но не получается. В случае PostMessage мы может передавать данные через wParam и lParam, мы имеем полный контроль над своей программой. В случае Queue нет никаких wParam и lParam. Есть только 2 варианта передачи данных: 1) заранее сохранить данные в полях класса, а затем их обработать при вызове процедуры из главного потока; 2) использовать анонимную процедуру и надеяться, что в момент вызова процедуры данные будут теми же, что и при вызове метода Queue. Получается, что очередь вызовов у нас есть, а очередь данных - как повезёт.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976318
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если тебя 2 жалких инта в качестве передаваемых данных полностью устраивают - флаг тебе в руки.

Потому что если нет - то Send/PostMessage в плане передачи данных ничем не отличаются от других вариантов что ты перечислил.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976328
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Если тебя 2 жалких инта в качестве передаваемых данных полностью устраивают - флаг тебе в руки.

Потому что если нет - то Send/PostMessage в плане передачи данных ничем не отличаются от других вариантов что ты перечислил.


В SendMessage / PostMessage я могу передать ссылку на объект, который создаю перед вызовом и заполняю необходимыми данными.
В случае Queue, если использовать такую же схему, нужно будет проверять, что окажется захвачено в анонимной процедуре: ссылка на созданный объект или ссылка на переменную. Проверю позже. Так ведь ещё пишут, что при уничтожении потока будут автоматически уничтожены все необработанные вызовы, которые добавил метод Queue, а в таком случае получим сразу 2 проблемы: 1) вызов Queue был, а запуска в главном потоке не было; 2) объект был создан, код удаления вызван не будет, произойдёт утечка памяти.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976332
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
// Thread Code.
begin
  MyObject := TMyObject.Create;
  ThreadSafeQueue.Enqueue(MyObject);
  TThread.Queue(ProcessDataInTheQueue);
end;


// Main Code.
procedure ProcessDataInTheQueue;
var
  MyObject: TMyObject;
begin
  ThreadSafeQueue.Dequeue(MyObject);
  try
    // process the actual object as needed
  finally
    MyObject.Free
  end;
end;
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976343
zedxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
будут автоматически уничтожены все необработанные вызовы
Если первым параметром передать nil, то вызовы будут обработаны в любом случае.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976358
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
В каких случаях Вы используете метод TThread.Queue и почему?

Странный вопрос.
Да почти везде использую, где нужно выполнить что-то в контексте главного потока из других.
synchronize - не использую, потому что вызовов много, и в итоге они дружно так завешивают все наглухо.

А насчет опасности - да нет там никакой опасности. Если где-то есть вероятность наложения - критсекциями обмазываешь нужный кусок кода и вперед.

P.S. Ну и конечно подчищать очередь перед убиением потока, как написали уже.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976363
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё такую хрень нужно учитывать:
https://stackoverflow.com/questions/42280937/delphi-queue-and-synchronize
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976370
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

Ты опять папины трусы одел?

Настоящий DmSer под уровню опыта и эрудиции на две головы выше тебя. Странно слышать такие вопросы по этим ником
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976372
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Ещё такую хрень нужно учитывать:
https://stackoverflow.com/questions/42280937/delphi-queue-and-synchronize


учитывать, что автор вопроса не понимает, как это все вообще устроено?
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976382
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r
DmSer
Ещё такую хрень нужно учитывать:
https://stackoverflow.com/questions/42280937/delphi-queue-and-synchronize


учитывать, что автор вопроса не понимает, как это все вообще устроено?


Как это всё устроено я в курсе. Меня интересует best practices по использованию Queue.
Если это важно, отмечу, что я не использовал Queue и не было таких планов. Вопрос я задал для других целей, каких именно - позже узнаете.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976394
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Vizit0r
пропущено...


учитывать, что автор вопроса не понимает, как это все вообще устроено?


Как это всё устроено я в курсе.

я вообще про автора вопроса с SO.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976409
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
// Thread Code.
begin
  MyObject := TMyObject.Create;
  ThreadSafeQueue.Enqueue(MyObject);
  TThread.Queue(ProcessDataInTheQueue);
end;


// Main Code.
procedure ProcessDataInTheQueue;
var
  MyObject: TMyObject;
begin
  ThreadSafeQueue.Dequeue(MyObject);
  try
    // process the actual object as needed
  finally
    MyObject.Free
  end;
end;



Данный способ передачи данных мне представляется наиболее надёжным, подойдёт в качестве примера. Но тут Queue используется лишь для уведомления главного потока о том, что подготовлены данные.
Если кто-то поделится ещё примерами буду рад.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976471
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TThread.Queue и Synchronize
1) Никуда не передают данные и не должны. Я вообще не понимаю такого термина как передача данных между потоками. Потоки это способ асинхронного выполнения кода.
2) Используя эти методы проблем с доступом к коллекциям/объектам не будет, если они иммутабельны или потокобезопасны.
3) Задача TThread.Queue - асинхронно выполнить в контексте главного потока переданный код относительно потока, в котором был вызван (Обычно для обновления VCL-компонентов)
4) Задача TThread.Synchronize - синхронно выполнить в контексте главного потока переданный код относительно потока, в котором был вызван (Обычно для обновления VCL-компонентов)

Другие задачи в методах которые были вызваны используя Queue и Synchronize решать нельзя. Для этого существуют другие примитивы и подходы.

TThread.Queue - используется везде, где необходимо обновить визуальную составляющую VCL, когда обработка пришедших данных (REST/HTTP/TCP) приходит в потоках отличных от главного.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976496
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
В официальной документации про Queue практически ничего нет. Зачем его делали - непонятно.
Предполагаю затем, что этот вариант будет работать там где остальные недоступны. К примеру, в консольном приложении.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976518
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никто ничего не понимает ... Ну кроме Белого Негра (да простят меня все за рассизм).

По сути, Queue / Synchronize помещают сообщения в очередь сообщений, обрабатываемых в основном потоке вызовом CheckSynchronize. По умолчанию, CheckSynchronize вызывается библиотеками когда основной поток простаивает. Консольное приложение почти не вызовет CheckSynchronize.

Synchronize ждет обработки сообщения, Queue - не ждет. И та и другая получают либо обработчик либо анонимный метод. Это и определяет как будет жить контекст. В том же обработчике ни кто не запрещает вызвать Self.Destroy.

Так что это очередь объектных сообщений для главного потока. Как с ней обращаться - каждый сам решает. Примеры:
* поток хочет известить главный поток срочно и дождаться - Synchronize
* поток хочет известить главный поток и пофигу когда тот отреагирует - Queue

Последнее подходит для каких-либо прогрессов выполнения. Первое - ... для большинства остального, когда исполнпение обработчика может повлиять на основной код. И тд ...
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976525
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev,

Единственное, что в этом зажигательном спиче показалось интересным, так это "почти не вызовет".
Прошу пояснить.))
...
Рейтинг: 0 / 0
25 сообщений из 46, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / В каких случаях вы используете метод TThread.Queue?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]