vrijdag 11 december 2009

"External exception C0000006" bij app op WLAN

Als je een applicatie maakt dat moet draaien via een WLAN (Wifi), pas dan even op en lees het onderstaande door:

Windows laadt namelijk niet de gehele executable in het geheugen, maar alleen wat hij op dat moment nodig heeft. Als je bijv. op een knop in je applicatie drukt, dan *kan* Windows een nieuw blok bitjes van je applicatie via het netwerk moeten ophalen (of voor een resource (bijv. een icon) bij een nieuw scherm dat je aanmaakt, etc).
Echter, als je via een WLAN werkt, dan kan natuurlijk net je verbinding weg zijn...
Wat er dan gebeurt? Een "External exception C0000006" :-(
Oplossing? Je moet een flag in je exe zetten, die aangeeft dat je vanaf een removeable medium werkt (USB, Wifi, etc) zodat Windows wel alles inlaadt. In Delphi kun je dit in de .dpr doen:
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}

Dit heeft bij mijn huidige klant nogal voor wat hoofdbrekens gezorgd: we kregen deze exceptions op de meest vreemde plaatsen, zonder aanwijsbare bug in de code. Na wat googlen was de oorzaak gauw gevonden en de fix snel gemaakt :-) Zie originele discussie + oplossing:

woensdag 9 december 2009

Windows tijd: in stapjes van 15ms!

Soms wordt je onaangenaam verrast: je meet de tijd van alle SQL queries in je programma met "MillisecondsBetween" en je krijgt als resultaat: 0, 0, 0, en 15ms...

Hmmm, dit is te mooi om waar te zijn, zo snel is MS SQL Server nou ook weer niet! :-)
Er ging bij mij toen wel een lampje branden, ik eens eerder zoiets gezien met "Sleep" en "GetTickCount".

Thread time slices
In Windows (en andere systemen) worden threads 1 voor 1 op een CPU uitgevoerd. Elke thread heeft een "time slice" van 15ms, waarin hij de volledige CPU tot zijn beschikking heeft. Na 15ms breekt Windows de thread af, slaat de inhoud van de CPU registers e.d. op, en laad en start een andere thread ("context switch"). Een "time slice" kun je afbreken door een wait function aan te roepen, zoals "Sleep", "WaitForSingleObject", etc. Op deze manier kan een andere thread de kostbare CPU tijd gebruiken.


Consequenties
De default time slice van 15ms heeft nogal wat consequenties voor het programmeren: zo gaat een "Sleep(1)" niet 1ms wachten, maar 10 - 15ms! (afhankelijk van andere threads etc). Maar ook andere tijd functies zoals "GetTickCount", "Now" (Delphi) of "GetLocalTime" (Windows) werken in stapjes van 15ms!

Nauwkeurige tijdmeting
Gelukkig zijn er andere manieren om het aantal ms te bepalen:
  • hardware timer gebruiken: met QueryPerformanceFrequency + QueryPerformanceCounter kun je met micro en nano secondes werken!
  • kortere "time slice" instellen met "timeBeginPeriod", bijv een time slice van 1ms met "timeBeginPeriod(1)". Dit heeft echter wel nadelen: veel meer context switches, dus meer overhead!
Zelf heb ik andere "Now" functie in Delphi geschreven, die op basis van QueryPerformanceCounter etc werkt (dan werkt alles in 1x op de ms nauwkeurig, of zelfs op de micro seconde).
Ik vervang ("detour") de oude "Now" functie door mijn "NowExact" door middel van "KOLDetours.pas":
OldNow := KOLDetours.InterceptCreate(@Now, @NowExact);
Anekdote
Ik heb eens bij een bedrijf de RS232 communicatie met een PLC flink versneld: in een loopje werd na elke ontvangen character een "Sleep(1)" aangeroepen. Dit heb ik met een factor 10 versneld door pas na een lege character een "Sleep(1)" te doen, en die door middel van "timeBeginPeriod(1)" ook echt 1ms wacht ipv 10 to 15ms!

vrijdag 23 oktober 2009

Gratis internetbellen!

Tegenwoordig begint internetbellen steeds meer in te komen: goedkoop bellen via internet. Dit in navolging van het succes van Skype op de PC: hiermee kun je gratis onderling bellen, en met soort prepaid kun je ook bellen naar vaste toestellen. Internetbellen is een soort Skype, maar dan met de gewone telefooon en zonder dat je een PC met headset nodig hebt :-). De meeste (alle?) providers hebben tegenwoordig wel een "Internet + bellen" abonnement, ook wel bekend als "SIP" en "Voip" (Voice over IP). Voor een vast bedrag per maand kun je dan gratis naar andere Voip gebruikers bellen (net als Skype) en met een goedkoper tarief naar gewone vast telefoon.

Problemen met Voip

Het is echter niet geheel zonder problemen! Van verschillende mensen hoor ik allerlei verhalen over: slechte bereikbaarheid, irritante echo, niet naar buiten kunnen bellen, bel die niet over gaat, etc. Zowieso ben je volledig afhankelijk van het internet: storing van ADSL of provider? Dan kun je niet bellen... (gelukkig gebeurt dit niet zo vaak, maar wel af en toe).
Daarnaast zit je vast aan een vrij duur abbo (minimaal 30 euro per maand) en moet je nog steeds per tik betalen.

Ik wil het ook...

Toen ik echter laatst de rekening van KPN (vaste telefoon) kreeg, ging ik toch wel even nadenken: dit is toch wel vrij duur voor dat beetje bellen van ons. Nu zou ik ook wel internetbellen willen, maar dan zonder de bovengenoemde problemen. In ieder geval wil ik mijn vaste lijn nog gewoon houden en niet afhankelijk zijn van een bepaalde provider.

Oplossing

Na wat zoeken kwam ik tot een hele mooie oplossing: een kastje van Linksys (SPA 3102, 60 euro) + een online Voip account (bijv. VoipBuster.com) (30 euro per jaar) = gratis bellen! Nou ja, helemaal gratis is 30 euro per jaar natuurlijk niet, maar het is een stuk goedkoper dan normale providers en je betaalt niet meer per tik (dus "gratis" :-) ).
Je sluit het kastje (bijv. Linksys SPA 3102) aan op het internet (bijv ADSL router) EN (!) op je vaste KPN telefoonlijn. Je normale telefoon sluit je uiteraard weer op het kastje aan. Je kunt nu gewoon gebeld worden via de vaste lijn, en als de stroom uitvalt, wordt automatisch overgeschakeld op de vaste lijn (je kunt dus ten alle tijde bellen en gebeld worden via de vaste lijn!). Vervolgens kun je via de webinterface van het kastje de accountgegevens van bijvoorbeeld VoipBuster.com invullen. Vanaf dat moment kun je met je normale telefoon via internet bellen! Daarnaast kun je nog dmv een "dialplan" instellen dat als je bijv. een # voor de telefoonnummer draait, hij via vaste telefoonlijn belt. De Linksys SPA 3102 heeft trouwens onnoemlijk veel instellingen! Je kunt bijvoorbeeld de voltage van de telefoonlijn, de frequentie van de kiestoon instellen etc etc etc. Gelukkig staat default de meeste instellingen gewoon goed :-). Voor een goede uitleg: zie deze handleiding.

Kortom: op deze manier kun je zelf je "internetbellen" c.q. "Voip" regelen, waarbij je onafhankelijk bent van een (duur) abbo bij een provider, en altijd kunt bellen en gebeld worden via de oude vertrouwde KPN telefoonlijn.

Opmerkingen

