Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CPU Auslastung für ein Programm begrenzen (https://www.delphipraxis.net/73441-cpu-auslastung-fuer-ein-programm-begrenzen.html)

Andidreas 18. Jul 2006 10:42


CPU Auslastung für ein Programm begrenzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi @ all,

ich hab mir ein Programm gebastellt, was ein .txt file (Größe ca. 2,5 MB) einließt, und als .xls file (Größe ca. 8,5 MB) ausgibt.
klappt alles wunderbar... nur als ich gestern meinen taskmanager mit angezeigt hab während ich das programm hab laufen lassen, hat mich fast der schlag getroffen....

mein programm schnappt sich denn bei programm start verfügbaren cpu und arbeitsspeicher und belegt diesen für die laufzeit des programmes (ca. 5-10 min.) komplett!!!! (siehe bild)

das find ich gerade nicht toll, da das ein weiter arbeiten am pc unmöglich macht :wall:

gibt es eine möglichkeit das ich denn arbeitsspeiche und cpu begrenze denn sich das programm nehmen will bzw. nehmen darf???

Nils_13 18. Jul 2006 10:44

Re: CPU Auslastung für ein Programm begrenzen
 
Wenn es möglich ist, dann wird dein Programm aber langsamer arbeiten. Dann ist die Frage, was besser ist.

xaromz 18. Jul 2006 10:48

Re: CPU Auslastung für ein Programm begrenzen
 
Hallo,

ich kann Deinem Screenshot nicht entnehmen, dass das Programm den ganzen Arbeitsspeicher belegt. Da steht doch: "Verfügbar: 144416KB".

Was die Prozessorauslastung angeht: Jedes Programm versucht, so viel Prozessorzeit zu nutzen wir möglich. Das ist auch so gewollt. Eigentlich sollte Windows dafür sorgen, dass auch alle anderen Programme nicht zu kurz kommen. Wenn Du also Dein Programm nicht auf TimeCritical gestellt hast, sollte das kein Problem darstellen. Wenn doch, dann poste mal etwas Code, für Deine Aufgabe scheinen mir 5-10 Min. irgendwie etwas hoch.

Gruß
xaromz

Klaus01 18. Jul 2006 10:48

Re: CPU Auslastung für ein Programm begrenzen
 
Hast Du in der Verarbeitungsroutine, ich nehme an eine Schleife, auch
Delphi-Quellcode:
Application.ProcessMessages
eingebaut?

Wenn nicht ist es schwierig für andere Processe die CPU zu bekommen.
Ich finde es gut wenn ein Programm sich soviel CPU nimmt wie noch da ist,
aber auch nur dann wenn es sich kooperativ verhält.

Application.ProcessMessages ist dann sinnvoll wenn ein Programm
lange Schleifen abzuarbeiten hat. Es ermöglicht es dem Programm
Messages die für das Programm bestimmt sind abzuarbeiten.
Das Programm erscheint dann nicht so, als ob es eingefroren wäre.

Grüße
Klaus

sir-archimedes 18. Jul 2006 10:49

Re: CPU Auslastung für ein Programm begrenzen
 
Könntest du die Verarbeitung nicht in einem separaten Thread machen und diesem eine geringere Priorität zuordnen? Dann würde dein Programm zwar immernoch 100% CPU-Last erzeugen, andere Programme würden aber dennoch besser laufen, da die Priorität des Threads geringer ist...

Andidreas 18. Jul 2006 10:50

Re: CPU Auslastung für ein Programm begrenzen
 
@nils_13
ob mein programm 10 min oder 20 min im hintergrund läuft is mir jux
so lang ich an meinem pc vernünftig weiter arbeiten kann, stellt das ja dann kein problem dar wie lang das läuft...
einfach auf minimieren gehen nach programm start und das programm meldet sich dann von selber zu wort wenns fertig is durch en showmessage ^^

xaromz 18. Jul 2006 11:04

Re: CPU Auslastung für ein Programm begrenzen
 
Hallo,
Zitat:

Zitat von Klaus01
Wenn nicht ist es schwierig für andere Processe die CPU zu bekommen.
Ich finde es gut wenn ein Programm sich soviel CPU nimmt wie noch da ist,
aber auch nucr dann wenn es sich kooperativ verhält.

Wie ich oben schon geschrieben habe, ist es (außer das Programm erhöht die eigene Priorität) schwer, sich nicht kooperativ zu verhalten. Windows lässt es gar nicht zu, dass ein Programm die Ausführung anderer Programme verhindert. Dafür sorgt das Präemptive Multitasking.

Gruß
xaromz

Balu der Bär 18. Jul 2006 11:37

Re: CPU Auslastung für ein Programm begrenzen
 
Zitat:

Zitat von Klaus01
Hast Du in der Verarbeitungsroutine, ich nehme an eine Schleife, auch
Delphi-Quellcode:
Application.ProcessMessages
eingebaut?

Warum sollte das die CPU-Auslastung mindern? :gruebel:

Andidreas 18. Jul 2006 11:54

Re: CPU Auslastung für ein Programm begrenzen
 
Zitat:

Zitat von xaromz
Hallo,
ich kann Deinem Screenshot nicht entnehmen, dass das Programm den ganzen Arbeitsspeicher belegt. Da steht doch: "Verfügbar: 144416KB".

stimmt... hab ich übersehen...

Zitat:

Zitat von xaromz
Was die Prozessorauslastung angeht: Jedes Programm versucht, so viel Prozessorzeit zu nutzen wir möglich. Das ist auch so gewollt. Eigentlich sollte Windows dafür sorgen, dass auch alle anderen Programme nicht zu kurz kommen. Wenn Du also Dein Programm nicht auf TimeCritical gestellt hast, sollte das kein Problem darstellen. Wenn doch, dann poste mal etwas Code, für Deine Aufgabe scheinen mir 5-10 Min. irgendwie etwas hoch.
Gruß
xaromz

nein auf timecritical hab ich es nicht gestellt... weiß gar nicht wie das geht :oops:
hmm wieso sollt das zuviel zeit sein 5-10 min???
Source Code werd ich noch posten aber in nem extra beitrag...

@klaus01
nein das application.processmessages hab ich noch nicht drinne...
inwiefern kann mir das helfen bzw. was bewirkt das???

@dominik.boehm
ich hab leider noch nicht mit threads gearbeitet bzw. einen thread programmiert!

hat sonst noch jemand ne idee wie ich das hinkriege???

Andidreas 18. Jul 2006 11:56

Re: CPU Auslastung für ein Programm begrenzen
 
hier noch der source code von der routine die das excel erstellt:

Delphi-Quellcode:
procedure TMain_Form.prCreateXls(iAnzRec : Integer);

var
bl                                         : Boolean;
oleExcelApp, oleExcelSheets, oleExcelWorkb : OleVariant;
i, iCell, iCount, iRow                     : Integer;
sDate, sFile, sPath, sRow, sXlsFile        : String;
txtFile                                    : TextFile;
wRC                                        : Word;

begin

  //Paths
  sDate := FormatDateTime('yyyymmdd', Date);
  sFile := 'U:\Programmierung\LOG\Router_Tab\Excel\ROUTES_TAB_' + sDate;
  sPath := '..\Output\ROUTES_Convert_' + sDate + '.txt';

  //Create .xls / Set Column Format / Create Header
  oleExcelApp := CreateOleObject('Excel.Application');
  oleExcelWorkb := oleExcelApp.Workbooks.Add;
  oleExcelSheets := oleExcelworkb.WorkSheets.Add;
  oleExcelSheets.Name := 'Router Tab vom ' + sDate;

  iRow := 1;

  For i := 1 To 7 Do
  Begin
    oleExcelSheets.Columns[i].NumberFormat := '@';
  End;


  For i := 1 To 7 Do
  Begin
    iCell := i;
    oleExcelSheets.Cells[iRow, iCell].Font.FontStyle := 'Bold';
    If i = 1 Then oleExcelSheets.Cells[iRow, iCell].Value := 'Land';
    If i = 2 Then oleExcelSheets.Cells[iRow, iCell].Value := 'PLZ Von';
    If i = 3 Then oleExcelSheets.Cells[iRow, iCell].Value := 'PLZ Bis';
    If i = 4 Then oleExcelSheets.Cells[iRow, iCell].Value := 'O - Sort';
    If i = 5 Then oleExcelSheets.Cells[iRow, iCell].Value := 'D - Depot';
    If i = 6 Then oleExcelSheets.Cells[iRow, iCell].Value := 'D - Sort';
    If i = 7 Then oleExcelSheets.Cells[iRow, iCell].Value := 'Barcode ID';
  End;


  //Assign .txt File for Input
  {$I-}
  AssignFile(txtFile, sPath);
  Reset(txtFile);
  iCount := 100;
  iRow := 2;

  While Not EOF(txtFile) Do
  Begin

    Readln(txtFile, sRow);

    //Add sRow to Excel Cells

    For i := 1 To 7 Do
    Begin
      iCell := i;
      If i = 1 Then oleExcelSheets.Cells[iRow, iCell].Value := Copy(sRow, 1, 2);
      If i = 2 Then oleExcelSheets.Cells[iRow, iCell].Value := Copy(sRow, 3, 9);
      If i = 3 Then oleExcelSheets.Cells[iRow, iCell].Value := Copy(sRow, 12, 9);
      If i = 4 Then oleExcelSheets.Cells[iRow, iCell].Value := Copy(sRow, 21, 4);
      If i = 5 Then oleExcelSheets.Cells[iRow, iCell].Value := Copy(sRow, 25, 4);
      If i = 6 Then oleExcelSheets.Cells[iRow, iCell].Value := Copy(sRow, 29, 4);
      If i = 7 Then oleExcelSheets.Cells[iRow, iCell].Value := Copy(sRow, 33, 3);
    End;

    iRow := iRow + 1;

    //Set Progress in Progress Bar
    If iRow = iCount Then
    Begin
      ProgBar2.Position := Round((100 * iRow) / iAnzRec);
      iCount := iCount + 100;
    End;

  End;

  CloseFile(txtFile);
  {$I+}

  //Examine whether File is present
  bl := FileExists(sFile + '.xls');
  If bl = True Then
  Begin
    wRC := MessageDlg('File is allready present!' +#13+ 'Clear File?', mtInformation, mbYesNo, 0);
    If wRC = mrYes Then
    Begin
      bl := DeleteFile(sFile + '.xls');
      If bl = False Then
      Begin
        ShowMessage('Error with File Clear!');
      End;
    End
    Else
    Begin
      ShowMessage('File would be Overwritten!');
    End;
  End;



  //Save as .xls File
  sXlsFile := ChangeFileExt(sFile, '.xls');

  Try
    oleExcelWorkb.Close(true, sXlsFile, false);
  Except
    ShowMessage('Save To File Error');
  End;

  //Excel freigeben
  oleExcelSheets := Unassigned;
  oleExcelWorkb := Unassigned;
  oleExcelApp.Quit;
  oleExcelApp   := Unassigned;

  ProgBar2.Position := 0;
  lbl_sts_xls.Caption   := 'Export to Excel. OK';
  lbl_sts_xls.Font.Size := 8;
  lbl_sts_xls.Font.Color := clGreen;
  Main_Form.Refresh;

  bitbtn_exit.Enabled := True;

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz