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

Optymalizacja timera.

0 głosów
232 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 1,295 wizyt
pytanie zadane 10 stycznia 2022 w C i C++ przez jagfoljersolen Początkujący (250 p.)
0 głosów
1 odpowiedź 574 wizyt
pytanie zadane 22 stycznia 2018 w SPOJ przez Maciej3206 Użytkownik (570 p.)
0 głosów
2 odpowiedzi 1,893 wizyt
pytanie zadane 24 marca 2016 w C i C++ przez niezalogowany

93,720 zapytań

142,648 odpowiedzi

323,266 komentarzy

63,270 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...