|
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Auto luk vindue Fra : Michael Vilhelmsen |
Dato : 28-06-02 10:56 |
|
Hej
Findes der en nem måde, hvorpå man kan lukke et vindue efter a antal
minutters idle time ?
F.eks har jeg en appl. hvor jeg efterhånden har erfaret, at folk glemmer at
afslutte programmerne.
Herved forbliver de forbundet til en database, og så er deres backup
ubrugelig.
Jeg vil så gerne kunne måle på, at der har været f.eks. 60 minutters
inaktivitet og når det indtræffes så gøre noget (her afslutte aktuelle
vindue og efterfølgende programmet).
--
Best Regards / Med venlig hilsen
___________
Michael Vilhelmsen
Microcom ApS, Denmark
| |
David A. D. Konrad (28-06-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : David A. D. Konrad |
Dato : 28-06-02 11:39 |
|
"Michael Vilhelmsen" <Michael.Vilhelmsen@Microcom.NoSpam.Com> skrev i en
meddelelse
> Jeg vil så gerne kunne måle på, at der har været f.eks. 60 minutters
> inaktivitet og når det indtræffes så gøre noget (her afslutte aktuelle
> vindue og efterfølgende programmet).
DE fleste ville nok bruge en timer, men dette er ikke en optimal løsning, da
der kun findes to timere i hele windows, der threades, og dermed ikke er
specielt pålidelige. Løsningen er en selvstændig thread, hvis prioritet kan
sættes efter behov. Jeg har lavet følgende klasse til dig :
TAppWaitThread = class(TThread)
private
FMillToClose : longint;
procedure SetMillToClose(const Value: longint);
public
procedure Execute; override;
published
property MillToClose:longint read FMillToClose write SetMillToClose;
end;
procedure TAppWaitThread.Execute;
var stop : boolean;
start : longint;
begin
inherited;
start:=getTickCount;
while not stop do
begin
application.processmessages;
if abs(getTickCount-start)>=MillToClose then stop:=true;
end;
application.Terminate
end;
procedure TAppWaitThread.SetMillToClose(const Value: longint);
begin
FMillToClose := Value;
end;
I din hovedforms kode kan du f.eks i OnActive skrive
procedure TForm1.FormActivate(Sender: TObject);
var T:TAppWaitThread;
begin
T:=TAppWaitThread.create(true);
T.MillToClose:=10000; //10 sekunder for eksemplet skyld
T.Execute;
end;
Med 60 minutter skriver du blot T.MillToClose:=60000*60;
>
>
>
> --
> Best Regards / Med venlig hilsen
> ___________
> Michael Vilhelmsen
> Microcom ApS, Denmark
>
| |
Michael Vilhelmsen (28-06-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Michael Vilhelmsen |
Dato : 28-06-02 12:17 |
|
"David A. D. Konrad" <david_konrad@hotmail.com> wrote in
news:afhe8l$ga0$1@sunsite.dk:
> "Michael Vilhelmsen" <Michael.Vilhelmsen@Microcom.NoSpam.Com> skrev i
> en meddelelse
>
>> Jeg vil så gerne kunne måle på, at der har været f.eks. 60 minutters
>> inaktivitet og når det indtræffes så gøre noget (her afslutte
>> aktuelle vindue og efterfølgende programmet).
>
> DE fleste ville nok bruge en timer, men dette er ikke en optimal
> løsning, da der kun findes to timere i hele windows, der threades, og
> dermed ikke er specielt pålidelige. Løsningen er en selvstændig
> thread, hvis prioritet kan sættes efter behov. Jeg har lavet følgende
> klasse til dig :
>
> TAppWaitThread = class(TThread)
> private
> FMillToClose : longint;
> procedure SetMillToClose(const Value: longint);
> public
> procedure Execute; override;
> published
> property MillToClose:longint read FMillToClose write
> SetMillToClose;
> end;
>
> procedure TAppWaitThread.Execute;
> var stop : boolean;
> start : longint;
> begin
> inherited;
> start:=getTickCount;
> while not stop do
> begin
> application.processmessages;
> if abs(getTickCount-start)>=MillToClose then stop:=true;
> end;
> application.Terminate
> end;
>
> procedure TAppWaitThread.SetMillToClose(const Value: longint);
> begin
> FMillToClose := Value;
> end;
>
> I din hovedforms kode kan du f.eks i OnActive skrive
>
> procedure TForm1.FormActivate(Sender: TObject);
> var T:TAppWaitThread;
> begin
> T:=TAppWaitThread.create(true);
> T.MillToClose:=10000; //10 sekunder for eksemplet skyld
> T.Execute;
> end;
>
> Med 60 minutter skriver du blot T.MillToClose:=60000*60;
>
>
>>
>>
>>
>> --
>> Best Regards / Med venlig hilsen
>> ___________
>> Michael Vilhelmsen
>> Microcom ApS, Denmark
>>
>
>
>
Tak David.
Jeg mangler bare lige lidt information.
Hvad med variablen getTickCount
--
Best Regards / Med venlig hilsen
___________
Michael Vilhelmsen
Microcom ApS, Denmark
| |
![](/images/tree/0.gif) David A. D. Konrad (28-06-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : David A. D. Konrad |
Dato : 28-06-02 12:29 |
|
"Michael Vilhelmsen" <Michael.Vilhelmsen@Microcom.NoSpam.Com> skrev i en
meddelelse
> Jeg mangler bare lige lidt information.
> Hvad med variablen getTickCount
Du er ikke bekendt med brugen at ctrl-F1? ![Blink](images/smileys/wink.gif) Det er en API-function...
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) Michael Vilhelmsen (28-06-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Michael Vilhelmsen |
Dato : 28-06-02 12:31 |
|
"David A. D. Konrad" <david_konrad@hotmail.com> wrote in news:afhh79$3bb$1
@sunsite.dk:
> "Michael Vilhelmsen" <Michael.Vilhelmsen@Microcom.NoSpam.Com> skrev i en
> meddelelse
>
>> Jeg mangler bare lige lidt information.
>> Hvad med variablen getTickCount
>
> Du er ikke bekendt med brugen at ctrl-F1? ![Blink](images/smileys/wink.gif) Det er en API-function...
>
>
>
>
>
Jo, men den fortæller ikke hvilken unit jeg skulle use.
Jeg fandt ud af (WIndows).
--
Best Regards / Med venlig hilsen
___________
Michael Vilhelmsen
Microcom ApS, Denmark
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) David A. D. Konrad (28-06-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : David A. D. Konrad |
Dato : 28-06-02 12:42 |
|
"Michael Vilhelmsen" <Michael.Vilhelmsen@Microcom.NoSpam.Com> skrev i en
meddelelse
> Jo, men den fortæller ikke hvilken unit jeg skulle use.
> Jeg fandt ud af (WIndows).
Jeps, det er i 99 ud af 100 tilfælde disse API kaldes forefindes. Det er
også derfor det er rart, at Delphi automatisk inkluderer denne unit i
uses-clausen som én af de første, når man laver en ny form eller frame...
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) Michael Vilhelmsen (28-06-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Michael Vilhelmsen |
Dato : 28-06-02 12:42 |
|
"David A. D. Konrad" <david_konrad@hotmail.com> wrote in news:afhhvq$5c1$1
@sunsite.dk:
> "Michael Vilhelmsen" <Michael.Vilhelmsen@Microcom.NoSpam.Com> skrev i en
> meddelelse
>
>> Jo, men den fortæller ikke hvilken unit jeg skulle use.
>> Jeg fandt ud af (WIndows).
>
> Jeps, det er i 99 ud af 100 tilfælde disse API kaldes forefindes. Det er
> også derfor det er rart, at Delphi automatisk inkluderer denne unit i
> uses-clausen som én af de første, når man laver en ny form eller frame...
>
>
>
Aah....Men jeg lavede en ny Thraed tingest.....
Og tilrettede den....
--
Best Regards / Med venlig hilsen
___________
Michael Vilhelmsen
Microcom ApS, Denmark
| |
Michael Vilhelmsen (28-06-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Michael Vilhelmsen |
Dato : 28-06-02 12:20 |
|
"David A. D. Konrad" <david_konrad@hotmail.com> wrote in
news:afhe8l$ga0$1@sunsite.dk:
> "Michael Vilhelmsen" <Michael.Vilhelmsen@Microcom.NoSpam.Com> skrev i
> en meddelelse
>
>> Jeg vil så gerne kunne måle på, at der har været f.eks. 60 minutters
>> inaktivitet og når det indtræffes så gøre noget (her afslutte
>> aktuelle vindue og efterfølgende programmet).
>
> DE fleste ville nok bruge en timer, men dette er ikke en optimal
> løsning, da der kun findes to timere i hele windows, der threades, og
> dermed ikke er specielt pålidelige. Løsningen er en selvstændig
> thread, hvis prioritet kan sættes efter behov. Jeg har lavet følgende
> klasse til dig :
>
> TAppWaitThread = class(TThread)
> private
> FMillToClose : longint;
> procedure SetMillToClose(const Value: longint);
> public
> procedure Execute; override;
> published
> property MillToClose:longint read FMillToClose write
> SetMillToClose;
> end;
>
> procedure TAppWaitThread.Execute;
> var stop : boolean;
> start : longint;
> begin
> inherited;
> start:=getTickCount;
> while not stop do
> begin
> application.processmessages;
> if abs(getTickCount-start)>=MillToClose then stop:=true;
> end;
> application.Terminate
> end;
>
> procedure TAppWaitThread.SetMillToClose(const Value: longint);
> begin
> FMillToClose := Value;
> end;
>
> I din hovedforms kode kan du f.eks i OnActive skrive
>
> procedure TForm1.FormActivate(Sender: TObject);
> var T:TAppWaitThread;
> begin
> T:=TAppWaitThread.create(true);
> T.MillToClose:=10000; //10 sekunder for eksemplet skyld
> T.Execute;
> end;
>
> Med 60 minutter skriver du blot T.MillToClose:=60000*60;
>
>
>>
>>
>>
>> --
>> Best Regards / Med venlig hilsen
>> ___________
>> Michael Vilhelmsen
>> Microcom ApS, Denmark
>>
>
>
>
Og hvis jeg benytter ovenstående lukker jeg så ikke hele min application?
Og når jeg så skal have den nulstillet ved taste tryk, kan jeg så bare
sætte en ny værdi (f.eks. OnKeyPress).
--
Best Regards / Med venlig hilsen
___________
Michael Vilhelmsen
Microcom ApS, Denmark
| |
![](/images/tree/0.gif) David A. D. Konrad (28-06-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : David A. D. Konrad |
Dato : 28-06-02 12:36 |
|
"Michael Vilhelmsen" <Michael.Vilhelmsen@Microcom.NoSpam.Com> skrev i en
meddelelse
> Og hvis jeg benytter ovenstående lukker jeg så ikke hele min application?
Joda, men det var egentlig også det jeg troede var meningen...? (jfr "Jeg
vil så gerne kunne måle på, at der har været f.eks. 60 minutters inaktivitet
og når det indtræffes så gøre noget (her afslutte aktuelle vindue og
efterfølgende programmet")
> Og når jeg så skal have den nulstillet ved taste tryk, kan jeg så bare
> sætte en ny værdi (f.eks. OnKeyPress).
Den er mere tricky. Du kan i en EventHandler ala OnKeyPress skrive
T.Terminate
og derefter regenere threaden som i eksemplet med den nye lukinterval-værdi,
eller blot forfra - jeg kommer nemlig til at tænke på, at du jo skal gøre
det hver gang "der er sket noget" i programmet (jfr "inaktivitet") så en
regenereringsmetode skal nok kaldes i alle dine eventhandlere...Men det
burde være relativt nemt at programmre sig ud af...Læg koden fra OnActivate
eventen ud i en særskilt procedure, og lav T om til en global variabel på
formen, så threaden ikke bare repetetivt konstrueres, hvilket ikke vil give
den ønskede effekt.
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) Michael Vilhelmsen (28-06-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Michael Vilhelmsen |
Dato : 28-06-02 12:39 |
|
"David A. D. Konrad" <david_konrad@hotmail.com> wrote in
news:afhhjs$4gb$1@sunsite.dk:
> "Michael Vilhelmsen" <Michael.Vilhelmsen@Microcom.NoSpam.Com> skrev i
> en meddelelse
>
>> Og hvis jeg benytter ovenstående lukker jeg så ikke hele min
>> application?
>
> Joda, men det var egentlig også det jeg troede var meningen...? (jfr
> "Jeg vil så gerne kunne måle på, at der har været f.eks. 60 minutters
> inaktivitet og når det indtræffes så gøre noget (her afslutte aktuelle
> vindue og efterfølgende programmet")
>
>> Og når jeg så skal have den nulstillet ved taste tryk, kan jeg så
>> bare sætte en ny værdi (f.eks. OnKeyPress).
>
> Den er mere tricky. Du kan i en EventHandler ala OnKeyPress skrive
>
> T.Terminate
>
> og derefter regenere threaden som i eksemplet med den nye
> lukinterval-værdi, eller blot forfra - jeg kommer nemlig til at tænke
> på, at du jo skal gøre det hver gang "der er sket noget" i programmet
> (jfr "inaktivitet") så en regenereringsmetode skal nok kaldes i alle
> dine eventhandlere...Men det burde være relativt nemt at programmre
> sig ud af...Læg koden fra OnActivate eventen ud i en særskilt
> procedure, og lav T om til en global variabel på formen, så threaden
> ikke bare repetetivt konstrueres, hvilket ikke vil give den ønskede
> effekt.
>
>
>
>
>
Se det har jeg allerede fundet ud (Altså det med en global variabel).
Og jeg fandt også ud af at terminate, sætte og starte igen.
Det virker vist.
Og jeg kan godt se, at mit indlæg kan misforstås.
Jeg ønsker nemlig at lukke ét vindue ad gangen og gøre et eller andet ved
hvert luk.
Jeg har f.eks. en del querys jeg gerne vil afslutte.
Evt. Commit / Rollback.
Og til sidst lukke hele programmet ned.
Så jeg har egentlig brug for, at kunne gøre noget ala
"Den form som starter tråden".Close !
Ellers tusind tak
Michael
--
Best Regards / Med venlig hilsen
___________
Michael Vilhelmsen
Microcom ApS, Denmark
| |
|
|