malan Temat założony przez niniejszego użytkownika |
Wylogowanie z systemu [C++] » 2009-06-11 23:07:03 Problem nie dotyczy getenv. Po krótce: zrób klasę i w niej destruktor. W destruktorze pobieraj czas i zapisuj go do pliku z logiem. Naukę klas zostawiłem sobie na wakacje, więc nie za bardzo rozumiem po co tworzyć ten destruktor... Wiem, że on zwalania chyba pamięć/ usuwa obiekty..., ale co on ma do zapisania czasu w jakim user się wylogował to nie wiem... ;/ |
|
WunM |
» 2009-06-11 23:20:17 Śłuży m.in. do usuwania zbędnych danych w pamięci. Ale fakt że jest wywoływany przy usuwaniu obiektu (na samym końcu) można wykorzystać m.in. do zapisania czegoś w pliku. |
|
DejaVu |
» 2009-06-12 12:16:45 #include <conio.h> #include <iostream> using namespace std;
class Klasa { public: ~Klasa() { cout << "sprzatam" << endl; } }; int main() { { Klasa zmienna; cout << "napis" << endl; } getch(); return 0; }
Zwróć uwagę na to, że nie ma nigdzie wywołania destruktora, ale on się wykona gdy zmienna będzie szła do piachu (będzie zwalniana z pamięci). |
|
malan Temat założony przez niniejszego użytkownika |
» 2009-06-12 13:36:09 Stworzyłem coś takiego: #include <iostream> #include <string> #include <fstream>
#include <stdlib.h> #include <time.h>
#include <conio.h> using namespace std; class LogTime { private: string Konwertuj( string Dane, string Wybor ); public: ~LogTime(); }; LogTime::~LogTime() { time_t rawtime; struct tm * timeinfo; time( & rawtime ); timeinfo = localtime( & rawtime ); ofstream Plik; string Pobierz = asctime( timeinfo ), Data, Czas, UserName; for( int i = 0; i < 24; i++ ) { Czas += Pobierz[ i ]; if( i == 3 ) { for( i = 11; i < 20; i++ ) Czas += Pobierz[ i ]; for( i = 8; i < 11; i++ ) { Data += Pobierz[ i ]; if( i == 10 ) for( i = 4; i < 8; i++ ) { Data += Pobierz[ i ]; if( i == 7 ) for( i = 20; i < 24; i++ ) Data += Pobierz[ i ]; } } } } Czas = "inLog time: " + Konwertuj( Czas, "Czas" ) + "\n===========================\n"; Data = Konwertuj( Data, "Data" ); UserName = getenv( "USERNAME" ); if( UserName.length() == 0 ) UserName = "DefaultUser"; Plik.open(( "logs/" + Data + " (" + UserName + ")" + ".txt" ).c_str(), ios::out | ios::app ); if( Plik.fail() ) ofstream Plik(( "logs/" + Data + "(" + UserName + ")" + ".txt" ).c_str(), ios::out | ios::app ); Plik.write( & Czas[ 0 ], Czas.length() ); Plik.close(); } string LogTime::Konwertuj( string Dane, string Wybor ) { string nDane, dDane; int Suma = 0; if( Wybor == "Czas" ) { for( int i = 0; i < 3; i++ ) Suma += Dane[ i ]; switch( Suma ) { case 298: nDane = "Poniedziałek"; break; case 302: nDane = "Wtorek"; break; case 288: nDane = "Środa"; break; case 305: nDane = "Czwartek"; break; case 289: nDane = "Piątek"; break; case 296: nDane = "Sobota"; break; case 310: nDane = "Niedziala"; break; default: nDane = "Error!"; break; } for( int i = 3; i < Dane.length(); i++ ) nDane += Dane[ i ]; return nDane; } if( Wybor == "Data" ) { for( int i = 3; i < 6; i++ ) Suma += Dane[ i ]; switch( Suma ) { case 281: nDane = "Styczeń"; break; case 269: nDane = "Luty"; break; case 288: nDane = "Marzec"; break; case 291: nDane = "Kwiecień"; break; case 295: nDane = "Maj"; break; case 301: nDane = "Czerwiec"; break; case 299: nDane = "Lipiec"; break; case 285: nDane = "Sierpień"; break; case 296: nDane = "Wrzesień"; break; case 294: nDane = "Październik"; break; case 307: nDane = "Listopad"; break; case 268: nDane = "Grudzień"; break; default: nDane = "Error!"; break; } for( int i = 0; i < Dane.length(); i++ ) { if( i == 3 ) { dDane += nDane; i += 3; } dDane += Dane[ i ]; } return dDane; } } int main() { { LogTime test; cout << "To_jest_test;"; } getch(); return 0; } Jeśli dobrze to wszystko zrozumiałem to...: pobieram czas, w którym został uruchomiony program i zapisuje go do pliku..., potem moment kiedy destruktor się uaktywni i zapisze czas do pliku do będzie moment wyłączenia programu..., czyli wylogowania? Tylko wtedy program by musiał być cały czas aktywny, więc konsola odpada, bo nie da się jej zminimalizować tak jak np. 'WatchDDT'... |
|
DejaVu |
» 2009-06-12 13:45:56 Hm... czyli Ty chcesz zrobić program, który loguje czas z każdym jego uruchomieniem? W takim wypadku musisz mieć mechanizm Windowsa, który zapewni Ci uruchamianie Twojej aplikacji w momencie zamykania systemu. Może harmonogram to umożliwia (choć do akcji zamykania systemu to nie jestem już taki pewien). |
|
malan Temat założony przez niniejszego użytkownika |
» 2009-06-12 14:07:02 No można tak powiedzieć. Na razie jest tak, że program tworzy plik 'txt' z aktualną datą, i nazwą użytkownika (w nazwie) i zapisuje dzień i godzinę uruchomienia aplikacji, czyli zalogowania się na jakieś konto w windows. To było proste, bo wystarczy wstawić skrót do progr. w autostarcie..., a teraz chciałbym jeszcze żeby wstawiał czas wylogowania się i tu mam problem, ale poszukam czegoś... |
|
DejaVu |
» 2009-06-12 14:48:38 moim zdaiem aplikacja powinna wtedy działać w tle od momentu uruchomienia do momentu zakończenia. Byłby to de'facto czas uruchomienia aplikacji, jednak jeśli będzie skrót w autostarcie i będzie to aplikacja windowsowa (brak konsoli), brak okna i brak ikony to obecność aplikacji nie zostanie zauważona (jeśli proca nie zajeździ) i jeśli ktoś jej z menedżera nie ubije. |
|
malan Temat założony przez niniejszego użytkownika |
» 2009-06-12 15:01:27 Tak by musiało być... Heh myślałem, że to będzie program na 15 minut, a tu tyle roboty... (w sumie gdyby nie to wylogowywanie to by tak było) Sprawdzałem harmonogram i tam nie da się chyba zaplanować zadania podczas wyłączania systemu... Szukam dalej... |
|
« 1 » 2 |