Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.46 MB
Время: 0.049 c
3-1108117514
sashakamap
2005-02-11 13:25
2005.03.13
ADO MAX(....)


14-1108805918
Иксик2
2005-02-19 12:38
2005.03.13
А чего так тихо?


1-1109661324
BillyJeans
2005-03-01 10:15
2005.03.13
Добавление пункта в контекстное меню системы


14-1108885148
__max__
2005-02-20 10:39
2005.03.13
Шифрование файлов в ф.с. NTFS


1-1109444623
Stype
2005-02-26 22:03
2005.03.13
Область уведомлений Windows





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский