Interlocked Class

Stanąłem dziś przed następującym problemem. Wewnątrz klasy incrementuję, zeruję liczniki. Z zewnątrz natomiast czytam właściwość ProgressValue które oblicza wartość na podstawie liczników. Chodzi tutaj o postęp ProgressBar’a danej operacji. Jest to przykład gdzie można użyć class’y Interlocked. Oczywiście możemy też synchronizować za pomocą lock’ów, powoduje to jednak duży narzut zbędnego kodu jak i późniejszego wykonywania.
Deklaracja licznika

private int _counterA;

Operacja

_counterA++;

dzieli sie na 3 kroki (zgodnie z MSDN):

  1. Load a value from an instance variable into a register.
  2. Increment or decrement the value.
  3. Store the value in the instance variable.

Jeśli więc nasza operacja odczytu wstrzeli się w środek to dostaniemy nieaktualne dane. Sama operacja odczytu danych 32 bitowych jest już atomiczna i nie musimy korzystać z klasy Interlocked. Jest to zresztą powód dla którego brak funkcji Read(ref int32). Jest za to funkcja Read(ref long), której powinniśmy używać na maszynach 32 bitowych gdyż wtedy ta operacja nie jest atomiczna.

        public int ProgressValue
        {
            get
            {
                return _counterA; // * ... (some operations);
            }
        }

Oczywiście przykład jest przejaskrawiony i w tym przypadku nic by się nie stało gdyby korzystać ze zwykłej incrementacji (cała operacja wykonuje się w jednym wątku). Jeśli jednak operacja byłaby wielowątkowa wtedy Interlocked.Increment() zdecydowanie się przydaje.

WIX (Windows Installer XML)

Tytułowe narzędzie jest lepsze od np standardowego Windows Installera gdy trzeba bardziej się dobrać do konfiguracji. Będzię potrzebne częste patchowanie.
Pierwsze dwa tutoriale z Codeproject
Nie kompilowało się więc dodałem wpis „ICE08;ICE09;ICE32;ICE61” do pola Project->Properties->Tool Settings->Supress specific ICE validation. Działa dobrze bez tego.
Najistotniejsze informacje to jak ustawić bitmape oraz tekst licencji:
WixUIDialogBmp=bigback.bmp
WixUILicenseRtf=GPL3.rtf
Najciekawsze artykuły o Upgrades and modularization
Niemiłym problemem jest:

For some strange reason, small updates and minor upgrades cannot be run simply by clicking on the .msi file—they give the error: „Another version of this product is already installed.” We know, stupid… Anyway, you have to start it with the command:

msiexec /i SampleUpgrade.msi REINSTALL=ALL REINSTALLMODE=vomus
Don’t ask me how this would fare with the average user… You’d better start it from an Autorun.inf file or devise an outer Setup.exe shell to launch it.

Gra nad którą obecnię pracuję ma kilkanaście tysięcy plików w różnych katalogach. Dla każdego katalogu musi być osobny Component a co za tym idzie i GUID. Nie można tego obejść ponieważ właśnie tak to ma być robione.

SQLite (dla NHibernate)

Podczas nauki Fluent NHibernate (i pewnie nie tylko) podczas pisania Unit testów przydaje się lekka wersja bazy danych (właśnie SQLite).

Przydatne dwa linki:

  • SQLite ADO.Net provider http://sqlite.phxsoftware.com – Podczas instalacji zaznaczyć aby nie rejestrować tych bibliotek DLL.
    Dlaczego? Po prostu lepiej włączyć je do projektu i zaznaczyć „Copy always”. Nie zgubimy ich gdy przeniesiemy program na inną maszynę.
  • SQLite Administrator http://sqliteadmin.orbmu2k.de – do edytowania rekordów w pliku z bazą

Najciekawsze artykuły do nauki

Poniższe artykuły skłoniły mnie do pisania sobie Bloga, do obserwowania najlepszych polskich blogerów, subscrybowania RSS polskich i zagranicznych serwisów i pewnie jeszcze kilku rzeczy.

jak-szukac-informacji-jak-zadawac-pytania

Jak uczyć się C#?

Jak uczyć się C#, programować i innych takich?

Wszystkie z bloga http://maciej-progtech.blogspot.com/

Jeszcze nie wykonałem zadania domowego do końca…

Słownik angielski

race condition – hazard
affinity – powinowactwo
Processor affinity – koligacja procesorów

Dispose pattern

DG Update: Dispose, Finalization, and Resource Management
Jedyny jak dla mnie artykuł, jak obchodzić się ze sprzątaniem po obiektach które korzystają z zewnętrznych zasobów (połączenia do bazy, sockety, obiekty GDI+, handlery systemu operacyjnego, pliki itp). Dzięki Hubert!

Dodane:
Lżejszy artykuł na ten sam temat