December 2008

Uwaga! Informacje na tej stronie mają ponad 3 lata. Nadal je udostępniam, ale prawdopodobnie nie odzwierciedlają one mojej aktualnej wiedzy ani przekonań.

14:54
Mon
29
Dec 2008

Visual Studio - Find/Command Box

Find/Command Box to przydatna funkcja Visual Studio. Ma postać pola edycyjnego na pasku narzędzi u góry. Może służyć do wyszukiwania tekstu w dokumencie bez otwierania okienka Ctrl+F, ale ma też więcej funkcji. Na przykład wpisanie tam hasła i wciśnięcie F1 otwiera pomoc. Wpisanie tam numeru linii i wciśnięcie Ctrl+G przenosi do tej linii.

Z kolei wpisanie tam znaku ">" i dalej polecenia (lub jego skrótu) wraz z parametrami powoduje wykonanie polecenia Visual Studio. W ten sposób można na przykład szybko i wygodnie otworzyć plik (polecenie "File.OpenFile" lub w skrócie "of"). Zobacz: Lista poleceń przyjmujących parametry, Lista skróconych aliasów do poleceń.

Okienko to można aktywować skrótem Ctrl+D lub Ctrl+/ (ten drugi wpisuje od razu znak ">").

Visual Studio - Find/Command Box

Comments (0) | Tags: visual studio gui | Author: Adam Sawicki | Share

20:05
Sun
21
Dec 2008

Programowanie równoległe #2

Kontynuując temat Programowanie równoległe #1... Czego można się uczyć dalej? Ostatnio czytałem sobie o funkcjach typu InterlockedIncrement czy InterlockedCompareExhange. Wygląda na to, że na niższym poziomie synchronizacja sprowadza się do dwóch problemów - do zapewnienia, że dana operacja jest atomowa oraz do wymuszenia pożądanej kolejności operacji na pamięci (plus synchronizacja cache).

Atomowy w programie 32-bitowym jest zapis i odczyt wyrównanej wartości 32-bitowej. Atomowe są operacje wykonywane przez funkcje WinAPI Interlocked* czy też funkcje Compiler Intrinsics - _Interlocked*. Atomowość zapewniamy też stosując muteksy (sekcje krytyczne).

Z kolei co do pamięci, tutaj pojawiają się takie problemy: zarówno kompilator podczas generowania kodu maszynowego, jak i procesor podczas jego wykonywania może przestawiać kolejność operacji używających dostępu do pamięci. Żeby temu zapobiec, trzeba używać tzw. barier (Memory Barrier). Są trzy rodzaje - o semantice Acquire, Release lub obydwie jednocześnie. Można je wykonywać funkcjami Intrinsic - _ReadBarrier, _WriteBarrier, _ReadWriteBarrier. Systemowe obiekty synchronizujące oraz funkcje Interlocked automatycznie wykonują barierę (choć na innych platformach wcale tak być nie musi).

Ciekawie w tej sytuacji wygląda kwestia słowa kluczowego volatile. Ogólnie pisząc, jego użycie nie zapewnia bezpieczeństwa. Ono powoduje tylko, że kompilator za każdym razem sięga po wartość w pamięci zamiast buforować ją w rejestrach, a począwszy od Visual C++ 2005 dodatkowo wstawia barierę pamięciową (odpowiednio, przy odczycie taką o semantyce Acquire, a przy zapisie taką o semantyce Release).

Tych "niskopoziomowych" mechanizmów używa się do realizacji algorytmów tzw. lock-free (lockless, Non-blocking synchronization czy jak tam to jeszcze inaczej nazwać). Z tych z kolei można budować różne struktury danych. Ten temat, jak również temat tworzenia jednych obiektów synchronizujących za pomocą innych, postaram się opisać wkrótce...

Comments (0) | Tags: algorithms | Author: Adam Sawicki | Share

21:58
Wed
17
Dec 2008

Professional Developers Conference 2008

PDC - Professional Developers Conference to konferencja firmy Microsoft. Dla niektórych to nie nowość, bo tegoroczna edycja odbyła się 27-30 października 2008, ale ja dziś właśnie przeglądałem sobie prezentacje z tego wydarzenia, dostępne na stronie PDC 2008 / Agenda / Sessions. Jest tam w sumie 207 sesji, z których do większości można pobrać prezentację PPTX. Wykłady dotyczą głównie "biznesowo-bazodanowych" technologii Microsoftu, jak .NET, SQL Server, ADO, ASP itp.

Ci którzy kodują w bardziej tradycyjnych technologiach też mogą jednak znaleźć tam ciekawe rzeczy. Moją uwagę zwróciły m.in. informacje na temat co nowego pojawi się w kolejnych wersjach produktów firmy, jak .NET Framework 4.0 czy Visual Studio 10. Widać, że Microsoft żywiołowo idzie do przodu i rozwija swoje oprogramowanie zgodnie z nowoczesnymi trendami. Pojawią się fajne narzędzia, biblioteki oraz rozszerzenia języków programowania (C++, C#) wspierające programowanie równoległe. C# stanie się bardziej dynamiczny. Samo IDE natomiast otrzyma nowe możliwości, m.in. będzie mogło wyświetlać minimapkę z kodu, taką o jakiej zawsze marzyłem i jaką opisałem kiedyś wśród swoich pomysłów :)

Comments (0) | Tags: visual studio .net c++ windows events gui | Author: Adam Sawicki | Share

12:34
Sun
07
Dec 2008

Programowanie równoległe #1

Programowanie równoległe to w czasach wielordzeniowych procesorów ważna sprawa i warto zainwestować w naukę tej dziedziny. Jakich konkretnie rzeczy można użyć, żeby coś mogło się wykonywać równolegle do głównego kodu programu? Opcji jest bardzo wiele. Postanowiłem zebrać je do kupy.

Zacząć można od czegoś prostego, co nie wymaga od nas tworzenia nowych wątków. Równolegle pracują niektóre biblioteki, np. DirectX wykonując polecenia na karcie graficznej w swoim tempie albo FMOD odtwarzając muzykę w tle. Ponadto w sposób asynchroniczny (nieblokujący) mogą działać gniazda sieciowe (Socket) oraz systemowe wejście/wyjście, np. odczytywanie i zapisywanie plików (Overlapped I/O).

Wykonywać jakąś pracę równolegle mogą osobne procesy (Process). W WinAPI nie ma wprawdzie funkcji fork, ale można odpalić nowy proces funkcją CreateProcess. Procesy mogą komunikować się na różne sposoby, np. przez przechwytywanie swojego konsolowego wejścia-wyjścia, przez sockety, Named Pipe, RPC, Shared Memory albo przez specjalne biblioteki, jak MPI.

Najczęściej najlepszy sposób na zrównoleglenie programu to tworzenie nowych wątków (ang. Thread) w ramach jednego procesu. Wątki współdzielą pamięć programu i inne jego zasoby. Pozostaje problem synchronizacji, który rozwiązuje się za pomocą dostępnych w systemie obiektów synchronizujących. W Windows są to m.in.: sekcje krytyczne (Critical Section), muteksy (Mutex), semafory (Semaphore) i zdarzenia (Event).

Windows Vista dodaje nowe przydatne obiekty, jak zmienna warunkowa (Condition Variable), jednokrotna inicjalizacja (One-Time Initialization) czy Reader/Writer Lock (SRW) - ale kto ograniczałby dla nich swój program tylko do porażkowego Windowsa Vista? :)

Linuksowy interfejs pthreads ma inne obiekty synchronizujące - muteksy, zmienne warunkowe, semafory. Swoją drogą, nie wiem jak linuksowcy radzą sobie bez czekania na wiele obiektów na raz, tak jak w WinAPI robi się to funkcją WaitForMultipleObjects.

Do programowania wielowątkowego można też używać nie API systemowego, ale dodatkowych bibliotek. Wieloplatformową nakładką na interfejs wątków jest np. Boost.Thread. Programowanie równoległe na wyższym poziomie zapewnia darmowa biblioteka Intel Threading Building Blocks. Ciekawą opcją jest też OpenMP, którego stosowanie polega na wpisywaniu dykrektyw #pragma omp. Niestety, wspierają go tylko niektóre kompilatory, np. Visual C++ wyłącznie w wersji Professional i Team System.

Idąc dalej, ciekawe są też funkcje z grupy Interlocked, bariery pamięciowe (Memory Barrier) oraz algorytmy lock-free. Ale to już temat na osobną notkę... W komentarzach możecie wpisywać, czego jeszcze warto się uczyć w tej dziedzinie i skąd najlepiej się tego uczyć.

Comments (0) | Tags: algorithms | Author: Adam Sawicki | Share

22:16
Wed
03
Dec 2008

Visual C++ z wiersza poleceń

Jeśli chcemy, żeby kompilacja projektu Visual C++ była częścią jakiegoś większego procesu wsadowego, można odpalić kompilator z wiersza poleceń, z odpowiednimi parametrami. Służy do tego plik devenv.com. Składnię jego przełączników można znaleźć w MSDN w rozdziale Devenv Command Line Switches. Na przykład uruchomienie kompilacji projektu wygląda tak:

devenv.com MojaSolucja.sln /Build Debug /Project MojSilnik.vcproj

Comments (0) | Tags: visual studio tools | Author: Adam Sawicki | Share

20:46
Mon
01
Dec 2008

Ciekawe struktury danych

Ucząc się programowania gier każdy w pewnym momencie trafia na techniki podziału przestrzeni. Najczęściej opisywane są drzewa BSP, Octree itp. Tymczasem świat struktur danych - bardziej lub mniej związanych z programowaniem gier - jest bardzo bogaty, różnorodny i ciekawy.

Ot choćby Bloom filter - struktura, która wbrew nazwie nie ma nic wspólnego z popularnym efektem graficznym Bloom, ale służy do przechowywania zbioru elementów i testowania przynależności do zbioru (np. w słownikach sprawdzania pisowni). Ostatnio dowiedziałem się też o istnieniu drzew R-tree (pozdro Robert!), które opisują hierarchię boksów otaczających i działają podobnie do drzew B-tree (stosowanych np. w systemach plików i bazach danych).

Zaimplementować samemu taką strukturę danych na pewno nie jest łatwo, ale warto chociaż poczytać o nich na Wikipedii :)

Comments (0) | Tags: algorithms | Author: Adam Sawicki | Share

STAT NO AD [Stat] [Admin] [STAT NO AD] [pub] [Mirror] Copyright © 2004-2017 Adam Sawicki
Copyright © 2004-2017 Adam Sawicki