Cześć,
mam pytanie co do zadania domowego. Zrobiłem już cały program, zapisuje on licznik do pliku przy zamykaniu pliku krzyżykiem, uruchamia się przy autostarcie itd. Nie wiem jednak jak dodać opcję by zapisywał on czas do pliku przy zamykaniu systemu. Tj. klikam zamknij program - wszystko w porządku zapisuje się tak jak chce. Jednak jeśli wyłączę komputer, nie wyłączając aplikacji to ona tego timera nie zapisze, przez co jest tak na prawdę bezużyteczna.
Wyczytałem, że windows wysyła coś takiego jak WM_QUERYENDSESSION przy zamykaniu systemu i podobno to jakoś można wykorzystać do opóźnienia zamykania na tyle by zapisać dane, jednak totalnie nie rozumiem jak można tego użyć. Byłbym wdzięczny za porady.
EDIT:
{
Problem rozwiązałem w inny sposób: program zapisuje czas co sekundę do pliku, przez co cały czas jest aktualny nie ważne czy się wyłączy program czy nie. Jednak takie podejście wydaje mi się marnotrawieniem zasobów ( może przesadzam?).
Procesor / Pamięć / Dysk / Sieć
Pokazuje mi takie zużycie. Wydaję mi się, że do przeżycia. Jeśli ktoś ma lepsze rozwiązanie to chętnie posłucham, dzięki :).
Ps. Moje dodawanie do Austostart-u też jest kulawe, bo nie mogę odkryć jak pobrać ścieżkę do folderu Autostart użytkownika (bo ścieżka ma w sobie nazwę użytkownika, więc na każdym komputerze jest inna). U mnie to jest rozwiązane komunikatem by użytkownik sam sobie wrzucił skrót do folderu który powinien być tu i tu, ale to prowizorka.
Kod (wersja zapisująca się co sekundę):
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "PcTimer.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "trayicon"
#pragma resource "*.dfm"
TForm1 *Form1;
const SELDIRHELP = 1000;
String Dir = "";
int sec=0,h,m,s;
int h1,h2,m1,m2,s1,s2;
int flag_open=1;
AnsiString exeFile=Application->ExeName;
AnsiString exePath=ExtractFilePath(exeFile);
AnsiString hours1,minutes1,seconds1;
AnsiString fileHours1,fileHours2,fileMinutes1,fileMinutes2,fileSeconds1,fileSeconds2;
AnsiString timeFromFile;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Directory = new TStringList;
start_time = new TStringList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrayIcon1Click(TObject *Sender)
{
Show();
Application->BringToFront();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
sec++;
h=sec/3600;
m=(sec-h*3600)/60;
s= sec-h*3600-m*60;
hours1=CurrToStr(h);
minutes1=CurrToStr(m);
seconds1=CurrToStr(s);
if(h<10)
hours1="0"+hours1;
if(m<10)
minutes1="0"+minutes1;
if(s<10)
seconds1="0"+seconds1;
if(s==0)
seconds1="00";
Time->Caption=hours1+":"+minutes1+":"+seconds1;
start_time->Clear();
start_time->Add(Time->Caption);
start_time->SaveToFile(SaveDialog1->FileName);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(Application->MessageBox(
"Are you sure, do you want to exit?","Confirm",MB_YESNO | MB_ICONQUESTION)==IDYES )
{
Application->Terminate();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SelectDirectory(Dir, TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt,SELDIRHELP);
Directory->Clear();
Directory->Add(Dir);
AnsiString exePathCopy;
exePathCopy=exePath+"\Dir.txt";
Directory->SaveToFile(exePathCopy);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
AnsiString NameOfFile;
try
{
Form1->Directory->LoadFromFile(exePath+"\Dir.txt");
if (Directory->Count >= 0)
Dir=Directory->Strings[0];
}
catch(...)
{
}
if(Dir=="")
{
Application->MessageBox("You have to enter directory where timer will save!","Info",ID_OK);
Form1->Button1Click(Sender);
}
NameOfFile=Date();
NameOfFile=NameOfFile+".txt";
NameOfFile=Dir+"\\"+NameOfFile;
SaveDialog1->FileName=NameOfFile;
if (FileExists(SaveDialog1->FileName))
{
try
{
start_time->LoadFromFile(SaveDialog1->FileName);
if (start_time->Count >= 0)
timeFromFile=start_time->Strings[0];
}
catch(...)
{
}
start_time->LoadFromFile(SaveDialog1->FileName);
fileHours1=timeFromFile.SubString(0, 1);
fileHours2=timeFromFile.SubString(1, 1);
fileMinutes1=timeFromFile.SubString(4, 1);
fileMinutes2=timeFromFile.SubString(5, 1);
fileSeconds1=timeFromFile.SubString(7, 1);
fileSeconds2=timeFromFile.SubString(8, 1);
h1 = fileHours1.ToInt();
h2 = fileHours2.ToInt();
m1 = fileMinutes1.ToInt();
m2 = fileMinutes2.ToInt();
s1 = fileSeconds1.ToInt();
s2 = fileSeconds2.ToInt();
while(h1>0)
{
h1--;
h2+=10;
}
h=h2;
while(m1>0)
{
m1--;
m2+=10;
}
m=m2;
while(s1>0)
{
s1--;
s2+=10;
}
s=s2;
s+=h*3600;
s+=m*60;
sec=s;
}
}
//---------------------------------------------------------------------------
Pozdrawiam
Jakobosik