Обсуждение программирования на Visual Basic в конференции ru.visual.basic
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" 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" 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" Hello, Dmitry! You wrote in conference fido7.ru.visual.basic to "Roman Yuakovlev" 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" Hello, Alexander! You wrote in conference fido7.ru.visual.basic to "A.Skrobov" +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" 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" Hi! > Быстрее просто за счёт нитей не выйдет, вот что важно. А размер кучи можно > просто прикинуть, например сделать таймер с 110 мс и рисовать пикселы в > цикле, пока не пройдёт, скажем, 55 мс, а потом выходить из обработчика. Из цикла прорисовки можно выходить по появлению сообщения во входной очереди. У меня грид так работает - занимается своими делами, при этом "пасет" очередь... А прорисовывать за раз надо не один пиксел, а хотя бы строку - для снижения накладных расходов. -- With best regards Dmitry Viazowkin * Origin: Me? Organized??? (2:5020/400) |