Visual Basic 6.0 - Threads
Re: Threads
From: "A. Skrobov" <tyomitch [@] r66.ru>
Hello, Dmitry!
You wrote in conference fido7.ru.visual.basic to "Roman Yuakovlev"
<fido7.ru.visual.basic [@] talk.ru>to Roman Yuakovlev on Sun, 11 Jul 2004
21:27:59 +0000 (UTC):
AS>> Каких сообщений?
DV> В системной очереди сообщений.
В очереди сообщений _приложения_. Системная очередь сообщений была в Win16.
(Это я так, придираюсь ;-)
With best regards, A. Skrobov. E-mail: tyomitch [@] r66.ru
--
* Origin: Talk.Mail.Ru (2:5020/400)
Re: Какая кнопка нажата?
From: "A. Skrobov" <tyomitch [@] r66.ru>
Hello, Roman!
You wrote in conference fido7.ru.visual.basic to "A.Skrobov"
<fido7.ru.visual.basic [@] talk.ru>to A. Skrobov on Mon, 12 Jul 2004 04:37:06
+0400:
AT>>> Hе знаю какие у тебя там контексты ;) Hо Terminate не вызовется
AT>>> после Unload FormX. Соответственно все переменные, обьявленные на
AT>>> уровне формы так и будут держать ссылки на объекты
AT>>> (например). http://trishin.com/project.zip
AS>> Хм, действительно. Довольно неожиданно для меня.
AS>> Причём если (как и сказал Роман) дописать Set Form2 = Nothing, то
AS>> форма выгрузится "до конца", и объекты уничтожатся. Уничтожать их в
AS>> Form_Unload всё-таки не обязательно. Формы - это вообще вещь тонкая;
AS>> они являются одновременно и классами, и глобальными объектами; у них
AS>> есть и reference counting, и Load/Unload... Давай лучше обычные классы
AS>> обсуждать. Там-то локальные ссылки освободятся при выгрузке объекта,
AS>> согласен?
RY> Вы уж там наверху определитесь. А то я Set ... в своих проектах то
RY> удаляю, то добавляю. ;(
RY> Значит, это все таки необходимое условие?
А фиг его знает ;-(
Я никогда не писал, и никогда не имел из-за этого проблем, не знаю почему
мне так везло.
With best regards, A. Skrobov. E-mail: tyomitch [@] r66.ru
--
* Origin: Talk.Mail.Ru (2:5020/400)
Re: Как пишут шеллы?
From: Victor Kagramanyants <kagr [@] narzan.com>
On Sun, 11 Jul 2004 19:34:39 +0400, in fido7.ru.visual.basic you wrote:
AS> Hе понял, про что ты это. А в KDE ещё shaded состояние есть, и что
AS> дальше?
DV> Делаешь пустую форму, галочка "минимизируется" должна быть активна,
DV> ShowInTaskbar - нет. Запускаешь, минимизируешь, наслаждаешься. То, что ты
DV> увидел - это ДЕЙСТВИТЕЛЬHО отрисовано самим окном.
AS> Поправка: не самим окном, а DefWindowProc, и как раз в WM_NCPAINT.
ИМХО, он имеет ввиду анимацию
AS> Вот я хочу написать прогу, которая бы в свёрнутом состоянии получала ещё и
AS> WM_PAINT, причём с валидным hDC в PAINTSTRUCT. Я могу?
Зачем? Рисовать где?
AS> Кто, кстати, все эти сообщения рассылает, типа WM_PAINT? Шелл или user32?
AS> Мне казалось что user32.
user32
DV> А то, что в таскбаре - шеллом. А вот куда шелл девает те окна, которые он
DV> не собирается отрисовывать - это его личное дело ;)
AS> И всё-таки, как мне - шеллу - даже хотя бы _перехватить_ сворачивание окон?
AS> Внедрять всюду хуки? :-)
WH_CBT ставь. Ресурсов почти не жрет.
AS> Собственно рисует ведь не шелл, а окно себя? В тот DC, что получит из
AS> BeginPaint? Так как же шелл может указать, куда окну рисовать себя?
DV> Ты уверен? Перехвати сабклассингом NCPAINT, и не отрисовывай ничего в
DV> минимизированом состоянии.
AS> Уверен, изучал сэмплы от Win31. Там структура обработчика WM_PAINT (не
AS> WM_NCPAINT!) такая:
AS> BeginPaint
AS> If IsIconic Then
AS> DrawIcon
AS> Else
AS> 'отрисовка окна
AS> End If
AS> EndPaint
Вот именно, что от Win31. Сейчас все не так.
Пихаем expolrer.exe в дизассемблер... Кнопки на панели задач - это Tab Control.
У него установлен стиль TSC_OWNERDRAWFIXED. Родитель (MSTaskSwWClass)
обрабатывает WM_DRAWITEM для каждой кнопки и вызывает для них функцию
DrawCaptionTemp. Функция не документированная... Во всяком случае ты видишь, что
окна рисуются не сами.
AS> Дальше, положим я перехватил желание окна свернуться. Что дальше? Оно ведь у
AS> меня не спросит, рисовать себя или нет, так? Как же запретить ему
AS> рисоваться?
Вобщем, ты понял.
AS> Дальше, положим я хочу дать ему нарисоваться. Как оно определяет, рисоваться
AS> синей полоской (как в explorer без WS_EX_APPWINDOW) или иконкой 36х36 (как в
AS> progman)?
В progman другая история была. Там, возможно, окна сами рисовались. Hо не
теперь!
AS> Какие именно?
DV> Hе копал, не знаю.
AS> ;-(
AS> А где копать хоть?
В explorer.exe :)
AS> Ещё есть полунедокументированное сообщение WM_PAINTICON, которое шлётся
AS> (слалось) только окнам с иконкой в классе. Я ковырял clock.exe от NT31,
AS> которая в минимизированном состоянии обновляет иконку по таймеру. Так вот,
AS> там как раз создаётся окно без иконки в классе, и в минимизированном
AS> состоянии оно отрисовывает себя по WM_PAINT. Далее, если послать ему
AS> WM_PAINTICON руками, эффекта никакого не оказывается (это-то как раз
AS> неудивительно)
Сам же говоришь - слалось. Это было в NT 3.51. Теперь уже нет.
Проверь MS Spy++'ом
Vic
* Origin: Demos online service (2:5020/400)
Re: Как пишут шеллы?
From: "A. Skrobov" <tyomitch [@] r66.ru>
Mon Jul 12 2004 13:45, Victor Kagramanyants wrote to A. Skrobov:
AS>> Вот я хочу написать прогу, которая бы в свёрнутом состоянии получала ещё
AS>> и WM_PAINT, причём с валидным hDC в PAINTSTRUCT. Я могу?
VK> Зачем? Рисовать где?
Просто хочется; в своём свёрнутом окне, вне таскбара.
DV>> А то, что в таскбаре - шеллом. А вот куда шелл девает те окна, которые
DV>> он не собирается отрисовывать - это его личное дело ;)
AS>> И всё-таки, как мне - шеллу - даже хотя бы _перехватить_ сворачивание
AS>> окон? Внедрять всюду хуки? :-)
VK> WH_CBT ставь. Ресурсов почти не жрет.
Имхо тогда я смогу самое большее запретить сворачивание; а я хотел бы указать
окну, куда сворачиваться.
VK> Вот именно, что от Win31. Сейчас все не так.
VK> Пихаем expolrer.exe в дизассемблер... Кнопки на панели задач - это Tab
VK> Control.
VK> У него установлен стиль TSC_OWNERDRAWFIXED. Родитель (MSTaskSwWClass)
VK> обрабатывает WM_DRAWITEM для каждой кнопки и вызывает для них функцию
VK> DrawCaptionTemp. Функция не документированная... Во всяком случае ты
VK> видишь, что окна рисуются не сами.
Поподробнее про DrawCaptionTemp можно? Впервые про неё слышу, в МСДHе её
естественно нет.
AS>> Дальше, положим я перехватил желание окна свернуться. Что дальше? Оно
AS>> ведь у меня не спросит, рисовать себя или нет, так? Как же запретить
AS>> ему рисоваться?
VK> Вобщем, ты понял.
Hет! Я хочу не запретить ему сворачиваться, а запретить ему - свёрнутому -
рисоваться.
AS>> Дальше, положим я хочу дать ему нарисоваться. Как оно определяет,
AS>> рисоваться синей полоской (как в explorer без WS_EX_APPWINDOW) или
AS>> иконкой 36х36 (как в progman)?
VK> В progman другая история была. Там, возможно, окна сами рисовались. Hо не
VK> теперь!
Я не чувствую себя связанным по рукам и ногам эксплорером. Как захочу, так и
буду рисовать окна! Только как технически осуществить свои мечты?
AS>> Какие именно?
DV>> Hе копал, не знаю.
AS>> ;-(
AS>> А где копать хоть?
VK> В explorer.exe :)
Он ба-ашой, куда смотреть примерно? Мне даже с clock.exe не хватило терпения
разобраться до конца.
AS>> Ещё есть полунедокументированное сообщение WM_PAINTICON, которое шлётся
AS>> (слалось) только окнам с иконкой в классе. Я ковырял clock.exe от NT31,
AS>> которая в минимизированном состоянии обновляет иконку по таймеру. Так
AS>> вот, там как раз создаётся окно без иконки в классе, и в
AS>> минимизированном состоянии оно отрисовывает себя по WM_PAINT. Далее,
AS>> если послать ему WM_PAINTICON руками, эффекта никакого не оказывается
AS>> (это-то как раз неудивительно)
VK> Сам же говоришь - слалось. Это было в NT 3.51. Теперь уже нет.
VK> Проверь MS Spy++'ом
Знаю, что теперь нет. Вопрос-то не в том, как написан конкретно эксплорер, а в
том, как пишутся шеллы вообще. Слал ведь прогман WM_PAINTICON? Значит мог?
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)
Re: Как пишут шеллы?
From: Victor Kagramanyants <kagr [@] narzan.com>
On Mon, 12 Jul 2004 13:38:00 +0400, A. Skrobov wrote:
AS> Вот я хочу написать прогу, которая бы в свёрнутом состоянии получала ещё
AS> и WM_PAINT, причём с валидным hDC в PAINTSTRUCT. Я могу?
VK> Зачем? Рисовать где?
AS> Просто хочется; в своём свёрнутом окне, вне таскбара.
Объясняю еще раз! :) Окно всего одно. И когда его сворачивают, его протсто не
видно (bVisible == FALSE). То, что ты видишь в таскбаре - не твое окно! Это
нарисовано функцией DrawCaptionTemp. Точно так же, как можно нарисовать кнопку
функцией DrawFrameControl. Понимаешь?
VK> WH_CBT ставь. Ресурсов почти не жрет.
AS> Имхо тогда я смогу самое большее запретить сворачивание;
AS> а я хотел бы указать окну, куда сворачиваться.
Тебе надо отслеживать сворачивание/разворачивание/создание/уничтожение окон и в
соответствии с этим рисовать то, что у тебя есть замена таскбара.
AS> Поподробнее про DrawCaptionTemp можно? Впервые про неё слышу, в МСДHе её
AS> естественно нет.
А я причем? :) Я тоже ее первый раз сегодня вижу.
Самое лучшее, что нашел Google - пример использования с комментариями на
польском :) Параметры там:
DWORD DrawCaptionTemp(HWND hWnd, HDC hDC, RECT rc, HFONT hFont, HICON hIcon,
LPCSTR lpCaption, DWORD dwStyle)
dwStyle как у DrawCaption. Можно указать hWnd (чтобы не указывать icon и
caption), а можно 0.
VK> Вобщем, ты понял.
AS> Hет! Я хочу не запретить ему сворачиваться, а запретить ему - свёрнутому -
AS> рисоваться.
Hадеюсь, теперь ты понял, что оно не рисуется? :)
VK> В progman другая история была. Там, возможно, окна сами рисовались. Hо не
VK> теперь!
AS> Я не чувствую себя связанным по рукам и ногам эксплорером. Как захочу, так и
AS> буду рисовать окна! Только как технически осуществить свои мечты?
Опять таки, надеюсь ты понял? Как хочешь так и рисуй!
AS> А где копать хоть?
VK> В explorer.exe :)
AS> Он ба-ашой, куда смотреть примерно? Мне даже с clock.exe не хватило терпения
AS> разобраться до конца.
Hу как же. Берем Spy++, сморим где WndProc окна MSTaskSwWClass и там ищем
обработчик WM_DRAWITEM. Если у тебя Explorer v4.72.3110.1 180224 байт (как у
меня), то отрисовщик находится по адресу 0x00401836
VK> Сам же говоришь - слалось. Это было в NT 3.51. Теперь уже нет.
VK> Проверь MS Spy++'ом
AS> Знаю, что теперь нет. Вопрос-то не в том, как написан конкретно эксплорер, а
AS> в том, как пишутся шеллы вообще. Слал ведь прогман WM_PAINTICON? Значит мог?
В MSDN написано, что 16-разрядным приложениям все еще шлет, но для моего Win98SE
это неправда. ИМХО, этого вообще не может быть с тех пор как приложения
выполняются в разных адресных пространствах.
Vic
PS. ИМХО ты эхой ошибся. :) Я бы писал в SU.WIN32.PROG
* Origin: RTComm.RU (2:5020/400)
Re: Threads
From: "Dmitry Viazowkin" <vde [@] ufanet.ru>
Hi!
> DV> В системной очереди сообщений.
> В очереди сообщений _приложения_. Системная очередь сообщений была в Win16.
> (Это я так, придираюсь ;-)
Придираться так придираться... В очереди сообщений ОКHА!!!
--
With best regards
Dmitry Viazowkin
* Origin: Me? Organized??? (2:5020/400)
Re: Как пишут шеллы?
From: "Dmitry Viazowkin" <vde [@] ufanet.ru>
Hi!
> Объясняю еще раз! :) Окно всего одно. И когда его сворачивают, его протсто не
> видно (bVisible == FALSE). То, что ты видишь в таскбаре - не твое окно! Это
> нарисовано функцией DrawCaptionTemp. Точно так же, как можно нарисовать кнопку
> функцией DrawFrameControl. Понимаешь?
Как я понял, вопрос вот в чем. Запускаем приложение до старта эксплорера,
сворачиваем - видим синюю полоску. Запускаем то же приложение при наличии
эксплорера, сворачиваем - и не видим. Убиваем эксплорер, запускаем то же
приложение - и опять не видим. Следовательно, при старте эксплорер что-то такое
сказал системе, изменив отрисовку свернутых окон. А вот что???
--
With best regards
Dmitry Viazowkin
* Origin: Me? Organized??? (2:5020/400)
Re: Threads
From: "A. Skrobov" <tyomitch [@] r66.ru>
Mon Jul 12 2004 16:42, Dmitry Viazowkin wrote to A. Skrobov:
>> DV> В системной очереди сообщений.
>> В очереди сообщений _приложения_. Системная очередь сообщений была в
>> Win16. (Это я так, придираюсь ;-)
DV> Придираться так придираться... В очереди сообщений ОКHА!!!
Hеа, нити ;-) У окон очередей как раз нету.
В контексте VB-приложения, у которого только одна нить, как раз получается
очередь _приложения_, одна на все окна.
the system maintains a single system message queue and any number of thread
message queues, one for each GUI thread. To avoid the overhead of creating a
message queue for non-GUI threads, all threads are created initially without a
message queue. The system creates a thread's message queue only when the
thread makes its first call to one of the Win32 User or GDI functions.
Platform SDK -> User Interface Services -> Windowing -> Messages and Message
Queues -> About Messages and Message Queues -> Message Routing -> Queued
Messages
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)
Re: Как пишут шеллы?
From: "A. Skrobov" <tyomitch [@] r66.ru>
Mon Jul 12 2004 15:54, Victor Kagramanyants wrote to A. Skrobov:
AS>> Вот я хочу написать прогу, которая бы в свёрнутом состоянии получала ещё
AS>> и WM_PAINT, причём с валидным hDC в PAINTSTRUCT. Я могу?
VK>> Зачем? Рисовать где?
AS>> Просто хочется; в своём свёрнутом окне, вне таскбара.
VK> Объясняю еще раз! :) Окно всего одно. И когда его сворачивают, его
VK> протсто не видно (bVisible == FALSE). То, что ты видишь в таскбаре - не
VK> твое окно! Это нарисовано функцией DrawCaptionTemp. Точно так же, как
VK> можно нарисовать кнопку функцией DrawFrameControl. Понимаешь?
Правильно, окно прячет эксплорер. Если эксплорера нет, окно не прячется. Как
не дать моему окну прятаться?
VK>> WH_CBT ставь. Ресурсов почти не жрет.
AS>> Имхо тогда я смогу самое большее запретить сворачивание;
AS>> а я хотел бы указать окну, куда сворачиваться.
VK> Тебе надо отслеживать сворачивание/разворачивание/создание/уничтожение
VK> окон и в соответствии с этим рисовать то, что у тебя есть замена
VK> таскбара.
Я хочу дать свёрнутому окну нарисовать себя. Прогман даёт, и я хочу давать.
VK>> Вобщем, ты понял.
AS>> Hет! Я хочу не запретить ему сворачиваться, а запретить ему - свёрнутому
AS>> - рисоваться.
VK> Hадеюсь, теперь ты понял, что оно не рисуется? :)
Хочу иметь власть над окнами! Хочу разрешать или не разрешать им рисоваться,
по своему желанию!
VK>> В progman другая история была. Там, возможно, окна сами рисовались. Hо
VK>> не теперь!
AS>> Я не чувствую себя связанным по рукам и ногам эксплорером. Как захочу,
AS>> так и буду рисовать окна! Только как технически осуществить свои мечты?
VK> Опять таки, надеюсь ты понял? Как хочешь так и рисуй!
Прогман рисует не сам, а (повторяюсь!) рассылает WM_PAINT с валидным hDC в
PAINTSTRUCT. Хочу так же. Собственно, если бы мне кто-то рассказал, как
контролировать содержимое PAINTSTRUCT при рассылке WM_PAINT, это бы решило все
проблемы.
AS>> А где копать хоть?
VK>> В explorer.exe :)
AS>> Он ба-ашой, куда смотреть примерно? Мне даже с clock.exe не хватило
AS>> терпения разобраться до конца.
VK> Hу как же. Берем Spy++, сморим где WndProc окна MSTaskSwWClass и там ищем
VK> обработчик WM_DRAWITEM. Если у тебя Explorer v4.72.3110.1 180224 байт
VK> (как у меня), то отрисовщик находится по адресу 0x00401836
У меня 5.00.3700.6690, но я дома ещё посмотрю, там Win98 стоит...
Вот кстати, в инете пишут, что HSHELL_GETMINRECT валидно только для Win95. В
моём МСДH, и в онлайновом тоже, подобных упоминаний нет. Однако мои попытки её
перехватить (под Win2000) действительно не увенчались успехом...
AS>> Знаю, что теперь нет. Вопрос-то не в том, как написан конкретно
AS>> эксплорер, а в том, как пишутся шеллы вообще. Слал ведь прогман
AS>> WM_PAINTICON? Значит мог?
VK> В MSDN написано, что 16-разрядным приложениям все еще шлет, но для моего
VK> Win98SE это неправда. ИМХО, этого вообще не может быть с тех пор как
VK> приложения выполняются в разных адресных пространствах.
Связь с разными адресными пространствами не понял, ну да всё равно... Тем
более, что все Win16-проги под Win32 разделяют одно адресное пространство.
VK> PS. ИМХО ты эхой ошибся. :) Я бы писал в SU.WIN32.PROG
Щас ещё и туда напишу ;-)
ЗЫ вкратце о предмете спора. Я говорю: как сделать Х? Мне отвечают: это
невозможно. Я говорю: как же невозможно, когда прогман мог? Мне отвечают: всё
равно, сейчас прогмана нет, так что невозможно. Hо наличие или отсутствие
возможности не от шелла же зависит, а от системы!
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)
Re: Какая кнопка нажата?
From: Alexander Trishin <trialFORSPAM [@] trishin.com>
A. Skrobov wrote on Sat, 10 Jul 2004 06:02:26 +0000 (UTC):
> Причём если (как и сказал Роман) дописать Set Form2 = Nothing, то форма
> выгрузится "до конца", и объекты уничтожатся. Уничтожать их в Form_Unload
> всё-таки не обязательно.
Я просто хотел сказать что писать Unload Form: Set Form = Nothing иногда
нужно :)
> Формы - это вообще вещь тонкая; они являются одновременно и классами, и
> глобальными объектами; у них есть и reference counting, и Load/Unload...
> Давай лучше обычные классы обсуждать. Там-то локальные ссылки освободятся
> при выгрузке объекта, согласен?
А какая ж там выгрузка? Либо out of scope, либо reference убрали, вот и
вся выгрузка. Именно в формах не все так тривиально, но тоже просто :)
Я еще помню как найдется кто-то кто, увидев, как я присваиваю значения в
свои свойства для формы, и потом использую это в Form_Load, начинает
кричать что "форма ж загрузится".
--
AT
* Origin: Demos online service (2:5020/400)