powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / В каких случаях вы используете метод TThread.Queue?
46 сообщений из 46, показаны все 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
В каких случаях вы используете метод TThread.Queue?
    #39976532
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне удалось собрать всю необходимою информацию для того, чтобы продолжить своё занятие в отпуск. Разобрался, как использовать Queue для организации надежной передачи данных в основной поток без использования дополнительных списков (пришлось таки поставить современную Delphi с поддержкой Queue и поэкспериментировать с анонимными процедурами :). Удалось подготовить наглядный пример, который показывает все аспекты работы Queue.
Всем спасибо за участие!
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976565
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F
Dmitry Arefiev,

Единственное, что в этом зажигательном спиче показалось интересным, так это "почти не вызовет".
Прошу пояснить.))
В консольных проектах механизм Synchronize/Queue вообще не будет работать от слова совсем (если ты сам вручную в каком-нибудь цикле не будешь обрабатывать накопившийся список вызовов, вызывая CheckSynchronize).
По тем же причинам Synchronize/Queue на работают в dll.
По тем же причинам Synchronize/Queue на работают нигде до вызова Application.Run.
А из-за костыля, который лечит дедлоки этого механизма, вызов метода TThread.WaitFor (а он вызывается и в деструкторе) в главном потоке - грузит проц на 100%.
В общем, Synchronize/Queue - это то, чего не надо было делать в Delphi и использовать тоже.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976576
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

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


В официальной документации про Queue практически ничего нет. Зачем его делали - непонятно. Synchronize - является способом передачи данных в основной поток, SendMessage, PostMessage - являются. А вот Queue - не является.
если бы VCL не писали криворукие, может быть и работало бы SendMessage, PostMessage нормально. Но чуть тронешь в их обработчике гуи, то может быть конкретный пипец

SendMessage, PostMessage - рождает кучу трудноуловимых багов в VCL. По тем проектам, на которые я попадал, я только за этот год поймал и пофиксил около 3-х багов ими вызванных

первоначально, как только массово вошла в эксплуатацию 10-ка, этих багов было вообще пруд пруди
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976637
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
В каких случаях Вы используете метод TThread.Queue и почему?
Dmitry Arefiev
Последнее подходит для каких-либо прогрессов выполнения
я в частности для этого
DmSer
В случае PostMessage мы может передавать данные через wParam и lParam, мы имеем полный контроль над своей программой. В случае Queue нет никаких wParam и lParam
но все что нужно можно запихать в собственный враппер использующий механизм Queue/StaticQueue
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976673
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan
но все что нужно можно запихать в собственный враппер использующий механизм Queue/StaticQueue
архитектурно это самый хороший путь, если есть такая возможность
локализованный код легче исправить и отладить

а то на KiUserCallbackDispatcher в багрепортах уже глаз дёргать начинает
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976898
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
если бы VCL не писали криворукие, может быть и работало бы SendMessage, PostMessage нормально. Но чуть тронешь в их обработчике гуи, то может быть конкретный пипец

SendMessage, PostMessage - рождает кучу трудноуловимых багов в VCL. По тем проектам, на которые я попадал, я только за этот год поймал и пофиксил около 3-х багов ими вызванных
А можно пару примеров этой кучи?
А то я чото правда не могу придумать, использовал всегда и горя не знал.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976919
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
kealon(Ruslan)
если бы VCL не писали криворукие, может быть и работало бы SendMessage, PostMessage нормально. Но чуть тронешь в их обработчике гуи, то может быть конкретный пипец

SendMessage, PostMessage - рождает кучу трудноуловимых багов в VCL. По тем проектам, на которые я попадал, я только за этот год поймал и пофиксил около 3-х багов ими вызванных
А можно пару примеров этой кучи?
А то я чото правда не могу придумать, использовал всегда и горя не знал.
пишу по памяти, вот основные ошибки которые возникают:
  • Canvas don't allow drawing
  • An OS function failed
  • Control has no parent
  • иногда просто изменение Visible не срабатывает
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976946
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Не видел такого никогда.. А как добиться этих ошибок с помощью Post/SendMessage?
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976957
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,
Такие ошибки возникают, когда программист не может правильно реализовать синхронизацию с основным потоком VCL. И это не зависит от Send/Postmessage или Synchronize.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976958
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
procedure TGraphicControl.WMPaint(var Message: TWMPaint);
begin
  if (Message.DC <> 0) and not (csDestroying in ComponentState) then
  begin
    Canvas.Lock;
    try
      Canvas.Handle := Message.DC;
      try
        Paint;
      finally
        Canvas.Handle := 0;  <<<<---- какой дэбил догадался это написать?
      end;
    finally
      Canvas.Unlock;
    end;
  end;
