Ghost2
> Так то "на уровне ядра" в винде работают все диалоги и окна, если чего
и? Даже запись в фаил это уровень ядра, создание процесса/потока это тоже уровень ядра. Я тебе сразу сказал, это ты ломался.
> орхетектура пользовательского интерфейса винды
получение результата после работы диалога отрытия/сохранения файла к этому не относится, он тупо блокирует вызываемый поток и крутит свой диалог в другом пока блокируемый ждет. Если ты хочешь обойти это, то сам вынужден вызывать диалог в другом потоке блокировка которого допускается.
> Посмотрел winspy - окошко принадлежит тому же процессу. Наоткрывал рандомных приложений и везде окно диалога открытия/сохранения принадлежит тому же процессу, что и основное. Где ты обрел эти сакральные знания (которые не вера) про ядро и отдельные процессы?
да, там отдельный поток.
> И еще вопрос - как ты делаешь диалог открытия/сохранения модальным, если не задаешь ему родительское окно?
static OPENFILENAMEW file_params = {0}; file_params.lStructSize = sizeof(OPENFILENAME); file_params.hwndOwner = 0;
диалог остается модальным, что не так?
Aroch
> Я тебе сразу сказал, это ты ломался
Ты сразу сказал, что конкретно эти диалоги особенные тем, что они выполняются «на уровне ядра». А получилось так, что там весь бэк выполняется на уровне ядра. Тогда твой акцент на этом перестал быть понятным еще больше.
> он тупо блокирует вызываемый поток и крутит свой диалог
И вызывающее окно вообще перестает получать сообщения?
> да, там отдельный поток
Ты же говорил, что отдельный процесс. И еще советовал почитать про это. Забыл что-ли?
> диалог остается модальным, что не так?
Если ты говоришь, что остается модальным, то все так. Я же на веру все принимаю, лол
Ghost2
> И вызывающее окно вообще перестает получать сообщения?
если у тебя цикл приема сообщений в том же потоке то дагадайся с одного раза.
> Тогда твой акцент на этом перестал быть понятным еще больше.
обычные диалоги не создают и не блокируют вызываемый поток.
> Ты же говорил, что отдельный процесс
тут ошибся и исправился, сильно это изменило погоду?
> Я же на веру все принимаю, лол
так докажи обратное.
Aroch
> если у тебя цикл приема сообщений в том же потоке то дагадайся с одного раза.
С событиями пользовательского ввода понятно, раз диалог модальный, то нефиг. А вот насчет всяких WM_PAINT - если родительское окно вместе с модальным диалогом перекрыли окном другого процесса, а потом они снова стали видимыми - кто-то же должен перерисовать видимую часть родительского окна?
Не, понятно, что сейчас система может просто тупо помнить, что там было нарисовано до перекрытия, но если мы вернемся куда-нибудь в первую половину 90-х, во времена windows 3.x - модальные диалоги и messagebox уже были в винапи, но сохранять содержимое окна тогда был не вариант - WM_PAINT должен был работать для родительского окна даже во время MessageBox, DialogBox а также стандартных диалогов.
Dmitry_Milk
> А вот насчет всяких WM_PAINT - если родительское окно вместе с модальным диалогом перекрыли окном другого процесса, а потом они снова стали видимыми - кто-то же должен перерисовать видимую часть родительского окна?
если дефолтный, то перерисует возможно. А если пользовательский то тебе надо как то принять сообщение через тот же PeekMessage и дернуть TranslateMessage и если они в том же потоке из которого ты вызвал диалог открытия окна, то сообщения тупо будут копиться.
Aroch
> А если пользовательский то тебе надо как то принять сообщение через тот же PeekMessage и дернуть TranslateMessage
Насколько я понимаю, вся бодяга с необходимостью как цикла сообщений так и WndProc, а не просто голой обработки сообщений сразу в цикле или наоборот, сразу прямой регистрации обработчика событий в ОС - именно ради возможности крутить цикл событий в разных местах.
В частности, если необходимо показать модальный диалог - DialogBox забирает управление у потока до закрытия диалога (то есть, основной цикл событий приложения не крутится), но вместо этого в своих кишках организует в своих кишках служебный цикл событий, который выборочно работает с очередью, обрабатывая полностью события только для диалога, но при этом имея возможность достать из очереди WM_PAINT (и возможно еще WM_TIMER и еще какой-то ограниченный набор) для всех остальных окон приложения и передать в DispatchMessage, который в свою очередь вызовет WndProc родительского окна (рекурсивно, потому что внешний вызов WndProc родительского окна все еще висит в стеке на обработке того события, в котором произошел вызов DialogBox).
Dmitry_Milk
> в котором произошел вызов DialogBox
так никто не запрещает вызвать его вне.
> вызовет WndProc родительского окна
пользовательский? Ничего он не вызовет. Его даже может не быть. Ты можешь спокойно создать обычное консольное приложение и дергать openfile как обычно.
Aroch
> Его даже может не быть.
Я говорю про случай, когда родительское окно нуждается в обработке сообщений в тот момент, когда открыт модальный диалог (например, сообщения WM_PAINT для отрисовки родительского окна). Наличие модального диалога не блокирует обработку сообщений родительского окна полностью, несмотря на то, что поток заблокирован вызовом функции DialogBox/MessageBox и цикл событий приложения не работает.
Dmitry_Milk
> когда родительское окно нуждается в обработке сообщений в тот момент
клиентские будут заблокированы. Если не будешь делать финты ушами.
Aroch
> клиентские
Я не знаю, что ты называешь "клиентскими" сообщениями. но суть в том, что блокировка потока функциями dialogbox/messagebox вовсе не обозначает, что очередь соообщений для родительского окна намертво блокируется при этом - некоторые сообщения все-таки попадают на обработку в wndproc "заблокированного" родительского окна.
Dmitry_Milk
> Я не знаю, что ты называешь "клиентскими" сообщениями.
те что обрабатываются тобой.
> блокировка потока функциями dialogbox/messagebox
мне лень смотреть именно их. Но в одном ты прав некоторые сообщения будут таки обработаны что были посланы явно, типа WM_COMMAND, например приходят сообщения с тулбара. Я таким образом смог на вызывать пачку окон с открытием файла :) По хорошему посмотреть бы в каком потоке они выполняются при этом, так как я смог последовательно наоткрывать диалогов и они последовательно исполнили код реакции на открытие файла, что возможно либо при вызове из другого потока либо каких то махинаций со стеком.
Aroch
> что возможно либо при вызове из другого потока либо каких то махинаций со стеком.
Почему махинаций? Обычный стек вызовов, в котором просто перемежаются функции из приложения и системные:
------+ -----+ -----+ -----+
/ ... -----+ / ... / ... / ...
/ | / | / | /GetMessage(filtered)/ WndProc(dialog)
/ GetMessage / ... /CASE WM_COMMAND: / | / ...
WinMain | /WndProc(MainWindow) DialogBox DispatchMessage | /
\ DispatchMessage | \ ... \ ... \WndProc(MainWindow)
\ | \ ... \ | \ | \ | \
\ ... \ | \ | \ | \ ...
------+ \ | -----+ -----+ -----+Все реализуемо в рамках одного потока, просто во время выполнения DialogBox/MessageBox вместо цикла событий из WinMain работает цикл фильтрованных событий внутри реализации DialogBox (ну или какой-то более общей для всех модальных).
UPD. Другими словами - как и при обычной работе окна, большую часть времени основной поток приложения заблокирован именно вызовом GetMessage (а не какой-то магией внутри DialogBox), просто этот GetMessage вызван не из WinMain, а из кишков DialogBox (или каких-то его более внутренних кишков).
1 frag / 2 deaths
> и... оказывается что он сохранил мне его вообще не туда, где я открыл изначальный файл. Неужели так трудно сделать
Ну а что ты хотел, блендер - бесплатная прога. Бесплатная == забили на удобство.
Я уже привык по папкам быстро ходить, с какого-то времени становится пофиг как только вырабатывается опыт в смене папок.
Dmitry_Milk
> Обычный стек вызовов,
у меня на телефоне это выглядит сейчас как шар свиборга, но одно точно GetMessage/Dispatch c моей стороны не зовутся. OpenFileDialog запускается в отдельном потоке, это можно легко проверить в диспетчере задач. Я могу как нибудь потом просто в лог писать id потока из которого дергается код открытия файла, чтобы прояснить этот момент.
Aroch
> Я могу как нибудь потом просто в лог писать id потока из которого дергается код открытия файла, чтобы прояснить этот момент.
Тема в архиве.