Zelf gebruik ik VoipDiscount.com (zelfde als VoipBuster maar dan andere tarieven...). Voor 10 euro prepaid kun je 120 dagen gratis bellen (Fair use policy: 300 minuten (5uur) per week). Dus met 3 * 10 euro kun je een heel jaar "gratis" bellen. Alleen naar vast (inclusief sommige buitenlanden) is gratis, naar mobiel is niet gratis (en daar verdienen ze weer op). Er zijn verschillende "betamax" klonen en andere providers: vergelijk eerst de tarieven en voorwaarden (bijv goedkoper bellen naar mobiel maar dan maar 90 ipv 120 "free days").
Van de 10 euro beltegoed heb ik voor 1 euro (!) een nederlands nummer aangevraagd (ander netnummer etc maar goed voor 1 euro mag je niet klagen). Dit is een normaal nummer waarop andere mensen mij ook kunnen bellen: hebben ze ook Voip dan bellen ze gratis (net als bij Skype). Oftewel: men kan mij bellen via 2 nummers: via voip en via kpn :-).
Je kunt ook helemaal overstappen op voip: bij oa Budgetphone.nl kun je je huidige KPN nummer laten overnemen voor 10 euro per jaar (per maand nog wel 10 euro linesharing aan KPN betalen ivm ADSL?).

maandag 7 september 2009

Delphi 2010, Coderage + SDN

Delphi 2010 released!

Vlak na de preview van Delphi 2010 (zie mijn vorige post), verscheen al de RTM versie en is het officieel released. Ondertussen zijn er verschillende interessante blogs verschenen, waarbij verschillende verbeteringen verder uitgelegd worden. Ik zal niet alle verbeteringen bespreken, maar een paar uitlichten. (P.S: zie ook de complete "reviewers" guide!)

Uitgebreide online wiki help (!)
Na de Delphi Prism Wiki is de hele RAD Studio via een mooie online wiki te doorzoeken. Bijvoorbeeld voor het complete overzicht van alle verbeteringen in de 2010 versie:

Voor een handig beginpunt:

Maar ook de complete Delphi Language Guide is beschikbaar, evenals bijvoorbeeld de VCL, etc.

Class constructors
Een mooie uitbreiding (wat nog niet zo nadrukkelijk genoemd is), is de ondersteuning van Class Constructors (net als .Net)

Een voorbeeld hoe je het kunt gebruiken:

RTTI (a la .Net reflection)
Verder is de RTTI sterk verbeterd, meer object georiënteerd zoals .Net Reflection werkt, zonder allerlei pointers, records, etc.

Class attributes
Zoals je ziet, zijn in D2010 verschillende .Net technieken verwerkt. Nu heeft Delphi ook ondersteuning voor class attributes:

TStopwatch
Nog een kleine maar handige uitbreiding is de TStopwacht, voor het meten van tijden (hoe lang een stuk code duurt etc):

Andere handigheidjes:

Datasnap (multitier):

IDE & Source Code:

DBX: Firebird + alle sourcecode (!)
Wat ik zelf erg mooi vind, is de native ondersteuning van de open source database Firebird (compatible (?) met Interbase). Maar ook dat de broncode van alle drivers meegeleverd wordt! Niet alleen van DBX, maar ook (eindelijk!) van Midas.dll (oa bekend van TClientdataset).

Extra's
De eerste extra functies en fixes van "andy" zijn al verschenen voor D2010:

TPL (Task Parallel Library) voor Delphi (!)

Laatst is er een interessante dotNed meeting geweest bij DTS/4DotNet over TPL voor .Net. Gelukkig bestaat voor Delphi zoiets dergelijks al een poosje:

CodeRage 4 & SDN Conference

dinsdag 18 augustus 2009

Delphi 2010 Preview!

Op de site van Codegear/Embarcadero is vorige week de Delphi 2010 Preview Center verschenen: Nog 7 dagen, 2 uur, 31 minuten (and counting…) en dan is het zover.
Delphi 2010 belooft de beste Delphi release ooit te worden, met veelbelovende nieuwe features en verbeteringen! Zoals (Multi)Touch, Mouse Gestures, IDE Insight (alles (!) vinden in 1 scherm), background compilation, verbeterde debugger (oa threads), verbeterde RTTI (.Net Reflection!), class attributes, Direct2d canvas (Win7), etc etc.

Bekijk onder andere deze video eens:

Vervolgens zijn er op de Codegear blog een groot aantal artikelen hierover verschenen:

Niet minder interessant zijn de blog artikelen van de “Wings of wind” blog!:

Een ander blog had een leuk artikel over een andere (kleine) verbetering mbt API wrappers:

1 ding is zeker: ze zijn bij Codegear/Embarcadero druk bezig met Delphi! De toekomst zag met al het .Net geweld er somber uit, maar de zon schijnt achter de wolken. Wat betreft “native code” versus “managed/.Net code” vond ik de volgende gedeelte van de blog van Pawel Glowacki wel mooi:

Tim Anderson in his post “Native code makes a comeback – except it never away” has some good points on this subject as well. The very good example why native code continues to be important is new Windows 7 Direct2D graphics. I like the quote from MSDN Magazine June 2009 issue “Introducing Direct2D” where author sums it up:

(…) if you want to develop high-performance and high-quality commercial applications, you’ll still look to C++ and native code to deliver that power. (…)

That is why Delphi and C++Builder developers are not looking to move away from native to managed code.

maandag 25 mei 2009

Random Things #6

Er is de laatste tijd weer genoeg nieuws te melden. Deze keer over nieuwe zoekmachines, PopupMode, gratis Blaise Pascal Magazine editie, MonoDevelop op Mac & Windows, Delphi Prism May 2009 met AOP(!) en VS2010 met .Net 4.0 met PFX.

Zoekmethoden:

RemObjects SDK:

  • In de volgende release wordt het Remoting Framework uitgebreide met ZeroConf+ voor service discovery.
  • En met Olympia kan eenvoudig "scalable server farms" gemaakt worden met "load balancing" en "fail over".

Delphi:

Visual Studio:

Delphi Prism:

Mono:

Axum in Visual Studio:

  • Axum is een .Net taal. waarmee veilige parallelle software gemakkelijk gemaakt kan worden.
  • Een korte uitleg is hier beschikbaar, en de demo film is ook interessant.

The Future of Delphi!

Laatst sprak ik klant, en die vroeg mij over de toekomst van Delphi. Ik kon toen daar geen goed antwoord op geven. De huidige Delphi 2007 en 2009 zijn mooie en goede versies, maar daarna?
Deze week was de Delphi Live! 2009 conferentie, waarin veel nieuwe en interessante sessies waren, en waar open en vrij over gesproken werd. 1 ding is duidelijk als je kijkt naar roadmap: Embarcadero investeert flink in Delphi! Daarnaast is het team uitgebreid, en ondanks de crisis: “the business is healty”. Kortom: de toekomst ziet er zonnig uit :-).

Na de “serieuze” disclaimer :-) werden de sessies gehouden. Hieronder een overzicht van de vele onderdelen:

  • Project Weaver
    • Main Themes
      • User Experience
      • Enhance Connectivity
      • Documentation
    • IDE usability
    • Team Productivity
    • Touch (demo film) en MultiTouch (demo film) (!)
    • IDE – Insight (easy Keyboard access to almost everything) (demo film)
    • Improvements to DataSnap
    • Firebird Support
    • .NET AOP
    • SCM Support (oa Subversion)
    • Enhanced RTTI Support (á la .Net reflection!)
    • Attribute Support (!, Win32 AOP?)
    • Seamless .NET <> Native communication
    • Windows 7 APIs and Direct2D Canvas (demo film) (demo aan film einde)
    • Mouse gestures (demo film)
    • Full Support of SOAP 1.2 Clients
  • Project X(!)
    • Cross-platform Windows, Mac OS, and Linux (demo aan film einde)
    • Cross-platform component library
    • DataSnap on all platforms
  • Project Chromium, Quality, Quality
    • Quality, Quality, Quality
    • Pascal Code Formatter (demo film)
    • Documentation of the OTA
    • New Data binding model allowing binding to almost any property on a control (á la .Net DataBinding?)
    • More integration with the database tools.
  • Project Commodore
    • 64 Bit native (!)
    • Full compiler, RTL and VCL support for 64 native
    • Multi-Core. Multi-threaded applications.

Tot slot nog een samenvatting en bespreking van dag 2 en dag 3 (!) door Marco Cantu, een overzicht van Pawel Glowacki en de Delphi Live! 2009 Recap and Product Address.

Edit: er zijn nog meer video’s beschikbaar gekomen: