/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
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)
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)
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


David A. D. Konrad (28-06-2002)
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? Det er en API-function...





Michael Vilhelmsen (28-06-2002)
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? 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


David A. D. Konrad (28-06-2002)
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...



Michael Vilhelmsen (28-06-2002)
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)
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


David A. D. Konrad (28-06-2002)
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.





Michael Vilhelmsen (28-06-2002)
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


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

Månedens bedste
Årets bedste
Sidste års bedste