• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Optymalizacja timera.

Object Storage Arubacloud
0 głosów
94 wizyt
pytanie zadane 2 lutego 2017 w C i C++ przez jakobosik Początkujący (340 p.)

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

1 odpowiedź

+1 głos
odpowiedź 2 lutego 2017 przez Gracjan Pasik Obywatel (1,810 p.)
Dobry jest pomysł z zapisywaniem w odstępach czasu, ale lepiej rób to co 10 albo 30 sekund, wtedy będzie bardziej optymalnie. Chyba że musi to być dokładne, wtedy możesz co sekundę.
komentarz 2 lutego 2017 przez jakobosik Początkujący (340 p.)
Faktycznie, w sumie nie musi, co 30 sekund wystarczy w zupełności.

Podobne pytania

+1 głos
0 odpowiedzi 731 wizyt
pytanie zadane 10 stycznia 2022 w C i C++ przez jagfoljersolen Początkujący (250 p.)
0 głosów
1 odpowiedź 432 wizyt
pytanie zadane 22 stycznia 2018 w SPOJ przez Maciej3206 Użytkownik (570 p.)
0 głosów
2 odpowiedzi 710 wizyt
pytanie zadane 24 marca 2016 w C i C++ przez niezalogowany

92,620 zapytań

141,474 odpowiedzi

319,813 komentarzy

62,004 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...