Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Podobne dokumenty
Przykład powyżej pokazuje, że w zapytaniu można umieszczać funkcje zarówno zdefiniowane w ramach środowiska, jak również własne.

Instrukcje cykliczne (pętle) WHILE...END WHILE

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Pętle. Programowanie komputerowe

LibreOffice Calc VBA

01 grid tablica grid. Copyright 2017, mgr inż. Janusz Bonarowski 1

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Zadanie. Menu Plik niech posiada dwie pozycje: Tekstowy i Excel, a każda z nich niech posiada dwie pozycje Otwórz i Zapisz, patrz rys. 2.

Pętle. for, while, do... while, foreach. Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.

Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle.

Platforma.NET laboratorium 1. Visual Basic.NET podstawowe elementy języka. Wykonanie warunkowe If End If

Materiały do laboratorium MS ACCESS BASIC

SZYBKO ZROZUMIEĆ VISUAL BASIC 2012 Artur Niewiarowski -

Ćwiczenie VB3.4 Struktura Try...Catch, obiekt Err, metoda Err.Raise (Strukturalna obsługa wyjątków)

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Programowanie w języku Python. Grażyna Koba

Java Podstawy. Michał Bereta

Układy VLSI Bramki 1.0

Liczby losowe i pętla while w języku Python

Aplikacje geodezyjne

Pętle instrukcje powtórzeo

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Visual Basic Debugging and Error Handling

Wprowadzenie do programowania w VBA

Technologia informacyjna programowanie Janusz Uriasz

Klasa bazowa i klasy potomne - doskonalenie umiejtnoci projektowania i wykorzystania klas (45 min)

Class1.vb. _Dlugosc_stopnia = value End Set End Property Public Property Faza As Single Get Return _Faza End Get

Pętle. Dodał Administrator niedziela, 14 marzec :27

Instrukcja laboratoryjna nr.4

2. Kliknij Insert->Userform. Jeżeli Toolbox nie pojawi się automatycznie, kliknij View -> Toolbox. Otrzymany widok powinien być jak poniżej.

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Instrukcje sterujące. Programowanie komputerowe

Visual Basic for Applications. Wstęp

Plik->Opcje->Zakladka Główne->Dostosuj Wstążkę Zaznaczamy kwadracik Developer na liscie po prawej stronie. Klikamy OK.

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 2. Programowanie komputerowe

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

while (test) instrukcja; int i=0; while (i<10) i++; dopóki test prawdziwy wykonuj instrukcję Wykonano: 35% / \ fałsz test prawda instrukcja

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe

Rozdzia l 3. Laboratorium 3. danych zawierajac

msgbox("akcja: Początek, argument: " + argument.tostring()); Thread.Sleep(1000); //opóźnienie msgbox("akcja: Koniec"); return DateTime.Now.

Programowanie w VB Proste algorytmy sortowania

Podstawy Programowania C++

Ćwiczenie laboratoryjne. Oprogramowanie i badanie stosu lub kolejki w środowisku Visual Basic 2005

Ilość cyfr liczby naturalnej

3 Delegacje. 3.1 Tworzenie delegacji. 3.2 Skojarzenie delegacji z procedurą czy funkcją

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Delphi Laboratorium 3

DataGridView. Aby dodawać kolumny wybieramy z listy zadań Add Column..., co wywoła okno dodawania kolumn, rys. 2. Rysunek 1

Podstawy Programowania Podstawowa składnia języka C++

Programowanie w Turbo Pascal

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

Tablice, DataGridView

Program szkoleniowy. 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS

Przedmiot: Informatyka w inżynierii produkcji Forma: Laboratorium Temat: Zadanie 5. MessageBox, InputBox, instrukcja Select Case i instrukcje pętli.

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Tablice. Jones Stygar na tropie zmiennych

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Procedury i funkcje. Programowanie komputerowe

2. W oknie dialogowym Choose Toolbox Items w zakładce.net Framework Components naciskamy przycisk Browse...

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

1. Indeksy/indeksowanie : Do elementów wektora, list, macierzy czy ramek, można się odwołać na kilka sposobów.

Automatyzacja pracy w AutoCAD

Wskazówki dotyczące zmiennych, tablic i procedur 1

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Technologie cyfrowe. Artur Kalinowski. Zakład Cząstek i Oddziaływań Fundamentalnych Pasteura 5, pokój 4.15

Makropolecenia w PowerPoint Spis treści

Opis implementacji: Implementacja przedstawia Grę w życie jako przykład prostej symulacji opartej na automatach.

Wstęp do programowania

Podstawy programowania. Ćwiczenie. Pojęcia bazowe. Języki programowania. Środowisko programowania Visual Studio

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Ten odcinek Akademii PC Kuriera poświęcony zostanie tworzeniu i wykorzystaniu funkcji i procedur w języku Visual Basic.NET.

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

PHP: bloki kodu, tablice, obiekty i formularze

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

Zapis algorytmów: schematy blokowe i pseudokod 1

Wstęp do Informatyki dla bioinformatyków

Visual Basic: Tablice, sortowanie, r. ak. 2014/2015

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Instrukcja laboratoryjna cz.3

KOTLIN. Język programowania dla Androida

1 Wprowadzenie do algorytmiki

Informatyka II. Laboratorium Aplikacja okienkowa

Wstęp do programowania

Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku.

Właściwości i metody obiektu Comment Właściwości

2.8. Algorytmy, schematy, programy

Tworzenie aplikacji w języku Java

1. Wyświetlić wszystkie liczby zawarte w tablicy tabl(). 2. Wyświetlić wyłącznie liczby ujemne zawarte w tablicy tabl().

2.1 Funkcje - na przykładzie wyceny europejskiej

Materiały pomocnicze do zajęć z przedmiotu Projekt ADP

Arkusze kalkulacyjne i VBA

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 3. Programowanie komputerowe

Programowanie obiektowe

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

Algorytmy i struktury danych

ECDL Podstawy programowania Sylabus - wersja 1.0

15. Funkcje i procedury składowane PL/SQL

Transkrypt:

Obliczenia równoległe w Microsoft Visual Basic Środowisko Microsoft Visual Studio 2010 i nowsze umożliwia zrównoleglenie obliczeń na wiele rdzeni procesorów. Służą do tego odpowiednie metody dostępne wraz z Framework 4.0 i nowszym. Przed rozpoczęciem tworzenia aplikacji umożliwiającej obliczenia równoległe, należy zaimportować odpowiednią przestrzeń nazw (będzie łatwiej odwoływać się do metod, kod poniżej). Imports System.Threading.Tasks Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Import przestrzeni nazw: System.Threading.Tasks Poniżej przedstawione zostaną z sposób ogólny dwie istotne funkcje: Parallel.For oraz Parallel.ForEach 1. Wykonanie każdej sekwencji poleceń przez osobny wątek jest równoważne z pojedynczą iteracją tych pętli. Pętla For Poniżej znajdują się przykłady z wykorzystaniem pętli Parallel.For. Imports System.Threading.Tasks Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Parallel.For(0, 3, Sub(x) MsgBox("Wywołany numer iteracji: " & x) End Sub End Class Użycie pętli Parallel.For 1 Funkcje pętli można wywoływać również bez odwoływania się do klasy Parallel. Należy w tym celu zaimportować ścieżkę: System.Threading.Tasks.Parallel.

Efekt użycia pętli Parallel.For dla powyższego kodu Powyższe okienka pojawiły się naraz w kolejności: 1, 0, 2. Po powtórnym wykonaniu kodu ta kolejność może być inna. Nie oznacza to jednak, że iteracja nie przebiegała w kolejności od zera do dwóch lub, że przebiegła. Uzależnione jest to m.in. od czasu wykonania kodu, ale nie tylko. Przykład poniżej przedstawia efekt tego zjawiska. Parallel.For(0, 3, Sub(x) Użycie pętli Parallel.For If x = 0 Then Threading.Thread.Sleep(2000) MsgBox("Wywołany numer iteracji: " & x & ", czas: " & Now.Hour & ":" & Now.Minute & ":" & Now.Second) Komunikat iteracji numer 0, pojawił się ostatni, ponieważ najdłużej trwało wykonanie kodu w tej iteracji zastosowanie funkcji Sleep() Pętla Parallel.For przyjmuje w argumentach następujące wartości: wartość początkową, wartość końcową (której nie osiąga 2 ), procedurę która zostanie wywołana odpowiednio dla poszczególnych rdzeni. Pierwszym parametrem 2 Jeżeli K oznacza parametr wartości końcowej pętli, to pętla osiągnie K-1 iterację.

wchodzącym do procedury jest numer iteracji (typ Integer). Drugim parametrem jest obiekt typu System.Threading.Tasks.ParallelLoopState32 umożliwiający korzystanie z dodatkowych opcji zarządzających pętlą. Przykłady poniżej prezentują kilka z nich. Parallel.For(0, 8, Sub(x, k) If x = 4 Then k.break() While k.lowestbreakiteration Is Nothing : End While MessageBox.Show("Informacja z iteracji nr " & x & _ ". Przerwano pętlę z iteracji nr " _ & k.lowestbreakiteration, "Przerwanie pętli", MessageBoxButtons.OK) Przykład użycia funkcji Break() i zmiennej LowestBreakIteration Funkcja Break() wywołana ze zmiennej k 3 przerywa działanie pętli po wykonaniu iteracji, w której ma miejsce wywołanie funkcji przerwania. Zmienna LowestBreakIteration umożliwia odczytanie najniższego numeru iteracji, z której nastąpiło przerwanie. Parallel.For(0, 3, Sub(x, k) k.stop() If k.isexceptional Then MsgBox("Wystąpił błąd", MsgBoxStyle.Critical) If k.isstopped Then MsgBox("Pętla została zatrzymana", vbinformation) MsgBox("Numer iteracji: " & x, vbinformation) Przykład użycia funkcji Stop() i zmiennych: IsStopped, IsExceptional Funkcja Stop() również zatrzymuje działanie pętli. Różnice pomiędzy obiema metodami są następujące: Break() nie pozwala na uruchomienie się iteracji wyższej od tej, w której została wywołana funkcja. Jeżeli iteracja numer 40 wywoła funkcję Break(), to numery dalsze iteracji 41,42,... nie zostaną wywołane, jednak niższe numery tak. Stop() nie pozwala na uruchomienie kolejnych iteracji niezależnie od ich numerów. Jeżeli istnieje potrzeba przerwania wykonującej się już iteracji, 3 Nazwy zmiennych (x i k) użyte w omawianych funkcjach mogą posiadać również inne nazwy zależy to od programisty.

można użyć zmiennej IsStopped (odpowiednio sprawdzając jej wartość logiczną) umieszczonej w wykonującej się iteracji. Ważną zmienną w pętli, jest zmienna IsExceptional, dzięki której istnieje możliwość sprawdzenia, czy w którejś z iteracji nie wystąpił nieprzechwycony błąd (wyjątek). Jeżeli wartość zmiennej wynosi True, to oznacza, że wystąpił. W takim przypadku w działającej pętli można podjąć odpowiednie kroki. Zamiast umiejscowienia procedury w trzecim parametrze można również wprowadzić adres procedury zadeklarowanej w innym miejscu w projekcie. Procedura, która jest wywoływana musi przyjmować parametr określający numer iteracji. Sub Proc(x As Integer) Console.WriteLine("Numer iteracji: " & x) End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Parallel.For(0, 3, AddressOf Proc) End Sub Wywołanie procedury przez pętlę Parallel.For. Przekazanie adresu procedury

Pętla ForEach Kolejnym typem pętli służącej do zrównoleglenia obliczeń jest pętla Parallel.ForEach. Zasadnicza kwestia wykorzystania pętli jest taka sama jak pętli Parallel.For, natomiast sposób jej działania jest trochę inny. Dim tabl() As Integer = {3, 6, 9} Parallel.ForEach(tabl, Sub(w As Integer, k As ParallelLoopState, x As Long) Console.WriteLine("Wartość tabl(" & x & "): " & w _ & ". Numer iteracji: " & k.tostring) Przykład użycia pętli Parallel.ForEach Każda iteracja pętli wykonywana jest dla poszczególnych elementów tablicy (kolekcji). Za pośrednictwem pierwszego argumentu przekazanego do procedury istnieje możliwość pobrania wartości (zmienna w) elementu tablicy o indeksie równym numerze iteracji (zmienna x). Zmienna k umożliwia wykonywanie tych samych metod, co w przykładzie pętli Parallel.For. Środowisko umożliwia również sprawdzenie powodzenia wykonania pętli (dotyczy to obu omówionych pętli). Służy do tego zmienna typu: System.Threading.Tasks.ParallelLoopResult. Dim tabl() As Integer = {3, 6, 9} Dim wynik As ParallelLoopResult wynik = Parallel.ForEach(tabl, Sub(w, k, x) If wynik.iscompleted = False Then Console.WriteLine("Przerwano w iteracji nr: " & wynik.lowestbreakiteration) Else Console.WriteLine("Pętla wykonała się z powodzeniem!") End If Przykład sprawdzenia poprawności wykonania się pętli Jeżeli wartość zmiennej IsCompleted jest równa True to oznacza, że wykonywanie pętli zakończyło się powodzeniem. W przeciwnym wypadku zmienna przybierze wartość False. Ponadto istnieje możliwość pobrania wartości iteracji, w której nastąpiło wywołanie przerwania.

Problem dostępu do wspólnych danych Podczas budowy programów, w których do danej zmiennej ma dostęp w jednym czasie wiele wątków może powodować liczne błędy obliczeniowe jeżeli program zostanie źle napisany (tj. bez uwzględnienia charakteru obliczeń współbieżnych/równoległych). Kod poniżej jest przykładem błędnie napisanego programu. Dim zmienna As Integer = 0 Parallel.For(0, 2, Sub(x) If x = 0 Then For c = 1 To 500 : zmienna = zmienna + 1 : Next Else For c = 1 To 500 : zmienna = zmienna - 1 : Next End If Console.WriteLine("Zmienna wynosi: " & zmienna) Przykład błędnie napisanego programu Na pierwszy rzut oka ostatecznym wynikiem zwracanym w zmiennej zmienna powinna być wartość 0, gdyż pierwszy wątek inkrementuje wartość o jeden 500 razy, a drugi w tej samej chwili obniża wartość o jeden również 500 razy. Ostatecznie wynik może być inny. Poniżej znajduje się lista wyników, powstała poprzez wielokrotne uruchomienie po sobie procedury zawierającej powyższy kod. Zmienna wynosi: 11 Zmienna wynosi: -97 Zmienna wynosi: -3 Dlaczego tak się dzieje? Wyobraźmy sobie sytuację, w której mamy po jednej pechowej iteracji w każdym wątku, tzn. równolegle wykonywane są instrukcje: zmienna + 1 (wątek x=0) oraz zmienna 1 (wątek x=1), a następnie równolegle przypisywana jest nowa obliczona wartość do zmiennej zmienna, tzn.: zmienna = (wątek x=0) oraz zmienna = (wątek x=1). Jeżeli przyjmiemy, że wartość początkowa zmiennej wynosiła 0 (przed uruchomieniem obu iteracji), to po zakończeniu obu iteracji, wartość zmiennej będzie wynosiła: -1 lub 1, a nie 0! Problem można rozwiązać na kilka sposobów, np. poprzez sekcję krytyczną, o której będzie mowa w rozdziale poświęconym wątkom (jednakże ten sposób jest mniej efektywny i po części wypacza ideę obliczeń współbieżnych/równoległych) albo poprzez użycie tablicy, tak jak w przykładzie poniżej.

Dim zmienna() As Integer = {0, 0} Parallel.For(0, 2, Sub(x) If x = 0 Then For c = 1 To 500 : zmienna(x) = zmienna(x) + 1 : Next Else For c = 1 To 500 : zmienna(x) = zmienna(x) - 1 : Next End If Console.WriteLine("Zmienna wynosi: " & zmienna.sum) Przykład poprawnie napisanego programu w ramach omawianego problemu Artur Niewiarowski Wydział Fizyki, Matematyki i Informatyki Politechnika Krakowska Kraków 2014