Здравствуйте, tchernov, Вы писали:
T>Здравствуйте, sam_daemon, Вы писали:
_>>Вот у меня в связи с этим вопрос а можно ли все же получить объект используя его хэндлер. Например получить указатель на CView из дочернего потока???
T>Объект получить нельзя, но это и не нужно. Проблема заключается в том, что не безопасно пользоваться методами объекта (как инстанса какого-либо класса), если эти методы не трэдсэйф. Но никто не мешает создать другой инстанс в нужно трэде и приаттачить его к существующим данным (через хендл) — ведь именно данные и нужны. Для любого класса, унаследованного от CWnd (а CView и есть таковой), можно вызвать FromHandlePermanent, передавая ему HWND твоего вья из другого потока. После этого ты получишь объект CView, связанный с нужным виндовым окном.
Не вводите в заблуждение, плз.
permanent от не permanent отличается вовсе не этим.
В каждом потоке есть свой мап hwnd->объект. Когда создаешь окно CWnd, оно кладется в этот мап как permanent-ный айтем.
Когда ты по HWND пытаешься получить объект вызывая FromHandle, и в мапе данного потока объект не найден, создается временный объект. Эти временные объекты будут уничтожены во время вызова DeleteTempMap, кажется он вызывается в idle-обработчике MFC.
Т.о. отличие FromHandle от FromHandlePermanent заключается в том, что если в мапе данного потока объект на зарегистрирован (грубя говоря, создан в другом потоке), то первая возвращает временный объект, тогда как вторая возвращает NULL.