Форум: "Основная";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
ВнизКак побороть ошибку "1400: Недопустимый дескриптор окна"? Найти похожие ветки
← →
Vand777 (2005-02-27 18:29) [0]Уважаемые мастера!
Создаю поток, в котором нужно будет отлавливать некоторые сообщения. Поэтому в конструкторе создаю окошечко:
m_hook_window:= TWinControl.Create(nil);
m_hook_window.Visible:=false;
m_hook_window.Left:=-1;
m_hook_window.Top:=-1;
m_hook_window.Width:=1;
m_hook_window.Height:=1;
m_hook_window.ParentWindow:=Application.Handle;
Ну и меняю его обработчик на свой.
Все отлично работает.
Останавливаю поток из программы и вызываю Destroy, а на строке
m_hook_window.Free;
Выдает ошибку EOSerror: "System Error. Code 1400: Недопустимый дескриптор окна". Как побороть?
P.S. D2005.
← →
Leonid Troyanovsky © (2005-02-27 18:47) [1]
> Vand777 (27.02.05 18:29)
> Создаю поток, в котором нужно будет отлавливать некоторые
> сообщения. Поэтому в конструкторе создаю окошечко:
AllocateHwnd
В общем-то, поток может обрабатывать (некоторые) сообщения
и без окна.
> m_hook_window.ParentWindow:=Application.Handle;
Зачем?
> Ну и меняю его обработчик на свой.
> Все отлично работает.
Посмотри:
http://rsdn.ru/Forum/?mid=883505
> Останавливаю поток из программы и вызываю Destroy, а на
> строке
> m_hook_window.Free;
Оное деяние весьма сомнительно.
> P.S. D2005.
А приложение win32?
--
Regards, LVT.
← →
Набережных С. © (2005-02-27 20:02) [2]По-моему AllocateHWND не являтся потокобезопасной.
← →
Vand777 © (2005-02-27 20:27) [3]2 Leonid Troyanovsky: спасибо. Так заработало без исключений.
> m_hook_window.ParentWindow:=Application.Handle;
>Зачем?
Ну чтобы что-то присвоить m_hook_window.ParentWindow. А что еще можно присвоить?
> m_hook_window.Free;
>Оное деяние весьма сомнительно.
Почему?
P.S. Приложение Win32.
2 Набережных С.: так можно мне использовать AllocateHWND? Может какие-то доп. меры принять для увеличения "потокобезопасности"? Я его использую ровно настолько, как написано в http://rsdn.ru/Forum/?mid=883505
← →
Набережных С. © (2005-02-27 20:42) [4]
> Vand777 © (27.02.05 20:27) [3]
Что я могу сказать? AllocateHWND вызывает MakeObjectInstance, а та использует глобальные переменные. Что будет при одновременном обращении из разных потоков предугадать не трудно. Я ей не пользуюсь. С другой стороны, по всему нету полно примеров ее использования из дополнительных потоков и вроде как проблем ни у кого нет. Так что возможно, что я просто чего-то недопонимаю:( Решай сам.
← →
Vand777 © (2005-02-27 21:30) [5]А почему мой первоначальный вариант был плох? Ведь к этому m_hook_window обращался только один поток?
Почему тут страдает "потокобезопсаность"? Из-за наличия Application.processmessages в потоке?
← →
Leonid Troyanovsky © (2005-02-27 22:25) [6]
> Vand777 © (27.02.05 20:27) [3]
> > m_hook_window.ParentWindow:=Application.Handle;
> >Зачем?
> Ну чтобы что-то присвоить m_hook_window.ParentWindow. А
> что еще можно присвоить?
Хендл окна, созданного в том же потоке.
Хотя, видимо, не очень удачен сам замысел использования дочернего окна.
> > m_hook_window.Free;
> >Оное деяние весьма сомнительно.
> Почему?
Если с самого начала, то и само создание окна сомнительно,
бо если оно создается в конструкторе, то это не окно
создаваемого потока.
Ну, и с разрушением не все гладко, бо контролы включаются
в массив Controls and so on. Плюс последовательность -
при завершении потока окна уже нет (окно - собственность потока).
> 2 Набережных С.: так можно мне использовать AllocateHWND?
> Может какие-то доп. меры принять для увеличения
Использовать следует с оглядкой, т.к. AllocateHwnd не является потокобезопасным (Набережных С. © (27.02.05 20:42) [4]).
Однако, если оные потоки (окна) не создаются многопоточно и ежемилисекундно, то и проблем нет.
Ну, а в сомнительных случаях можно собс-ручно защитить вызов посредством критической секции.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.033 c