Member 13919032 Ответов: 0

Createwindow() не возвращается


Я публикую пользовательское сообщение create window из основного потока и вызываю функцию CreateWindow (), но она не возвращает NULL или допустимый HWND,просто оставайтесь там.
Кто-нибудь из ребят сталкивался с этой проблемой?
Спасибо.
Ниже приведена часть кода:
std::cout << " begin create window..... " << std::endl;
                                globals->new_window = CreateWindowEx (0,globals->window_class_name,  TEXT(""),
                                                                    globals->dwStyle,
                                                                    CW_USEDEFAULT, CW_USEDEFAULT,
                                                                    CW_USEDEFAULT, CW_USEDEFAULT,
                                                                    NULL, NULL, globals->hInstance, NULL);
std::cout << "end create window ... " << std::endl;


Я отправляю сообщение в основной поток:
globals->dwStyle = dwStyle_;
if (PostMessage(globals->helper_window,WM_USER+CREATE_WINDOW,0,0)==0)
{
    throw gui_error("Unable to schedule function for execution in event handling thread.");
}


Он печатает
begin create window.....
- но не спускайся вниз.

Что я уже пробовал:

Я проверил весь код ,но не сработал.

OriginalGriff

Покажите нам соответствующие фрагменты кода ...

Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

Jochen Arndt

До сих пор невозможно понять, что происходит. Мы не знаем, что такое все эти "глобальные" члены и что они содержат, а также когда и как называется опубликованный код. Кажется также, что задействованы разные нити.

Использование "глобального" указывает на то, что у вас по крайней мере плохой дизайн. Если это используется из разных потоков, то очень вероятно, что он не будет работать без какого-то механизма блокировки.

Обратите внимание также, что вы должны использовать WM_APP вместо WM_USER при отправке сообщений между различными окнами.

Member 13919032

Дорогой Йохен,Спасибо за ваш ответ.
"глобальные" хранят некоторые var, используемые между различными потоками.
PostMessage успешен ,потому что он запустил CreateWindow() WndPro в другом потоке,но просто не вернулся из него.
Могу ли я узнать разницу между WM_APP и WM_USER?

Jochen Arndt

При использовании переменных, совместно используемых потоками, необходимо убедиться, что только один поток одновременно обращается к ним. Я не вижу никакого метода, делающего это в вашем коде.

PostMessage () - это метод, используемый при передаче сообщений из одного потока в другой. Но я не знаю об организации вашего приложения (что называется, когда и каким потоком) и какие ценности на самом деле имеют эти "глобалы".

Я все еще предполагаю, что ваша проблема вызвана плохим дизайном потока. Может быть, ваш дизайн даже ошибочен и не может работать так, как задумано.

Общий подход заключается в выполнении всех операций графического интерфейса (включая создание окна) в основном потоке (GUI) и выполнении фоновых операций в рабочих потоках, которые используют PostMessage() для отправки данных или уведомлений элементам графического интерфейса (windows или элементам управления). Для другого направления используйте события для сигнализации. Для обмена данными используйте соответствующие механизмы блокировки.

Смотрите документацию MS по WM_APP / WM_USER. Там это подробно объясняется.

Richard MacCutchan

Похоже, что этот поток блокируется чем-то другим в вашем коде.

Member 13919032

Может быть,это и есть проблема, я проверяю ее. - Спасибо,Ричард.

Member 13919032

Дорогой Ричард, не могли бы вы помочь мне объяснить, почему CreateWindow() в WndProc напрямую отправляет Msg (WM_CREATE) и снова входит в WndProc, не выходя из WndProc?
Спасибо.

Richard MacCutchan

Потому что именно так работает CreateWindow, как описано в документации. Если вы не захватите WM_CREATE, то по умолчанию ничего не будет делать, а просто вернет положительный ответ. Я подозреваю, что есть какой-то другой код, который Вы нам не показали, что является причиной вашей проблемы.

11917640 Member

Причина, вероятно, кроется в новой функции window WndProc, зарегистрированной в globals->window_class_name.

0 Ответов