XSt„ng av har kostat mig mycket tankem”da, d† det faktiskt inte „r dokumenterat vad som h„nder under en normal avst„ngning.

OS/2 har normalt tv† olika avst„ngnings API:

Problemet „r att det finns ingen funktion "mellan" dessa tv†. Om du kallar p† DosShutdown sparas inte Skrivbordsdata. Och om du kallar WinShutdownSystem s† f†r du den vanliga avst„ngningen utan n†gon ytterligare chans att ingripa. S† jag tvingades att skriva om ett komplett nytt WinShutdownSystem. Det var ganska sv†rt, eftersom IBM knappt f”rklarat n†got om vad som verkligen h„nder under WinShutdownSystem.

Notera: I XFolder delar "Ut”kad Avst„ngning" och "Omstarta Skrivbord" samma kod; de bara skiljer sig i vad som h„nder efter det att alla f”nster har st„ngts. Jag kommer d„rf”r anv„nda termen "XSt„ng av" i f”ljande f”rklaringar f”r b†da funktionerna om inte annat anges.

XSt„ng av „r integrerat i Skrivbordet och litar starkt p† XFolderklass ers„ttningar. Jag har avsiktligt inte satt XSt„ng av koden i en separat .EXE fil av tv† sk„l: f”r det f”rsta XSt„ng av beh”ver tillg†ng till Skrivbordets interna data, som „r bara tillg„ngligt fr†n SOM sammanhanget; f”r det andra vill jag f”rhindra folk fr†n att anv„nda XSt„ng av separat utan att ha XFolderklasserna installerade, d„rf”r detta skulle allvarligt kunna skada Skrivbordet.  XSt„ng av litar till XFldObjekt ers„ttningsklassen och XFolder tr†d Worker, som tillsammans h†ller reda p† Skrivbordets interna data.

F”r att f”rst† vad XSt„ng av g”r „r det n”dv„ndigt att f”rst† hur Skrivbordet hanterar sina objekt internt. Varje objekt som blir relevant f”r Skrivbordet, genom att ing† i en mapp, fr†ga om dess inst„llningar, starta ett program eller vad som helst, „r -- med Skrivbords terminologi -- "v„ckt" av systemet, vilket inneb„r att det existerar som ett SOM objekt i minnet.

Skrivbordet placerar bara mycket s„llan objekt tillbaka i s”mn, fast„n det skulle fris„tta associerat minne och lagra objektets data tillbaka till h†rddisken. Detta har tv† konsekvenser:

  1.  Det finns alltid m†nga fler v„ckta objekt i ditt system „n du kan f”rest„lla dig, d„rf”r att de flesta „r osynliga. Žven efter st„ngning av en ”ppen mapp „r objekten d„rinne fortfarande v„ckta. Det snabbar p† fyllningen av mappen n„r den ”ppnas n„sta g†ng. D„rf”r „ter Skrivbordet mer och mer av ditt minne med varje mapp du ”ppnar.(Om du sl†r p† loggfilen f”r XSt„ng av, kan du se hur m†nga v„ckta objekt som r„ddades genom XSt„ng av. Ofta flera hundra objekt „ven om XSt„ng av inte r„ddar alla v„ckta objekt utan bara avkomlingar av WPFolder och WPAbstract. P† "Interna" sidan i Skrivbordets inst„llningsblock (Obs! Ej Skrivbord objektet) kan du se hur m†nga objekt som „r v„ckta).
  2. En „ndring i objektets data har ibland bara effekt p† SOM objektet i minnet, men „r inte alltid sparat till h†rddisken eller OS2.INI/OS2SYS.INI. Skrivbordet kan d„rf”r f† problem om du g”r stora f”r„ndringar, som att flytta en mapp med m†nga abstrakta objekt och inte st„nga av korrekt: den fysiska datafilen p† h†rddisken och Skrivbordets registrering skiljer sig d†.
Detta „r vad XSt„ng av beh”ver XFldObject klasserna till, som ers„tter WPObject. Varje g†ng ett objekt v„cks anropar Skrivbordet flera metoder (bland dem wpInitData och wpObjectReady). XFldObject ”verskuggar dessa och skickar objektadressen i minnet till Worker tr†den, som sedan uppdaterar XFolders interna lista ”ver alla v„ckta objekt. S† vitt jag vet, finns det inget annat s„tt att avg”ra vilka objekt som „r v„ckta; i alla fall finns det ingen dokumenterad API f”r att r„kna dem.

N„r XSt„ng av „r initierad och bekr„ftad, startas f”rst tv† nya tr†dar f”r den, som g†r parallellt med vanliga Skrivbordstr†dar: den huvudsakliga "Avst„ngningstr†den" med meddelandek” f”r statusf”nster och "Uppdateringstr†den", som ”vervakar OS/2 F”nsterlista och skickar meddelanden till avst„ngningstr†den, om att statusf”nstret beh”ver uppdateras. S† st„ngning av alla ”ppna f”nster „r en ganska komplicerad interaktiv process mellan dessa tv† tr†dar: Avst„ngningstr†den st„nger ett f”nster och slumrar sedan in tills uppdateringstr†den har uppt„ckt en f”r„ndring i F”nsterlistan (vilket inneb„r att f”nstret har framg†ngsrikt st„ngts) och skickar ett meddelande tillbaka till Avst„ngningstr†den, som sedan i sin tur st„nger n„sta f”nster, tills alla f”nster „r st„ngda.

N„r alla f”nster „r st„ngda, s† avslutas Uppdateringstr†den. Avst„ngningstr†den g†r i genom listan ”ver v„ckta objekt (som beskrevs ovan) och tvingar deras data att sparas till INI filer eller till h†rddisken genom att anropa varje objekts wpSaveImmediate metod. Detta g”rs bara f”r WPAbstract och WPFolder avkomlingar, d„rf”r enligt min erfarenhet sparar alla andra klasser sina data synkront. (Jag har f”rs”kt spara alla  WPFileSystem avkomlingar en g†ng och det orsakade att massor av ut”kade attribut skapades f”r varje fil som n†gonsin v„ckts av Skrivbordet.)

Slutligen, beroende p† vilken handling som ”nskas, g”r Avst„ngningstr†den ett av f”ljande: