Programm zu Systemlastig

Anfängerfragen zum Programmieren mit PureBasic.
Zulman
Beiträge: 23
Registriert: 29.12.2008 22:19

Programm zu Systemlastig

Beitrag von Zulman »

Hallo,
ich habe es jetzt (auch mit eurer Hilfe :) ) geschaft, ein Programm zu programmieren, das alle 30 Sekunden schaut ob die Datei auf dem ftp-Server der Datei auf dem PC entspricht und wenn das nicht so ist die Datei vom PC automatisch hochläd. Dafür habe ich eine Setup.exe , welche alle erforderlichen Daten einmalig abfrägt und in Dateien speichert, eine uploader.exe , welche die Datei überprüft und hochläd und eine uninstall.exe die den im Hintergrund laufenden Prozess beendet und alle erstellten Dateien zur connection auf den FTP wieder löscht. Mein Problem ist nun, dass die uploader.exe einfach zu systemlastig ist. Sie benötigt teilweise 90% meiner CPU-Leistung (AMD Athlon 2200+ Prozessor). Und das ist eindeutig zu viel ;) meine Frage jetzt... was kann ich ändern, damit es resourcensparender abläuft. Hier der code von der uploader.exe . Wenn ihr noch die codes von den anderen 2 exen braucht dann sagt bescheit. Mich würde auch interessieren, was ich eventuel an sich unkomplizierter oder mit weniger aufwand ausführen könnte. Bin für jede konstruktive Kritik dankbar ;). (Also bitte nicht einfach nur schreiben z.B. "Total unübersichtlich und schlecht gemacht". Mir ist wichtig, was "Profis" von dem ganzen halten, weil ich mich wirklich verbessern will.

Code: Alles auswählen

#CSIDL_INTERNET = $1
#CSIDL_PROGRAMS = $2
#CSIDL_CONTROLS = $3
#CSIDL_PRINTERS = $4
#CSIDL_PERSONAL = $5
#CSIDL_FAVORITES = $6
#CSIDL_STARTUP = $7
#CSIDL_RECENT = $8
#CSIDL_SENDTO = $9
#CSIDL_BITBUCKET = $A
#CSIDL_STARTMENU = $B
#CSIDL_MYDOCUMENTS = $C
#CSIDL_MYMUSIC = $D
#CSIDL_MYVIDEO = $E
#CSIDL_DESKTOPDIRECTORY = $10
#CSIDL_DRIVES = $11
#CSIDL_NETWORK = $12
#CSIDL_NETHOOD = $13
#CSIDL_FONTS = $14
#CSIDL_TEMPLATES = $15
#CSIDL_COMMON_STARTMENU = $16
#CSIDL_COMMON_PROGRAMS = $17
#CSIDL_COMMON_STARTUP = $18
#CSIDL_COMMON_DESKTOPDIRECTORY = $19
#CSIDL_APPDATA = $1A
#CSIDL_PRINTHOOD = $1B
#CSIDL_LOCAL_APPDATA = $1C
#CSIDL_ALTSTARTUP = $1D
#CSIDL_COMMON_ALTSTARTUP = $1E
#CSIDL_COMMON_FAVORITES = $1F
#CSIDL_INTERNET_CACHE = $20
#CSIDL_COOKIES = $21
#CSIDL_HISTORY = $22
#CSIDL_COMMON_APPDATA = $23
#CSIDL_WINDOWS = $24
#CSIDL_SYSTEM = $25
#CSIDL_PROGRAM_FILES = $26
#CSIDL_MYPICTURES = $27
#CSIDL_PROFILE = $28
#CSIDL_SYSTEMX86 = $29
#CSIDL_PROGRAM_FILESX86 = $2A
#CSIDL_PROGRAM_FILES_COMMON = $2B
#CSIDL_PROGRAM_FILES_COMMONX86 = $2C
#CSIDL_COMMON_TEMPLATES = $2D
#CSIDL_COMMON_DOCUMENTS = $2E
#CSIDL_COMMON_ADMINTOOLS = $2F
#CSIDL_ADMINTOOLS = $30
#CSIDL_CONNECTIONS = $31
#CSIDL_COMMON_MUSIC = $35
#CSIDL_COMMON_PICTURES = $36
#CSIDL_COMMON_VIDEO = $37
#CSIDL_RESOURCES = $38
#CSIDL_RESOURCES_LOCALIZED = $39
#CSIDL_COMMON_OEM_LINKS = $3A
#CSIDL_CDBURN_AREA = $3B
#CSIDL_COMPUTERSNEARME = $3D
#CSIDL_FLAG_PER_USER_INIT = $800
#CSIDL_FLAG_NO_ALIAS = $1000
#CSIDL_FLAG_DONT_VERIFY = $4000
#CSIDL_FLAG_CREATE = $8000
#CSIDL_FLAG_MASK = $FF00

Structure EMID
    cb.b
    abID.b[1]
EndStructure



Procedure.s GetSystemFolder (folder)
    *itemid.ITEMIDLIST = #Null
    If SHGetSpecialFolderLocation_ (0, folder, @*itemid) = #NOERROR
        location$ = Space (#MAX_PATH)
        If SHGetPathFromIDList_ (*itemid, @location$)
            ProcedureReturn location$
        EndIf
    EndIf
EndProcedure



#Intervall = 30000 
Zeit = ElapsedMilliseconds() 
InitNetwork()
folder$ = GetSystemFolder (#CSIDL_PERSONAL)

Repeat
If ReadFile(8, folder$ + Chr(92) + "exit.txt") = 0 
If ElapsedMilliseconds() > Zeit + #Intervall 



OpenFile(1, folder$ + Chr(92) + "name.txt")
name$ = ReadString(1)
OpenFile(3, folder$ + Chr(92) + "data.txt")
datei$ = ReadString(3)
  
If GetFileDate(folder$ + Chr(92) + name$, #PB_Date_Modified) = GetFileDate(datei$, #PB_Date_Modified)

Else
  OpenFile(0, folder$ + Chr(92) +"ftp_adress.txt")
  OpenFile(6, folder$ + Chr(92) + "Benutzer.txt")
  OpenFile(7, folder$ + Chr(92) + "ftppw.txt")
  OpenFTP(0, ReadString(0), ReadString(6),ReadString(7) )
  CloseFile(0)
  CloseFile(3)
  CloseFile(5)
  CloseFile(6)
  CloseFile(7)
  SendFTPFile(0, datei$, name$)
  CloseFile(1)
  CopyFile(datei$, folder$ + Chr(92) + name$)
  EndIf
EndIf 

Else
End
EndIf
ForEver

Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

Beitrag von Deluxe0321 »

Auch wenn ich kein Profi bin

Code: Alles auswählen

[..]
Repeat
If ReadFile(8, folder$ + Chr(92) + "exit.txt") = 0
If Not ElapsedMilliseconds() > Zeit + #Intervall 
  Delay(3)
Else
[..]
Dein Code rennt ungebremst durch. Ein kleines Delay dürfte wunder wirken ;)
Edit:
Zudem lass doch alle Daten (Name,PWD usw..) aus einer Datei lesen, macht den Code übersichtlicher.. und ein "not" in deinen if's macht den Code noch lesbarer.
Lass auch die geöffneten Dateien gleich wieder schließen, kann sonst probleme geben ^^

Gruß Marvin
Zuletzt geändert von Deluxe0321 am 30.12.2008 19:04, insgesamt 1-mal geändert.
Zulman
Beiträge: 23
Registriert: 29.12.2008 22:19

Beitrag von Zulman »

jo ok danke :) aber ich hab auch als das noch nicht eingebaut war mit dem ReadFile schon sehr hohe prozessorbelastung bemerkt... ich werds trotzdem mal versuchen vllt bringts zumindest ein bisschen. Gut vorstellbar währe es ja.

Edit: Ja ok... wie macht man das denn, dass man alle Infos aus einer Datei auslesen kann? Währe wirklich praktisch, hab ich mir auch schon gedacht aber wusst halt nicht wie man das macht^^

Edit2: Ah, ich dacht die überprüfung der Datei läuft ungebremst durch... aber mein ganzes Prog tut das ja xD na das ist wirklich ein Grund warum das so systemlastig ist. Hab grad ma ne MessageRequester meldung eingebaut um zu sehn obs klappt und da is mir das aufgefallen... danke für den Hinweis
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Meine Tipps:
Verstecktes Fenster + Systemtray (u.a. zum Beenden)

Durch das Fenster ist auch ein Timer möglich, im Eventloop wird dann nur
der SysTray bearbeitet (evtl auch andere Ereignisse, die das Programm
veranlassen, sich zu beenden). Systemlast sollte dann bei 0% liegen.

PS: Die Konstanten sind in PB bereits vordeklariert, kannste weglassen.

So wie es jetzt ist, auch mit einem Delay, ist es unbenutzbar, jedenfalls
auf einem Multitaskingsystem wie Windows. Andere Möglichkeit wäre ein
Systemdienst, nur ums zu erwähnen
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Zulman
Beiträge: 23
Registriert: 29.12.2008 22:19

Beitrag von Zulman »

was meinst du mit unnutzbar? ich hab jetzt nen delay eingebaut und eigendlich funktionierts ja jetzt... also müsste es doch nutzbar sein oder nich?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Zulman hat geschrieben:was meinst du mit unnutzbar? ich hab jetzt nen delay eingebaut und eigendlich funktionierts ja jetzt... also müsste es doch nutzbar sein oder nich?
Nein, es belastet trotzdem das System zu sehr, es ist nicht einfach zu
beenden, somit dem Anwender unzumutbar.

Für sowas sollte man den Programmierer zu schadenersatz verdonnern (scherz) :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Zulman
Beiträge: 23
Registriert: 29.12.2008 22:19

Beitrag von Zulman »

xD dagegen hab ich ja ne ReadMe die ich machen werde wenn ichs veröffentliche^^ da steht dann schon drin, dass man mich für nix schadensersatzpflichtig machen kann ;D . Und wie lasse ich das in so nem versteckten Fenster ausführen? Bzw. wie kann mandas dann einfacher beenden? Ich kann natürlich noch ne exe schreiben die das Prog nur beendet aber nicht deinstalliert... Du musst immer sehn was n noob wie ich für Möglichkeiten hat^^ Würde mich aber sehr über ein Erklährung wie man das macht freuen... vllt n code mit dazugehöriger Beschreibung mit drin oder so^^
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Ein bißchen in die Hilfe schauen würde ja nicht schaden.
#PB_Window_Invisible erstellt ein unsichtbares Fenster, das Du z.B. als
Aboutbox nutzt, welche man im SysTray öffnen kann.
Dort per Kontextmenü auch das beenden einbauen. Ein bissel lesen und
Du wirst das schon schaffen und lernst mehr dabei, als wenn Du hier Löcher
in den Bauch fragst und dazu noch warten mußt, bis einer Antwortet :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Zulman
Beiträge: 23
Registriert: 29.12.2008 22:19

Beitrag von Zulman »

ok werd ich machen... aber ich hab trotzdem noch fragen die mir (glaube ich zumindest) die hilfe nicht beantwortet. Klingt jetzt vllt n bisschen komisch weils warscheinlich jeder außer mir weiß xD aber was ist denn genau eine Aboutbox und was ist der/die/das SysTray? Und was ist das Kontextmenü? so ich glaube wenn ich das weiß könnte ichs schaffen ;)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Zulman hat geschrieben:ok werd ich machen... aber ich hab trotzdem noch fragen die mir (glaube ich zumindest) die hilfe nicht beantwortet. Klingt jetzt vllt n bisschen komisch weils warscheinlich jeder außer mir weiß xD aber was ist denn genau eine Aboutbox und was ist der/die/das SysTray? Und was ist das Kontextmenü? so ich glaube wenn ich das weiß könnte ichs schaffen ;)
Aboutbox findeste in fast jedem Programm, meist im Menü/Hilfe/Über
Systray sind die kleinen Icons unten rechts, neben der Uhr
Kontextmenü erscheint bei benutzen der sekundären Maustaste (meist rechte)

Nun schaff mal schön :allright:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten