Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

Как побороть ошибку "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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.168 c
3-1108380819
Ega23
2005-02-14 14:33
2005.03.13
Как выполнить ХП "во временную таблицу"?


3-1108027449
beginnn
2005-02-10 12:24
2005.03.13
как эспортировать содержимое DBGrid в Excel !?


3-1108067059
Коля
2005-02-10 23:24
2005.03.13
Загрузка bmp в поле


14-1108883719
AlterEgo of WondeRu
2005-02-20 10:15
2005.03.13
Вчера попытался посмотреть ДОМ2...


6-1105438289
Senti
2005-01-11 13:11
2005.03.13
Передача файлов в отдельных потоках