end;

...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39976970
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan), А что тут не устраивает? Девайс контекст после вызова процедуры станет невалидным, его таким и помечают.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39977024
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис
kealon(Ruslan), А что тут не устраивает? Девайс контекст после вызова процедуры станет невалидным, его таким и помечают.
здесь нет защиты от неявной рекурсии - а SendMessage, PostMessage её могут вызвать, помним про KiUserCallbackDispatcher?

старый контекст нужно сохранять и восстанавливать назад, иначе при попытке использовать такой Canvas из-за блокировки будет Canvas don't allow drawing"
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39977099
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

1. Нет, багрерорты не делает. Хватает подробных логов.

2. Из-за этого может возникнуть проблема (ну я так вижу), только если перекрыть WM_PAINT, вызвать inherited и потом что-то пытаться рисовать через канвас. Ну это как бы обычно сразу не работает, если еще и логику с ветвлениями не наворотить...

В общем, у меня с этим проблем не было.

Ну, и главное - я не понял, при чем здесь Post/SendMessage.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39977115
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

1. стоит добавить. много интересного приходит чего никогда не наблюдаешь и повторить не получается, но после фикса багрепорты исчезают
2. нет, схема простая, у тебя идёт рисование, дальше "случайно" срабатывает обработчик сообщения, в котором тоже по различным причинам срабатывает эта же прорисовка - вот тебе неявная рекурсия, дальше обработчик возвращается в прорисовку и получаешь фейл, т.к. Canvas.Handle = 0.
А так как багрепорты у тебя не настроены, стандартный обработчик покажет пользователю окно с ошибкой, а он его благополучно закроет и забудет.

но если софт пишется для 10-ка человек, то конечно можно и дальше не заморачиваться на мелочи, типа 1 раз за млн запусков
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39977150
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
схема простая, у тебя идёт рисование, дальше "случайно" срабатывает обработчик сообщения, в котором тоже по различным причинам срабатывает эта же прорисовка - вот тебе неявная рекурсия
"Случайно" - это либо вызов UpdateWindow из WM_PAINT, либо принудительная выкрутка сообщений с обработкой (типа Application.ProcessMessages) из WM_PAINT?
Тут даже обсуждать нечего.
Всё так же не понятно, при чем здесь Post/SendMessage (ну кроме SendMessage (из WM_PAINT!!!), у которого в обработчике UpdateWindow или выкрутка )

kealon(Ruslan)
А так как багрепорты у тебя не настроены, стандартный обработчик покажет пользователю окно с ошибкой, а он его благополучно закроет и забудет.
И в мои логи попадёт всё, вплоть до того, какую кнопку нажал пользователь, а если это исключение - добавится еще и лог, который алерт вызовет и техподдержка будет разбирать все логи.

kealon(Ruslan)
софт пишется для 10-ка человек

Нет, еще три нуля - порядок где-то таков.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39977242
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

плохо копаешь, копай WM_PRINT где юзается
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39977248
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
YuRock,

плохо копаешь, копай WM_PRINT где юзается
Возможно.
В сфере моих программ такие сообщения не приходят.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39977293
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Возможно.
В сфере моих программ такие сообщения не приходят.
ну вот добавишь стили, или компонент какой с прозрачностью и пойдёт коса по камням
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39977547
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
YuRock
Возможно.
В сфере моих программ такие сообщения не приходят.
ну вот добавишь стили, или компонент какой с прозрачностью и пойдёт коса по камням
Да нет, не добавлю.
Я вообще не использую VCL давно, свою библиотеку использую. Но и сейчас, и раньше, когда использовал - не было проблем с отправкой и обработкой сообщений (видимо, компоненты, стреляющие мне в ногу, не попадались).
Чего не могу сказать про Synchronize - в библиотеках-драйверах для СУБД эта гадость нет-нет, да используется, бывает, ну и доставляет тогда проблем, которые обходить приходится костылями, или переписывать их код на Send/PostMessage.
...
Рейтинг: 0 / 0
В каких случаях вы используете метод TThread.Queue?
    #39977587
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Да нет, не добавлю.
Я вообще не использую VCL давно, свою библиотеку использую. Но и сейчас, и раньше, когда использовал - не было проблем с отправкой и обработкой сообщений (видимо, компоненты, стреляющие мне в ногу, не попадались).
Чего не могу сказать про Synchronize - в библиотеках-драйверах для СУБД эта гадость нет-нет, да используется, бывает, ну и доставляет тогда проблем, которые обходить приходится костылями, или переписывать их код на Send/PostMessage.
нет VCL - нет и проблем с ней
так то и у меня есть, но приходится жить с тем за что денюжку платят - потому разговор про то как с ней жить:-)

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


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