Главная страница
Навигация по странице:

  • ADD IN Resource Editor

  • Related Docu ments

  • LoadResPicture , LoadResData , LoadResString

  • MyPic

  • Variant

  • State

  • GenericGlobalCounter .State = 2

  • UpdateDisplay

  • GenericGlobalCounter

  • TotalIncrements

  • Form1

  • Add a long

  • ActiveX EXE

  • Леонтьев Б.К. Я изучаю Microsoft Office Visio 2003 (PDF). Удк 004. 738. 5 Ббк 32. 973. 26 018. 2


    Скачать 0.88 Mb.
    НазваниеУдк 004. 738. 5 Ббк 32. 973. 26 018. 2
    АнкорЛеонтьев Б.К. Я изучаю Microsoft Office Visio 2003 (PDF).pdf
    Дата25.04.2017
    Размер0.88 Mb.
    Формат файлаpdf
    Имя файлаЛеонтьев Б.К. Я изучаю Microsoft Office Visio 2003 (PDF).pdf
    ТипДокументы
    #4822
    КатегорияИнформатика. Вычислительная техника
    страница31 из 35
    1   ...   27   28   29   30   31   32   33   34   35
    *.exe. Также ресурс файл удобен для показа коро тенькой анимации, когда по таймеру в пикчербоксе меняются 5 6 карти нок. Да и вообще, когда не очень большое количество картинок нужно для использования в проекте, но распространять их как отдельные фай лы не хочется.
    Итак, как же работать с ресурсами? Первое — хорошая новость. В
    VB6 встроен
    ADD IN Resource Editor. Достаточно загрузить этот модуль из
    ADD INs меню и можно легко создавать и редактировать ресурсы.
    Вторая новость для тех, у кого стоит пятый бейсик — этот модуль распро страняется Микрософтом бесплатно, и легко устанавливается.
    После установки этого модуля просто щелкните пару раз мышкой на иконке редактора ресурсов на панели бейсика, и, в открывшемся ок не, легко добавляйте или редактируйте строки, картинки, курсоры,
    иконки, или даже custom resources.
    Использование редактора Visual Basic
    327 328
    Использование редактора Visual Basic

    Несколько тонкостей — каждый добавляемый ресурс имеет наи менование — оно устанавливается автоматически — причем наименова ние может быть номером или строкой. Так вот, автоматически это будет номер. Достать в последствии ресурс можно только зная его наименова ние. И тип этого наименования должен быть соблюден. Второе — доба вив необходимые ресурсы — не забудьте сохранить файл с ними. После этого ссылка на этот файл появится в проекте в разделе
    Related Docu
    ments. Ну и последнее — к сожалению в проекте не может быть более од ного файла ресурсов. Есть еще некоторые ограничения, в частности на длину текста.
    В случае, если вы уже попробовали сделать файл ресурсов, то ко нечно, горите желанием узнать, как их оттуда извлекать. Очень просто. В
    Бейсике уже сидят функции для работы с ними.
    Это
    LoadResPicture, LoadResData, LoadResString.
    Рассмотрим простейший пример загрузки картинки из ресурса в пикчербокс.
    Откройте проект, добавьте в него форму с кнопкой и пикчербок сом, подключите resource editor, и добавьте какую либо картинку, как ресурс. После добавления картинки переименуйте получившийся ре сурс, к примеру в
    MyPic. На Click event на кнопке добавьте:
    Picture1.Picture = LoadResPicture("MyPic", 0)
    Последний аргумент означает, что извлекаемый ресурс — именно битмап картинка. Посмотрите в Help остальные типы извлекаемых ре сурсов. В частности для иконки это будет 1.
    Ну, и напоследок — как же создать отдельный файл, содержащий ресурсы? Опять таки очень просто — создайте компоненту — к примеру
    dll проект, в который добавлен ресурс файл. Для этого надо выбрать тип проекта
    ActiveX DLL, переименовать класс Class1 в MyResource, добавить в этот проект ресурс файл, наполнить его ресурсами и создать функцию:
    Public Function LoadMyPic(ResName As String) As Object
    Set LoadMyPic = LoadResPicture(ResName, 0)
    End Function
    Обратите внимание, картинка — это объект, а не число, или стро ка.
    Variant здесь тоже не подходит. Так же обратите внимание что
    ResName (имя ресурса, ID) может быть как String так и просто номер, од нако номер 1 зарезервирован для иконки проекта.
    Итак, в начале надо отметить ссылку на эту
    DLL. Для этого идем в
    Project

    Referens и кликаем возле имени нашей DLL. После этого в ос новном проекте можно создать переменную:
    Dim obj as new MyResource
    И показать картинку:
    Picture1.Picture = obj.LoadMyPic ("MyPic")
    'любое существующее ID ресурса
    Ну и последнее замечание — так как мы договорились хранить ре сурсы прямо в
    dll файле, то нам не интересно открывать этот проект каж дый раз, когда подзабылись имена ресурсов, сохраненных в этой
    dll.
    Хочется видеть эти имена (а лучше описания) прямо в среде разработки.
    Для этого нужно сделать всего 2 вещи:
    1
    Внутри класса
    MyResource мы объявляем следующее перечисле ние:
    Public Enum MyRecourceIDDescription
    BigRedPicture = 101
    SmollBlueBall= 102
    End Enum
    2
    На форме, в
    General Declaration пишем:
    Dim ResID as MyRecourceIDDescription
    Этим, мы объявляем переменную, принимающую значения толь ко из описанного в классе перечисления.
    Далее, при обращении к этой переменной — к примеру, вот так:
    ResID = ' Вот тут должна появится подсказка, показывающая
    BigRedPicture и SmollBlueBall
    Вызов картинки из нашего файла ресурса легко осуществить так:
    Picture1.Picture = obj.LoadMyPic (ResID )
    И последняя приятная новость. В обжект браузере тоже видны эти самые константы — описания ресурсов.
    Глава 13.
    Потоки
    С появлением оператора
    AddressOf, часть индустрии ПО стала ориентироваться на авторов, показывающих как с использованием Visual
    Basic решать ранее невозможные задачи. Другая часть быстро охватила консультантов, помогающих пользователям, имеющим проблемы при решении таких задач.
    Проблема не в Visual Basic или в технологии. Проблема в том, что большинство авторов применяют одно и тоже правило к
    AddressOf мето
    Использование редактора Visual Basic
    329 330
    Использование редактора Visual Basic
    дикам, что большинство компаний по разработке ПО считают, что если вы должны что то сделать, то вы сможете. Идея о том, что применение самой новой и последней технологии должно, по определению, быть са мым лучшим решением проблемы, широко распространена в индустрии
    ПО. Эта идея неверна. Развертывание технологии должно управляться прежде всего проблемой, которую необходимо решить, а не технологией,
    которую кто то пробует продать.
    Очень плохо, что из за того, что компании часто пренебрегают упоминанием об ограничениях и недостатках их инструментальных средств, авторы иногда бывают не в состоянии обратить внимание чита телей на следствия некоторых методик, которые они описывают. И жур налы и книги иногда пренебрегают своей ответственностью, чтобы удос товериться, что практика программирования, которую они описывают,
    является приемлемой.
    Программисту очень важно выбрать необходимый инструмент для своей работы. Это — ваша задача, чтобы разработать код, который рабо тает теперь не только на одной специфической платформе, но также работает на разных платформах и системных конфигурациях. Ваш код должен быть хорошо документирован и поддержан другими программи стами, участвующими в проекте. Ваш код должен следовать правилам,
    продиктованным операционной системой или стандартами, которые вы используете. Отказ так делать может привести к проблемам в будущем,
    поскольку системы и программное обеспечение постоянно совершенст вуются.
    Каждый, кто использует Windows XP, знает, что система способна выполнять более одного задания одновременно, запускать несколько программ, при проигрывании компакт диска, посылке факса и пересыл ке файлов. Каждый программист знает (или должен знать) что централь ный процессор компьютера может только выполнять одну команду од новременно (проигнорируем существование многопроцессорных машин). Как единственный центральный процессор может выполнять множество задач?
    Это делается быстрым переключением между многими задачами.
    Операционная система содержит в памяти все программы, которые запу щены в настоящий момент. Это позволяет центральному процессору вы полнять программы по очереди. Каждый раз происходит переключение между программами, при этом меняется содержимое внутренних регист ров, включая указатель команды и указатель вершины стека. Каждая из таких «задач» называется потоком выполнения (
    thread of execution).
    В простой многозадачной системе, каждая программа имеет един ственный поток. Это означает, что центральный процессор начинает вы полнение команд в начале программы и продолжает, следуя инструкци ям, в последовательности, определенной программой до тех пор, пока программа не завершается.
    Скажем, программа имеет пять команд: А, B, C, D и E, которые выполняются последовательно (никаких переходов нет в этом примере).
    Когда приложение имеет один поток, команды будут всегда выполнять ся в точно том же самом порядке: A, B, C, D и E. Действительно, цент ральный процессор может потребовать времени для выполнения других команд в других программах, но они не будут влиять на это приложение,
    если не имеется конфликт над общими ресурсами системы, но это уже отдельная тема для разговора.
    Продвинутая многопоточная операционная система типа Win dows позволяет приложению выполнять больше чем один поток одно временно. Скажем, команда D в нашем типовом приложении могла со здать новый поток, который стартовал командой B и далее выполнял последовательность команд C и E. Первый поток был бы все еще A, B, C,
    D, E, но когда команда D выполнится, возникнет новый поток, который выполнит команды B, C, E (здесь команды D уже не будет, иначе мы по лучим еще один поток).
    Другими словами, когда вы начинаете новый поток выполнения в приложении, вы никогда не можете знать точный порядок, в котором ко манды в двух потоках выполнятся относительно друг друга. Два потока полностью независимы.
    Имитатор Многопоточного режима
    Рассмотрим проект
    MTDemo.
    Проект содержит один модуль кода, в котором содержится две глобальных переменных:
    ' MTDemo — Multithreading Demo program
    ' Copyright © 1997 by Desaware Inc. All Rights Reserved
    Option Explicit
    Public GenericGlobalCounter As Long
    Public TotalIncrements As Long
    Этот проект содержит одну форму —
    frmMTDemo1, которая содер жит следующий код:
    ' MTDemo — Multithreading Demo program
    ' Copyright © 1997 by Desaware Inc. All Rights Reserved
    Option Explicit
    Dim State As Integer
    ' State = 0 — Idle
    ' State = 1 — Loading existing value
    ' State = 2 — Adding 1 to existing value
    Использование редактора Visual Basic
    331 332
    Использование редактора Visual Basic

    ' State = 3 — Storing existing value
    ' State = 4 — Extra delay
    Dim Accumulator As Long
    Const OtherCodeDelay = 10
    Private Sub Command1_Click()
    Dim f As New frmMTDemo1
    f.Show
    End Sub
    Private Sub Form_Load()
    Timer1.Interval = 750 + Rnd * 500
    End Sub
    Private Sub Timer1_Timer()
    Static otherdelay&
    Select Case State
    Case 0
    lblOperation = "Idle"
    State = 1
    Case 1
    lblOperation = "Loading Acc"
    Accumulator = GenericGlobalCounter
    State = 2
    Case 2
    lblOperation = "Incrementing"
    Accumulator = Accumulator + 1
    State = 3
    Case 3
    lblOperation = "Storing"
    GenericGlobalCounter = Accumulator
    TotalIncrements = TotalIncrements + 1
    State = 4
    Case 4
    lblOperation = "Generic Code"
    If otherdelay >= OtherCodeDelay Theu State = 0
    otherdelay = 0
    Else otherdelay = otherdelay + 1
    End If
    End Select
    UpdateDisplay
    End Sub
    Public Sub UpdateDisplay()
    lblGlobalCounter = Str$(GenericGlobalCounter)
    lblAccumulator = Str$(Accumulator)
    lblVerification = Str$(TotalIncrements)
    End Sub
    Эта программа для моделирования многопоточного режима ис пользует таймер и простой конечный автомат. Переменная
    State описы вает пять команд, которые эта программа выполняет.
    State = 0 — неактивное состояние.
    State = 1 загружает локальную переменную глобальной перемен ной
    GenericGlobalCounter.
    State = 2 увеличивает на единицу локальную переменную.
    State = 3 запоминает результат в переменной GenericGlobalCounter
    и увеличивает переменную
    TotalIncrements (которая считает количество приращений переменной
    GenericGlobalCounter).
    State = 4 добавляет дополнительную задержку, представляющую собой время, затраченное на выполнение других команд в программе.
    Функция
    UpdateDisplay обновляет три метки на форме, которые показывают текущее значение переменной
    GenericGlobalCounter, ло кального сумматора и общего количества приращений.
    Каждый сигнал таймера моделирует цикл центрального процессо ра в текущем потоке. В случае, если вы запустите программу, то увидите,
    что значение переменной
    GenericGlobalCounter будет всегда точно равно переменной
    TotalIncrements, потому что переменная TotalIncrements по казывает количество увеличений счетчика
    GenericGlobalCounter пото ком.
    Но что случится, когда вы нажимаете кнопку
    Command1 и запусти те второй экземпляр формы? Эта новая форма смоделирует второй по ток.
    Время от времени, команды выстроятся в линию таким образом,
    что обе формы загрузят одинаковое значение
    GenericGlobalCounter, уве личат и сохранят его. В результате, значение счетчика увеличится только на единицу, даже при том, что каждый поток полагал, что он независимо увеличивает значение счетчика. Другими словами, переменная была уве личена дважды, но значение увеличилось только на единицу. В случае,
    если вы запускаете несколько форм, то сразу заметите, что число прира щений, представляемых переменной
    TotalIncrements, растет намного бы стрее, чем счетчик
    GenericGlobalCounter.
    Что, если переменная представляет объектный счет блокировки —
    который следит, когда объект должен быть освобожден? Что, если она представляет собой сигнал, который указывает, что ресурс находится в использовании?
    Использование редактора Visual Basic
    333 334
    Использование редактора Visual Basic

    Такая проблема может привести к появлению ресурсов, постоян но недоступных в системе, к объекту, блокируемому в памяти, или преж девременно освобожденному. Это может привести к сбоям приложения.
    Этот пример был разработан, чтобы достаточно просто увидеть проблему, но попробуйте поэкспериментировать со значением перемен ной
    OtherCodeDelay. Когда опасный код относительно небольшой по сравнению со всей программой, проблемы будут появляться менее часто.
    Хотя это и звучит обнадеживающе, но истина состоит в следующем.
    Проблемы многопоточного режима могут быть чрезвычайно неустойчи вы и их трудно обнаружить. Это означает, что многопоточный режим требует осторожного подхода к проектированию приложения.
    Решение проблем Многопоточного режима
    Имеются два относительно простых способа избежать проблем многопоточного режима. Избегайте всеобщего использования глобаль ных переменных. Добавьте код синхронизации везде, где используются глобальные переменные.
    Первый подход используется в основном в Visual Basic. Когда вы включаете многопоточный режим в Visual Basic приложения, все гло бальные переменные станут локальными для специфического потока.
    Это свойственно способу, с которым Visual Basic выполняет
    apartment
    model threading.
    Visual Basic 6.3 в Microsoft Office Visio 2003 позволяет использовать многопоточность только в компонентах, которые не имели никаких эле ментов пользовательского интерфейса. Так было, потому что они не имели безопасного потока управления формами. Например: когда вы со здаете форму в Visual Basic, VB дает ей имя глобальной переменной (та ким образом, если вы имеете форму, именованную
    Form1, вы можете не посредственно обращаться к ее методам, используя
    Form1 метод вместо того, чтобы объявить отдельную переменную формы). Этот тип глобаль ной переменной может вызывать проблемы многопоточного режима,
    которые вы видели ранее. Имелись несомненно другие проблемы внутри управления формами.
    Почему многопоточность?
    Откуда вся суета относительно многопоточного режима, если он включает так много потенциальной опасности? Потому что в некоторых ситуациях многопоточный режим может значительно повышать эффек тивность приложения. В некоторых случаях это касается некоторых опе раций синхронизации, например ожидание завершения приложения. В
    результате архитектура приложения становится более гибкой. Напри мер, операция
    Add a long в форме MTDEMO2 со следующим кодом:
    Private Sub cmdLongOp_Click()
    Dim l&
    Dim s$
    For l = 1 To 1000000
    s = Chr$(l And &H7F)
    Next l
    End Sub
    Запустите несколько экземпляров формы, используя кнопку
    cmdLaunch1. Когда вы нажимаете на кнопку cmdLongOp на любой из форм, то увидите, что это действие замораживает операции во всех дру гих формах. Так происходит, потому что все формы выполняются в оди ночном потоке, и этот поток занят выполнением длинного цикла. В слу чае, если вы запустите несколько экземпляров формы кнопкой
    cmdLaunch2 и нажмете кнопку cmdLongOp на форму, то только эта форма будет заморожена — другие формы будут активными. Они выполняются в собственных потоках, и длинный цикл будет выполняться только в соб ственном потоке.
    Конечно, в любом случае, лучше не размещать длительные опера ции такого типа в ваших формах.
    Далее приведем краткий список случаев, в которых важен много поточный режим.
    Сервер ActiveX EXE без общих ресурсов
    Если у вас есть
    ActiveX EXE сервер, который вы собираетесь сов местно использовать для нескольких приложений, многопоточный ре жим предотвращает приложения от нежелательных взаимодействий с друг другом. В случае, если одно приложение выполняет длинную опера цию на объекте в однопоточном сервере, другие приложения будут вы теснены, то есть будут ждать, когда освободится сервер. Многопоточный режим решает эту проблему. Однако, имеются случаи, где вы захотите использовать
    ActiveX EXE сервер, чтобы регулировать доступ к общедос тупнному ресурсу (
    shared resource). Например, сервер stock quote выпол няется в одиночном потоке, который доступен для всех приложений, ис пользующих сервер по очереди.
    Многопоточный клиент, выполняемый как ActiveX
    EXE сервер
    Простая форма этого подхода продемонстрирована в приложении
    MTDEMO2. Этот подход используется, когда приложение поддерживает множественные окна, которые должны исходить из одного приложения,
    но работать совершенно независимо. Интернет браузер — хороший при мер такого многопоточного клиента, где каждое окно выполняется в соб
    Использование редактора Visual Basic
    335 336
    Использование редактора Visual Basic
    ственном потоке. Здесь следует обратить внимание на то, что многопо точный режим не должен использоваться как замена для хорошего собы тийно управляемого проекта.
    Многопоточные серверы DLL или EXE
    В архитектуре клиент сервер, многопоточный режим может уве личить эффективность, если вы имеете смесь длинных и коротких кли ентских запросов. Будьте внимательным, хотя — если все ваши клиент ские запросы имеют подобную длину, многопоточный режим может фактически замедлять среднее время ответа сервера! Никогда не прини майте на веру тот факт, что если ваш сервер является многопоточным, то обязательно его эффективность увеличится.
    Соглашение о потоках
    Многопоточный режим является потенциально опасным вообще,
    и особенно при попытках многопоточного кодирования приложений,
    которые не разработаны для поддержки многопоточного режима, скорее всего приведут к фатальным ошибкам и сбоям системы.
    Возможно Visual Basic позволяет создавать объекты и использо вать их с одиночными и многопоточными средами безотносительно к то му, разработаны ли они для одиночного или многопоточного использо вания?
    Другими словами — как многопоточные Visual Basic приложения могут использовать объекты, которые не разработаны для безопасного выполнения в многопоточной среде? Как могут другие многопоточные приложения использовать однопоточные объекты Visual Basic? Как
    1   ...   27   28   29   30   31   32   33   34   35


    написать администратору сайта