/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Opdage af programmet bliver slået ihjel
Fra : Ukendt


Dato : 08-10-02 19:04

Sidder og hygger mig lidt med Builder 5. Har lidt problemer med at
opdage, at mit program er ved at blive slået ihjel... dvs. processen
bliver slået stoppet via Windows 2000s Task Manager? Ingen af
standard-events'ene bliver aktiveret (OnClose, OnDestroy o.l.).

Jeg har så forsøgt mig med, at fange WM_QUIT beskeden, som Windows
sender programmet. Det gør jeg lidt i den her stil:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnMessage = AppMessage;
}

void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
if (Msg.message == WM_QUIT)
{
// Do stuff here...
Handled = true;
}
}

Men det har jeg forbavsende lidt succes med. Programmet kommer aldrig
ind i ovennævnte if-statement. Lidt hjælp, please? På forhånd tak!

Mvh, Claus
--
I never apologize! I'm sorry, but that's the way I am.
- Homer Simpson

 
 
Thomas Lykkeberg (08-10-2002)
Kommentar
Fra : Thomas Lykkeberg


Dato : 08-10-02 21:10

On Tue, 08 Oct 2002 20:03:32 +0200, Claus Nielsen <> wrote:

>Sidder og hygger mig lidt med Builder 5. Har lidt problemer med at
>opdage, at mit program er ved at blive slået ihjel... dvs. processen
>bliver slået stoppet via Windows 2000s Task Manager? Ingen af
>standard-events'ene bliver aktiveret (OnClose, OnDestroy o.l.).
>
>Jeg har så forsøgt mig med, at fange WM_QUIT beskeden, som Windows
>sender programmet. Det gør jeg lidt i den her stil:
Ideen med at "klippe snoren" med task manageren i W2K, er jo netop en
af fordelene ved et rigtigt tvunget tidsdelings operativsystem. Her
kan man jo netop "fjerne" den pågældende process fra eksekverings køen
uden at processen har den fjerneste ide omdet. En fordel hvis
processen er "kørt fast". Jeg tror ikke du har nogen mulighed for at
fange et sådant event (da det ikke er et event). Ideen er jo som før
sagt at man skal kunne "fjerne" processen uanset hvilken tilstand den
er i.

/Thomas

Anders Borum (09-10-2002)
Kommentar
Fra : Anders Borum


Dato : 09-10-02 08:40

> Ideen med at "klippe snoren" med task manageren i W2K, er jo netop en
> af fordelene ved et rigtigt tvunget tidsdelings operativsystem. Her
> kan man jo netop "fjerne" den pågældende process fra eksekverings køen
> uden at processen har den fjerneste ide omdet. En fordel hvis
> processen er "kørt fast". Jeg tror ikke du har nogen mulighed for at
> fange et sådant event (da det ikke er et event). Ideen er jo som før
> sagt at man skal kunne "fjerne" processen uanset hvilken tilstand den
> er i.

Hej Claus og Thomas

Hvis man dræber selve processen kan programmet ikke nå at reagere.
Men udover Processer-fanen er der også en Programmer-fane hvor man kan
afslutte job (min win2k er dansk).

Her må det være muligt for programmet at reagere og lukke frivilligt
og at nå lidt ekstra under lukningen. Hvis man prøver at lukke et job
der er frosset vil man efter lidt tid få advarslen at programmet ikke
svarer - det har altså haft muligheden for at svare.

Jeg tror det er WM_QUIT der sendes når man første gang prøver at afslutte
et job. Efterfølgende går task-manager måske bare efter at dræbe
hoved-processen?

Hilsen Anders



Anders J. Munch (09-10-2002)
Kommentar
Fra : Anders J. Munch


Dato : 09-10-02 09:36

"Anders Borum" <overflade@fedt.dk> wrote:
> Her må det være muligt for programmet at reagere og lukke frivilligt
> og at nå lidt ekstra under lukningen. Hvis man prøver at lukke et job
> der er frosset vil man efter lidt tid få advarslen at programmet ikke
> svarer - det har altså haft muligheden for at svare.

Skriv en destructor til din form.

Det lyder mærkeligt du ikke får OnClose på "End Task" fra task
manager. Jeg lavede et lille eksempel der ikke gør andet, og det
virker for mig, også med BCB5 og W2K. Der må være et eller andet på
spil i dit program. Har du styr på nedlukningsrækkefølgen, så du ikke
bruge variabler/forms efter de er delete'ed? har du åbne modale
dialoger? bruger du tråde og Synchronize?

mvh. Anders



Anders J. Munch (09-10-2002)
Kommentar
Fra : Anders J. Munch


Dato : 09-10-02 09:39

"Anders J. Munch" <andersjm@dancontrol.dk> wrote:
> "Anders Borum" <overflade@fedt.dk> wrote:

Ups, mit indlæg var naturligvis rettet til OP, ikke til Anders Borum.

mvh. Anders



b3nny pede (10-10-2002)
Kommentar
Fra : b3nny pede


Dato : 10-10-02 17:15

Du kan jo altid lave en anden app der subclasser den pågældende application
jeg tror nok at systemet relayer beskeden WM_DESTROY før den slår en given
process ihjel. Du kan altså lave en subclassing af det givne modul, og på
den måde opsnappe ALLE beskeder
eller bruge et program som API Spy++ eller en anden utility (Jeg mener at
API Spy++ følger med MSVC++)

mvh
/b3nny

<Claus Nielsen> wrote in message
news:hq66quojau7aqppi4oabpqeosd5qq6s47d@4ax.com...
> Sidder og hygger mig lidt med Builder 5. Har lidt problemer med at
> opdage, at mit program er ved at blive slået ihjel... dvs. processen
> bliver slået stoppet via Windows 2000s Task Manager? Ingen af
> standard-events'ene bliver aktiveret (OnClose, OnDestroy o.l.).
>
> Jeg har så forsøgt mig med, at fange WM_QUIT beskeden, som Windows
> sender programmet. Det gør jeg lidt i den her stil:
>
> void __fastcall TForm1::FormCreate(TObject *Sender)
> {
> Application->OnMessage = AppMessage;
> }
>
> void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
> {
> if (Msg.message == WM_QUIT)
> {
> // Do stuff here...
> Handled = true;
> }
> }
>
> Men det har jeg forbavsende lidt succes med. Programmet kommer aldrig
> ind i ovennævnte if-statement. Lidt hjælp, please? På forhånd tak!
>
> Mvh, Claus
> --
> I never apologize! I'm sorry, but that's the way I am.
> - Homer Simpson



b3nny pede (10-10-2002)
Kommentar
Fra : b3nny pede


Dato : 10-10-02 17:18

The WM_DESTROY message is sent when a window is being destroyed. It is sent
to the window procedure of the window being destroyed after the window is
removed from the screen.

This message is sent first to the window being destroyed and then to the
child windows (if any) as they are destroyed. During the processing of the
message, it can be assumed that all child windows still exist.

A window receives this message through its WindowProc function.


Jeg har stjålet dette i Platform SDK'en og mener at det er den Message du
leder efter :)
mvh
/b3nny

<Claus Nielsen> wrote in message
news:hq66quojau7aqppi4oabpqeosd5qq6s47d@4ax.com...
> Sidder og hygger mig lidt med Builder 5. Har lidt problemer med at
> opdage, at mit program er ved at blive slået ihjel... dvs. processen
> bliver slået stoppet via Windows 2000s Task Manager? Ingen af
> standard-events'ene bliver aktiveret (OnClose, OnDestroy o.l.).
>
> Jeg har så forsøgt mig med, at fange WM_QUIT beskeden, som Windows
> sender programmet. Det gør jeg lidt i den her stil:
>
> void __fastcall TForm1::FormCreate(TObject *Sender)
> {
> Application->OnMessage = AppMessage;
> }
>
> void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
> {
> if (Msg.message == WM_QUIT)
> {
> // Do stuff here...
> Handled = true;
> }
> }
>
> Men det har jeg forbavsende lidt succes med. Programmet kommer aldrig
> ind i ovennævnte if-statement. Lidt hjælp, please? På forhånd tak!
>
> Mvh, Claus
> --
> I never apologize! I'm sorry, but that's the way I am.
> - Homer Simpson



Ukendt (10-10-2002)
Kommentar
Fra : Ukendt


Dato : 10-10-02 20:39

Tak for svarene. Har fået løst problemet. Dog ikke helt som jeg
oprindeligt havde forventet.

Mit problem var nemlig, at når mit program bliver lukket på en...
"uregelementerede måde", så var der data der gik tabt. Det kan f.eks.
være, hvis Windows lukkes mens mit program kører - og at dræbe
processen via Task Manageren svarer, så vidt jeg kan se, til, at
lukke/genstarte Windows mens ens program er kørende.

Jeg bruger Paradox tabeller, og data jeg havde indsat/ændret/slettet
så godt nok ud til at være gemt okay - men hvis processen blev slået
ihjel, så kunne jeg risikere, at disse ændringer gik tabt.

Jeg ville derfor forsøge at fange denne "kill-process"-event, og så på
en-eller-anden måde sørge for, at mine data nu også virkelig blev
gemt.

Løsningen var i stedet at bruge FlushBuffers() på både AfterPost og
AfterDelete events'ene. (Havde tidligere en FlushBuffers() på
OnUpdateRecord event'en, men det havde åbenbart ingen virkning). Hvis
nogen har en mere elegant løsning, så kom endelig med den.

Og hvad kan jeg lære af det? Altid spørg om selve problemet, og ikke
om det som jeg tror er løsningen... hvilket ironisk nok er præcis det
samme jeg forsøger at lokke ud af kunderne på mit arbejde. :)

Mvh, Claus
--
I never apologize! I'm sorry, but that's the way I am.
- Homer Simpson

Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408509
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste