Programm Pause zur System entlastung



  • Hallo also ich habe folgendes Problem. Ich habe folgenden Code:

    #include <iostream.h>
    #include <fstream.h>
    #include <iomanip.h>
    #include <windows.h>
    //using namespace std;
    
    BOOL GetLastWriteTime(HANDLE hFile, LPSTR lpszString);
    BOOL vergleichen(LPSTR datei1, LPSTR datei2);
    
    // Rueckgabe wnen alles funktioniert hat = 0
    // Rueckgabe bei Fehler einer der beiden Dateien = 2
    int main (int argc, char *argv[]) {
    
    	char *inhalt;
    	int Irueckgabe;
    	LPSTR datei1, datei2;
    	if (argc == 3) {
    		ifstream file1(argv[1],ios::binary); 
    		ofstream file2(argv[2],ios::binary); 
    		while (1) {
    			//Hier muss die Pause Funktion am besten hin
    			Irueckgabe = GetLastWriteTime(file1, datei1);
    			Irueckgabe = GetLastWriteTime(file2, datei2);
    			if(vergleichen(datei1, datei2)/*Prüfen ob das Bild sich erneuert hat von der Quelle und dadruch neuer als das Alte ist*/) {
    				//Ermittlung der Dateigröße 
    				file1.seekg(0,ios::end); 
    				static long filesize=file1.tellg(); 
    				file1.seekg(0,ios::beg); 
    
    				//Anlegen eines Puffers 
    				inhalt=new char[filesize]; 
    
    				//Einlesen der Datei 
    				file1.read(inhalt,filesize); 
    				file1.close(); 
    
    				//Kopie erstellen 
    				file2.write(inhalt,filesize); 
    				file2.close(); 
    			}
    		}
    	}
    	return 0;
    }
    
    BOOL vergleichen(LPSTR datei1, LPSTR datei2) {
    
    	return 1;
    }
    
    BOOL GetLastWriteTime(HANDLE hFile, LPSTR lpszString)
    {
        FILETIME ftCreate, ftAccess, ftWrite;
        SYSTEMTIME stUTC, stLocal;
    
        // Gibt die Zeit von der Datei zurück
        if (!GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite))
            return FALSE;
    
        // Konvertiert die zuletzt geschriebene Zeit in eine Local Zeit
        FileTimeToSystemTime(&ftWrite, &stUTC);
        SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
    
        // Bildet einen String der das Datum anzeigt welches die Datei besass
        wsprintf(lpszString, "%02d/%02d/%04d  %02d:%02d",
            stLocal.wDay, stLocal.wMonth, stLocal.wYear,
            stLocal.wHour, stLocal.wMinute);
    
        return TRUE;
    }
    

    So und nun muss ich dort aber eine Pause funktion einbauen damit mein System entlastet wird. Sozusagen das er 1 Minute wartet bis er alles von Vorne versucht.

    mfg Manny



  • Der COde sieht zwar nicht so anstrengend für den PC aus, aber vielleicht hilft dir Sleep(int milliseconds), es kommt entweder aus ctime oder auc cstdlib.

    mfg
    Glamdring



  • Weder noch, ich musste dafür windows.h (oder war es conio.h?) einbinden.

    Code-Hacker



  • Es heißt Sleep(DWORD miliSeconds). Das ist ein wesentlicher unterschied, weil wenn er ein negatives Argument übergibt, wird es gecastet und dann muss er ganz lange warten 😃



  • Eigene wait-Funktion mit Millisekunden anstelle Sleep aus windows.h:

    #include <iostream>
    #include <conio.h>
    #include <ctime>
    using namespace std;
    
    void wait_ms( unsigned t )
    {
      clock_t start;
      double zeit;
      start = clock();
      do
      {
          zeit = 1000 * ( clock() - start ) / static_cast<float>(CLOCKS_PER_SEC);
      }while( zeit < t );      
    }
    
    int main()
    {
        for(int i=1; i<11; ++i)
        {
          wait_ms( 1000 );
          cout << i << ' ';
        }
        getch();
    }
    


  • @Erhard:

    Deine brutale Schleife ist natuerlich nicht besonders elegant, da der Prozessor voll ausgelastet wird.



  • Kann mir vielleicht noch einer dabei helfen wie ich die beiden LPSTR dinger miteinander verglichen bekomme? denn so geht es nicht :

    if (datei1[6] <= datei2[6]) {
    		if (datei1[7] <= datei2[7]) {
    			if (datei1[8] <= datei2[8]) {
    				if (datei1[9] <= datei2[9]) {
    					if (datei1[3] <= datei2[3]) {
    						if (datei1[4] <= datei2[4]) {
    							if (datei1[0] <= datei2[0]) {
    								if (datei1[1] <= datei2[1]) {
    									if (datei1[11] <= datei2[11]) {
    										if (datei1[12] <= datei2[12]) {
    											if (datei1[14] <= datei2[14]) {
    												if (datei1[15] <= datei2[15]) {
    													return true;
    												} else {
    													return false;
    												}
    											} else {
    												return false;
    											}
    										} else {
    											return false;
    										}
    									} else {
    										return false;
    									}
    								} else {
    									return false;
    								}
    							} else {
    								return false;
    							}
    						} else {
    							return false;
    						}
    					} else {
    						return false;
    					}
    				} else {
    					return false;
    				}
    			} else {
    				return false;
    			}		
    		} else {
    			return false;
    		}
    	} else {
    		return false;
    	}
    

    naja und ich weiss nicht wie ich dann anders an die Daten kommen soll. Bisher dachte ich immer LPSTR waere wie char [] aufgebaut so in der Art. Muss ich da dann vielleicht LPSTR.Get oder so benutzen? um an den Inhalt der Variablen zu kommen?

    mfg Manny 😕 😕 😕



  • DerManny: Hilfe, was ist denn DAS für ein krankes Monster? 😮



  • Ich wollte damit eigentlich die Daten vergleichen die sich in dem LPSTR aufhalten weil ich fand das die so am besten übergeben werden. Denn wenn ich alles in int oder so übergebe iss das fast der gleiche aufwand und wenn ich mich nicht irre mit meinen Berechnungen frist es sogar mehr speicher als so wie ich es nun gemacht habe. Naja und nun will ich halt diese beiden Strings miteinander vergleichen und das war mein 1. Versucht sie zu vergleichen. Ich kann sie ja leider nicht einfach mit Strcmp vergleichen da bei einem Datum ja doch die Kriterien etwas anders liegen als bei einem einfachem String oder einem Datum. Wenn ich mich in meinen gedankengängen irre dann verbessert mich bitte.

    Mfg Manny



  • Also für die bisherige Hilfe vielen Dank!

    Aber ich habe nun noch ein Problem ich habe zwar nun den gesamten Code umgebaut usw. Doch nun habe ich das Problem das in dem Code wohl irgendwo noch ein Fehler ist denn er vergleicht mir die Falschen Daten von den Dateien. Und ich weiss nicht wo er sich dieses Falsche Datum her holt. Hier mal der Code vielleicht kann mir ja einer sagen wo mein denkfehler liegt:

    #include <iostream.h>
    #include <fstream.h>
    #include <iomanip.h>
    #include <windows.h>
    #include <conio.h>
    //using namespace std;
    
    BOOL GetLastWriteTime(HANDLE hFile, SYSTEMTIME *stLocal);
    BOOL vergleichen(SYSTEMTIME datei1, SYSTEMTIME datei2);
    
    // Rueckgabe wnen alles funktioniert hat = 0
    // Rueckgabe bei Fehler einer der beiden Dateien = 2
    int main (int argc, char *argv[]) {
    
    	char *inhalt;
    	int Irueckgabe;
    	SYSTEMTIME datei1, datei2;
    	if (argc == 3) {
    		while (1) {
    			Sleep(60000);
    			ifstream file1(/*argv[1]*/"I:\\Ablage\\StandEisbunkerZS1.jpg",ios::binary); 
    			ofstream file2(/*argv[2]*/"I:\\Ablage\\test.jpg",ios::binary); 
    			Irueckgabe = GetLastWriteTime(file1, &datei1);
    			Irueckgabe = GetLastWriteTime(file2, &datei2);
    			if(vergleichen(datei1, datei2)/*Prüfen ob das Bild sich erneuert hat von der Quelle und dadruch neuer als das Alte ist*/) {
    				//Ermittlung der Dateigröße 
    				file1.seekg(0,ios::end); 
    				static long filesize=file1.tellg(); 
    				file1.seekg(0,ios::beg); 
    
    				//Anlegen eines Puffers 
    				inhalt=new char[filesize]; 
    
    				//Einlesen der Datei 
    				file1.read(inhalt,filesize); 
    				file1.close(); 
    
    				//Kopie erstellen 
    				file2.write(inhalt,filesize); 
    				file2.close(); 
    			}
    		}
    	}
    	return 0;
    }
    
    BOOL vergleichen(SYSTEMTIME datei1, SYSTEMTIME datei2) {
    	// Vergleichen von den Daten wenn datei1 <= datei 2 gib True aus sonst False
    	// Jahr vergleichen
    	if(datei1.wYear > datei2.wYear) {
    		return true;
    	}
    	if(datei1.wMonth > datei2.wMonth) {
    		return true;
    	}
    	if(datei1.wDay > datei2.wDay) {
    		return true;
    	}
    	if(datei1.wHour > datei2.wHour) {
    		return true;
    	}
    	if(datei1.wMinute > datei2.wMinute) {
    		return true;
    	}
    	return false;
    }
    
    BOOL GetLastWriteTime(HANDLE hFile, SYSTEMTIME *stLocal)
    {
        FILETIME ftCreate, ftAccess, ftWrite;
        SYSTEMTIME stUTC;
    
        // Gibt die Zeit von der Datei zurück
        if (!GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite))
            return FALSE;
    
        // Konvertiert die zuletzt geschriebene Zeit in eine Local Zeit
        FileTimeToSystemTime(&ftWrite, &stUTC);
        SystemTimeToTzSpecificLocalTime(NULL, &stUTC, stLocal);
    
        return TRUE;
    }
    

    Also ich vermute ihn irgendwo in der GetLastWriteTime das der Fehler dort drin steckt da er einen Filepointer bekommt der Funkioniert aber sie mir dann das Falsche Datum des Files zurück gibt.

    Mfg Manny

    [EDIT]
    Da fällt mir gerade auf das der Funktion ein HANDLE übergeben wird. Ist das gleich einem File oder was ist ein HANDLE? In der Hilfe steht das ein HANDLE ein Objekt ist. Und bekanntlicherweise ist ein Objekt = eines Files, oder? Naja falls jemand den fehler hat bitte sagt ihn mir.


Log in to reply