Nexus86Medlem sedan okt. 20023 030 inlägg Två riktiga nybörjarfrågor. :)
1. Hur avslutar man sitt program? Har alltid använt mej av MFC AppWizard och därför endast använt OnOK();.
2. Är det något speciellt man bör tänka på om man nu kan och vill göra plattformsoberoende program? Eller iallafall till Windows och Linux?
PeWMedlem sedan juni 200010 432 inlägg 1. Frigör allokerat minne. Är det t.ex ett fönsterprogram bör du även frigöra resurser som du skapat genom systemanrop. Skillnaden mot MFC's färdiga "kit" är att du får göra det manuellt i t.ex meddelandeloopen.
2. Var så generell som möjligt och använd ANSI - kod. Wrappa gärna in systemanropen i egna klasser så att man lätt kan ändra där om man byter plattform. Är nog inte helt lätt att göra det "plattformsoberoende" ens mellan linux och windows, men säkerligen inte omöjligt. Ger en hel del extra kod, dock :e
BeatboxMedlem sedan okt. 20013 217 inlägg 1. Det rekommenderade sättet är att från sitt program skicka VM_QUIT till sig själv. Då kommer systemet att plocka ned applikationen på ett korrekt sätt.
Nexus86Medlem sedan okt. 20023 030 inlägg Ok.. Tack båda två! Bara en fråga till, vad menas med ANSI-kod? :e
PeWMedlem sedan juni 200010 432 inlägg Nexus86 ->
ANSI - en standard. Mao så avses det att du gör kod som inte skiljer sig åt mellan olika plattformar så att du t.ex kan kompilera samma kod under dessa plattformar. Med ren ANSI - C är det någorlunda lätt att anpassa kod så att det fungerar som ovan. Det bökiga kommer med systemanropen (kontakten med OS:et), och det finns olika sätt att hantera dessa detaljer på - t.ex med olika direktiv i makescripten m.m... fast ju mer os-beroende själva applikationen är - ju bökigare och större kod blir det.
Beatbox -> Det är ju den förenklade varianten av det jag skrev, fast jag tvivlar på att det är så himla smart att endast förlita sig på WM_QUIT och att systemet tar hand om allt om man exempelvis allokerat en massa resurser och minne på egen hand :e
BeatboxMedlem sedan okt. 20013 217 inlägg
Det är ju den förenklade varianten av det jag skrev, fast jag tvivlar på att det är så himla smart att endast förlita sig på WM_QUIT och att systemet tar hand om allt om man exempelvis allokerat en massa resurser och minne på egen hand
Man ska bli "dödad utifrån" och det är därför man ber operativet om hjälp för att ta ned applikationen på ett korrekt sätt. Det är faktiskt det sätt som MS säger att man ska ta död på sig själv förutsatt att man är en applikation som har ett UI. Man postar alltså WM_QUIT till sig själv och i man har en messagehandler som mappar mot meddelandet. I den rensar man upp allt man allokerat och så... Det är alltså inte frågan om att dumpa över allt till systemt utan det är frågan om att plocka ned applikationen på ett kontrollerat sätt.
BeatboxMedlem sedan okt. 20013 217 inlägg Ett tillägg.... detta är alltså till för så att processa alla meddelanden som finns i meddelandekön innan man går och dör. Om man brutalt bara slår ihjäl sig själv så dör även fönstret och det kan finnas meddelanden kvar i kön som ska processas. Då man får meddelandet WM_QUIT (eller om det är WM_DESTROY) så är man garaterad att det inte kommer några fler meddelandet till fönsteret. WM_QUIT (eller WM_DESTROY) är det sista meddelandet som kommer till fönsteret innan det dör och på så vis är man garaterad att man inte kommer att bli störd i sin uppstädning av t ex allokerat minne eller andra resurser.
nikoMedlem sedan juni 20022 599 inlägg Kan även tillägga att det inte heller är så enkelt som att applikationen terminerar i och med att meddelandeloopen rinner igenom och WinMain avslutas. WinMain hoppar nämligen tillbaka till den egentliga C-runtimestartfunktionen _WinMainCRTStartup (syns ej i IDE:n). Denna ansvarar för att processen termineras på ett korrekt sätt och anropar slutligen ExitProcess.
Källa: Jeffrey Richter: Advanced Windows.
Nexus86Medlem sedan okt. 20023 030 inlägg
PeW skrev:
Nexus86 ->
ANSI - en standard. Mao så avses det att du gör kod som inte skiljer sig åt mellan olika plattformar så att du t.ex kan kompilera samma kod under dessa plattformar. Med ren ANSI - C är det någorlunda lätt att anpassa kod så att det fungerar som ovan. Det bökiga kommer med systemanropen (kontakten med OS:et), och det finns olika sätt att hantera dessa detaljer på - t.ex med olika direktiv i makescripten m.m... fast ju mer os-beroende själva applikationen är - ju bökigare och större kod blir det.
OK.. Om man nu vill ha fönster i sin application, har både windows och linux CreateWindow eller måste man använda något annat?
ViktorMedlem sedan aug. 20021 752 inlägg CreateWindow är ett OS specifikt anropp som bara finns i Windows. Alla fönster kommandon (som har med GUI att göra) kan du utgå från är OS specifika.
/Viktor
Nexus86Medlem sedan okt. 20023 030 inlägg hur gör man då om man vill ha ett OS-oberoende program med
fönster? Måste man skapa egna eller? :q
Marcus EMedlem sedan maj 20021 466 inlägg Antingen gör du ett eget klassbibliotek som inkapslar alla systemfunktioner eller använder du ett existerade. Det finns t.ex. Trolltechs QT. Windows-versionen kostar pengar.
nikoMedlem sedan juni 20022 599 inlägg
Nexus86 skrev:
hur gör man då om man vill ha ett OS-oberoende program med
fönster?
Om nu plattformsoberoendet verkligen är en "issue" så kanske man också bör kika på språk/miljöer där det finns run-timer, tolkar, VM:s och lib portade. Tex: Java, Perl, TCL m. fl.
Nexus86Medlem sedan okt. 20023 030 inlägg Plattformsoberoendet är inte viktigt det är bara det att jag vill veta hur man gör utifall att jag vill göra något sånt program någon gång.
PeWMedlem sedan juni 200010 432 inlägg
Beatbox skrev:
I den rensar man upp allt man allokerat och så... Det är alltså inte frågan om att dumpa över allt till systemt utan det är frågan om att plocka ned applikationen på ett kontrollerat sätt.
Har inte heller sagt något annat, hur kan du få det till det? Jag skrev ENDAST förlita sig på WM_QUIT (dvs att endast skicka ett meddelande) ;)
Det jag menade var att man inte får glömma bort att frigöra upptagna resurser och lämna tillbaka minne, att det lämpligen sker i WM_DESTROY efter ett postat WM_QUIT är det ingen som bestridit, alls. Anledningen till det att jag överhuvudtaget nämnde det är att det lätt glöms bort och det finns t.o.m dom som hävdar att operativet sköter ALLT - vilket inte är helt rätt... men visst kan folk få gå på sina egna minor - jag skiter i vilket, känns lite onödigt bara :e