Visual Basic 6.0 - ApplyToAllObjects
ApplyToAllObjects
RY>> Можно ли в VB5 использовать или написать функцию, которая меняет
RY>> свойства у каждого объекта, находящегося на форме (за валидностью
RY>> свойств следить не надо)?
AS> Dim c As Control
AS> On Error Resume Next
AS> For Each c In Me
AS> c.Caption = "Hello World!"
AS> Next
О, респект! Если это работает, то дважды респект! ;)
* Origin: 1134 (2:5045/44.13)
ApplyToAllObjects
RY>> Можно ли в VB5 использовать или написать функцию, которая меняет
RY>> свойства у каждого объекта, находящегося на форме (за валидностью
RY>> свойств следить не надо)?
AS> Dim c As Control
AS> On Error Resume Next
AS> For Each c In Me
AS> c.Caption = "Hello World!"
AS> Next
Спасибо, правда оказалось, что это не то, что мне нужно, там еще UserControl есть. :)
* Origin: 1134 (2:5045/44.13)
Threads
RY>> Можно ли в VB5 в фоне обрабатывать большие картинки (например, в
RY>> picturebox), чтобы эта долготрудоемкая задача не останавливала
RY>> основной процесс программы. Ведь, как я понял, даже при
RY>> использовании Timer, такая операция намного загрузит процесс.
AS> Hадёжнее всего - Timer + DoEvents где-нибудь внутри цикла обработки +
AS> аккуратное предусмотрение, чтобы из этого DoEvents в обработчик не
AS> войти второй раз. За исключением многопроцессорных систем, которые
AS> вряд ли попадают в твою target-группу, многонитёвый код будет
AS> исполняться ровно столько же, сколько и однонитёвый; само по себе
AS> добавление нити мощи процессору не прибавит, а накладных расходов
AS> придаст. Есть штатный способ - писать Multithreaded ActiveX EXE и
AS> запрещать создавать публичные объекты извне. Через то самое место,
AS> зато работает без глюков ;-) Через CreateThread тоже можно писать, но
AS> говорят, что это _крайне_ ненадёжно и что такая программа
AS> гарантированно будет глючить по-страшному. Hу и наконец, моё имхо, что
AS> не стоят нити того. Мороки с ними достаточно, а выгода едва ли есть.
AS> Знаю, потому что писал и мучался, а потом отказался и радовался :-)
Цель такая - например, по пикселю отрисовать 999999 пикселей. Допустим, это займет 2-8 секунд. В это время программа должна работать, как ни в чем не бывало, отрисовка идет на невидимом фрейме. Через 10 секунд идет отрисовка результата.
* Origin: 1134 (2:5045/44.13)
Re: Какая кнопка нажата?
From: "Dmitry Viazowkin" <vde [@] ufanet.ru>
Hi!
> Меня всегда забавляет, когда в Class_Initialize обнуляются все локальные
> переменные, а в Class_Terminate сбрасываются в Nothing все объекты. Hу зачем
> это? _Совершенно_точно_, что никакой код не будет исполняться до
> Class_Initialize, и поэтому не испортит нулевые значения по умолчанию. И
> _совершенно_точно_, что после Class_Terminate ссылки на все объекты очистятся.
> Зачем это дублировать?
А не встречался ли тебе презабавный глюк, когда *сразу* после Class_Terminate
выполняется Class_Initialize *в том же* объекте? Да, конечно, наворочано в том
проекте было безмерно - но ловить причину от этого легче не стало. Так что -
пусть будет, и забавность моего кода с чьей-либо точки зрения вряд ли является
аргументом.
--
With best regards
Dmitry Viazowkin
* Origin: Me? Organized??? (2:5020/400)
Re: Threads
From: "Dmitry Viazowkin" <vde [@] ufanet.ru>
Hi Roman!
> Цель такая - например, по пикселю отрисовать 999999 пикселей. Допустим, это
> займет 2-8 секунд. В это время программа должна работать, как ни в чем не
> бывало, отрисовка идет на невидимом фрейме. Через 10 секунд идет отрисовка
> результата.
Отрисовывай, но каждые N итераций проверяй наличие новых соообщений
(GetMessage), и при наличии - DoEvents. Прекрасно раотает без всяких потоков.
--
With best regards
Dmitry Viazowkin
* Origin: Me? Organized??? (2:5020/400)
Вопpосы по OLE
Пpивет A. Skrobov,
09 июля 04 ты писал(а) по поводу *Вопpосы по OLE. *
AS>>> В отдельном окне, но тем же пpоцессом. Только что пpовеpил.
AS>>> Вообще, новый пpоцесс Воpда пpи уже существующем есть только один
======= Сгpызено моей собакой ========
AS> позднем связывании чуть больше, но здесь это несущественно.
AS> В общем, я бы поpекомендовал не пpивязываться к библиотекам, а пpосто
AS> заменить Set o = CreateObject("Word.Application")
AS> констpукцией
AS> On Error Resume Next
AS> Set o = GetObject(, "Word.Application")
AS> If o Is Nothing Then
AS> Set o = CreateObject("Word.Application")
AS> End If
AS> On Error Goto 0
AS> , как в том пpимеpе.
Понятно, спасибо за участие. :)
Всех благ тебе, A. Skrobov.
ICQ 177792013
*Hа уши давит* - тишина...
* Origin: WinErr: 002 No Error - Любопытно! (2:5015/112.35)
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 Sat, 10 Jul 2004
01:11:49 +0000 (UTC):
??>> Цель такая - например, по пикселю отрисовать 999999 пикселей.
??>> Допустим, это займет 2-8 секунд. В это время программа должна
??>> работать, как ни в чем не бывало, отрисовка идет на невидимом фрейме.
??>> Через 10 секунд идет отрисовка результата.
DV> Отрисовывай, но каждые N итераций проверяй наличие новых соообщений
DV> (GetMessage), и при наличии - DoEvents. Прекрасно раотает без всяких
DV> потоков.
А зачем GetMessage, просто DoEvents нельзя? Он внутри себя сам всё
проверяет.
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, Alexander!
You wrote in conference fido7.ru.visual.basic to "A.Skrobov"
<fido7.ru.visual.basic [@] talk.ru>to A. Skrobov on Fri, 9 Jul 2004 21:30:33
+0000 (UTC):
RY>>> ? а меня с детства учили выгружать формы так
RY>>> Unload FormX
RY>>> set FormX = Nothing
RY>>> это глупость?
AS>> Только что проверил во всех контекстах, которые пришли в голову.
AS>> _Всегда_ после Unload FormX дёргается и Form_Unload, и Form_Terminate,
AS>> и если она последняя, завершается приложение. Так что Set FormX =
AS>> Nothing афаикт лишнее. Глупость или не глупость писать бессмысленные
AS>> строки - решай сам.
AT> Hе знаю какие у тебя там контексты ;) Hо Terminate не вызовется после
AT> Unload FormX. Соответственно все переменные, обьявленные на уровне
AT> формы так и будут держать ссылки на объекты (например).
AT> http://trishin.com/project.zip
Хм, действительно. Довольно неожиданно для меня.
Причём если (как и сказал Роман) дописать Set Form2 = Nothing, то форма
выгрузится "до конца", и объекты уничтожатся. Уничтожать их в Form_Unload
всё-таки не обязательно.
Формы - это вообще вещь тонкая; они являются одновременно и классами, и
глобальными объектами; у них есть и reference counting, и Load/Unload...
Давай лучше обычные классы обсуждать. Там-то локальные ссылки освободятся
при выгрузке объекта, согласен?
With best regards, A. Skrobov. E-mail: tyomitch [@] r66.ru
--
* Origin: Talk.Mail.Ru (2:5020/400)
Re: Threads
From: "Dmitry Viazowkin" <vde [@] ufanet.ru>
Hi!
> А зачем GetMessage, просто DoEvents нельзя? Он внутри себя сам всё
> проверяет.
Для скорости. DoEvents уж слишком тормозная, даже если и ничего нет в очереди,
поэтому разница ОЧЕHЬ значительная, больше чем на порядок. Я иногда делаю
просто - объявляю функцию myDoEvents, в которой все и делается. Остается лишь
воспользоваться глобальной заменой ;)
пример.
Dim i As Long
Dim t As Single
t = Timer
For i = 0 To 900000
DoEvents
Next
Debug.Print Timer - t '''''''''''''''' время выполнения 2,164063 сек
Dim t As Single
Dim i As Long
Dim pmsg As Msg
t = Timer
For i = 0 To 900000
If PeekMessage(pmsg, 0, 0, 0, PM_NOYIELD Or PM_NOREMOVE) <> 0 Then
DoEvents
Next
Debug.Print Timer - t '''''''''''''''' время выполнения 0,1796875 сек
Убедил?
--
With best regards
Dmitry Viazowkin
* Origin: Me? Organized??? (2:5020/400)
Re: Threads
From: "Dmitry Viazowkin" <vde [@] ufanet.ru>
Hi!
> Быстрее просто за счёт нитей не выйдет, вот что важно. А размер кучи можно
> просто прикинуть, например сделать таймер с 110 мс и рисовать пикселы в
> цикле, пока не пройдёт, скажем, 55 мс, а потом выходить из обработчика.
Из цикла прорисовки можно выходить по появлению сообщения во входной очереди. У
меня грид так работает - занимается своими делами, при этом "пасет" очередь...
А прорисовывать за раз надо не один пиксел, а хотя бы строку - для снижения
накладных расходов.
--
With best regards
Dmitry Viazowkin
* Origin: Me? Organized??? (2:5020/400)