От чего может виснуть CreateWindowEx?
От: Corvin Украина  
Дата: 13.08.05 14:19
Оценка:
Привет всем,

имеется большое кроссплатформенное приложние, написанное при помощи бесплатной (опять-таки кроссплатформенной) графической библиотеки FLTK.

В библиотеке FLTK есть у класса Fl_Window (описывающего окно) метод show(). При вызове метода show на win32 библиотека создает окно при помощи CreateWindowEx, соответственно при вызове метода hide, окно (как GDI объект) уничтожается.

В приложении имеется окно. Я создаю окно-дитя данного окна в тестовой программе. Вызываю show, — окно-дитя отображается, отрисовывается и ловит сообщения без проблем.
Создаю окно-дитя (тот же класс) в реальном приложении. Метод show виснет. Как выяснилось после трейса, виснет вызов CreateWindowEx.

Подскажите, знатоки, из-за чего в принципе может виснуть CreateWindowEx? hWndParent, который туда передается, — реальный HWND окна-родителя. Больше идей у меня нет

спасибо.
Re: От чего может виснуть CreateWindowEx?
От: Sergei I. Gorelkin Россия  
Дата: 14.08.05 11:03
Оценка:
Здравствуйте, Corvin, Вы писали:

<skipped>

CreateWindowEx не только создает окно, но и посылает ему сообщения WM_NCCREATE, WM_CREATE (возможно, и не только их). Поэтому, если что-то напортачено в оконной процедуре, то может и повиснуть. В самой FLTK, конечно, вряд ли будут столь грубые глюки, но наверняка она вызывает какой-то пользовательский код для инициализации окна.
Re[2]: От чего может виснуть CreateWindowEx?
От: rus blood Россия  
Дата: 15.08.05 06:44
Оценка:
Здравствуйте, Sergei I. Gorelkin, Вы писали:

SIG>Здравствуйте, Corvin, Вы писали:


SIG><skipped>


SIG>CreateWindowEx не только создает окно, но и посылает ему сообщения WM_NCCREATE, WM_CREATE (возможно, и не только их). Поэтому, если что-то напортачено в оконной процедуре, то может и повиснуть. В самой FLTK, конечно, вряд ли будут столь грубые глюки, но наверняка она вызывает какой-то пользовательский код для инициализации окна.


Добавлю.
CreateWindowEx производит еще некий обмен сообщением между создаваемым дочерним и его родительским окном. Операция может подвиснуть, если эти окна в разных потоках. Например, родительское окно живет в основном потоке. Далее запускается рабочий поток, который создает дочернее окно (пример — длительная операция в рабочем потоке с отображением прогресс-бара на главном фрейме). Если основной поток просто ждет завершения рабочего потока (без цикла сообщений), то операция создания дочернего окна зависнет — CreateWindowEx не сможет отправить сообщение в родительское окно. Нужно обеспечить (хотя бы кратковременный) цикл сообщений в основном потоке.
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.