Современные решения

для защиты Windows приложений

и восстановления исходного кода

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)