0 Как знать, как Handle
не работает?
Когда вы получаете доступ к свойству Handle
, если дескриптор окна не был создан, он создается по требованию. Если вы получаете доступ к свойству Handle
из потока, отличного от потока графического интерфейса пользователя, то это означает, что вы создаете окно в неправильном потоке.
Это меняется в течение жизни программы?
Да, ручка окна может измениться, если окно заново создано.
Я регулярно передаю рукоятку основной формы другим потокам, чтобы они могли отправлять сообщения обратно в основной поток.
В этом случае вы, вероятно, не имеете доступа к объекту Handle
вдали от основной темы. Похоже, что (хотя я не вижу вашего кода) вы обращаетесь к Handle
в основном потоке и передаете это значение другому потоку.
Однако рекреация окон - это проблема для вас. Поскольку ваше окно подвержено релаксации, вы просто не можете полагаться на этот инструмент, переживающий вашу нить. Будет ли ваше окно когда-либо воссоздано, трудно предсказать. VCL не выполняет отдых легко. Однако, на мой взгляд, гораздо лучше быть в безопасности, чем сожалеть. Итак, используйте AllocateHWnd
и возьмите под контроль время жизни этого окна.
Да, это может измениться. Окно можно воссоздать. Если это так, старый дескриптор перестанет быть действительным. –
[AllocateHWnd не является потокобезопасным] (http://www.thedelphigeek.com/2007/06/allocatehwnd-is-not-thread-safe.html) при некоторых обстоятельствах. [Отчет QC для этой проблемы] (http://qc.embarcadero.com/wc/qcmain.aspx?d=47559) –
@DalijaPrasnikar 'AllocateHwnd' нельзя безопасно вызывать из потока - это не значит, что вы можете ' t вызвать его на основной поток и передать дескриптор, который он возвращает в рабочий поток. Хорошо. –