Programm läuft nur in Schnecken-Tempo
-
Hallo alle zusammen,
ich hoffe ihr könnt mir helfen, bin gerade ziemlich verzweifelt.
Mein Proglem:
Ich habe gerade mein Programm auf dem Zielrechner laufen lassen. Die Funkionen stimmen, aber es ist so ELENDIG LANGSAM, dass ich nach jedem Button-Klick mir ne Tasse Kaffee kochen könnte, bis sich das Fenster wieder aktuallisiert hat.

Auf meinem Entwicklungs-Computer habe ich nicht die geringsten Schwierigkeiten. Nach GDI-Leaks habe ich keine.
Gut der Zeilrechner ist um einiges schwächer an Leistung, aber Laut Task-Manager ist der Rechner alles andere als an der Grenze.
Weiß jemand Rat? Kann es sein, dass es gar nicht an meinem Code liegt?
Ich bedanke mich schon für jeden Beitrag!!
-
Du könntest ja mal ein wenig Zeitmessung einbauen und schauen, was genau so langsam ist (und ob das Verhältnis von Entwicklungs- zu Zielrechner halbwegs hinkommt oder dieser Programmteil wirklich übermäßig langsam ist). Ansonsten ist es sicher für alle hier schwer, genaueres zu sagen, ohne genaueres über dein Programm zu wissen.
-
Wenn der Zielrechner ansonsten läuft, liegt es auf alle Fälle an Deinem Code. Aber ohne genaueres zu wissen, kann man nicht genauer antworten.
-
Vielen Dank,
_matze schrieb:
Du könntest ja mal ein wenig Zeitmessung einbauen und schauen, was genau so langsam ist (und ob das Verhältnis von Entwicklungs- zu Zielrechner halbwegs hinkommt oder dieser Programmteil wirklich übermäßig langsam ist). Ansonsten ist es sicher für alle hier schwer, genaueres zu sagen, ohne genaueres über dein Programm zu wissen.
gute Idee, ich werde mal ne Zeitmessung einbinden um die Suche einzuschränken.
Mox schrieb:
Wenn der Zielrechner ansonsten läuft, liegt es auf alle Fälle an Deinem Code. Aber ohne genaueres zu wissen, kann man nicht genauer antworten.
Zunächst mal ganz grob über mein WinAPI-Programm:
es kommuniziert mit einem OPC-Server, zeigt die Werte an, und kann auch den Verlauf einer Größe in ein Diagramm zeichnen (Osziloskop-ähnlich). Das Programm ist aber auch schon ohne das Zeichnen des Diagrammes zu langsam.
Zielrechner ist ein Bedienpult-Rechner von Siemens (Windows XP).Wenn ich mit der Zeitmessung was gefunden hab, werde ich auf den Teil detaillierter eingehen.
Gruß D_Lar
-
Hab jetzt Zeitmessungen an ein paar Stellen durchgeführt. Eigentlich dachte ich, dass es an der Kommunikation mit dem OPC-Server liegt, aber diese Zeiten sind in Ordnung.
Wenn ich aber versuche, das Fenster zu verschieben, dauert es etwa 15-40 sec bis es sich verschiebt. Oder wenn ich auf einen Button klicke, dauert es z.B. 10 sec bis die Buttonfunktion aufgefrufen wird.Woran kann das liegen? Ich hab 2 Timer engebaut, welche Werte aktuallisieren. Können die der Grund dafür sein?
Vielen Dank für eure Hilfe!!
-
D_Lar schrieb:
Ich hab 2 Timer engebaut, welche Werte aktuallisieren. Können die der Grund dafür sein?
Schalte sie ab, dann weißt du es.

-
Behandelst Du WM_PAINT, ohne BeginPaint/EndPaint aufzurufen?
-
_matze schrieb:
Schalte sie ab, dann weißt du es.

Hab es gemacht, und DA liegt der Fehler irgenwo begraben. Sobald ich die beiden Timer abschalte, funktioniert es.
Hier mal Code meiner Timer:
case WM_CREATE:{ ... SetTimer(hWnd,IDT_TIMER1,100,0);//Timer für einlesen von StartSignal SetTimer(hWnd,IDT_TIMER2,500,0);//Timer für Aktualisierung von weiteren Werten ... } case WM_TIMER: switch (wParam) { case IDT_TIMER1: PLCStart(); //liest das Startsignal ein break; case IDT_TIMER2: AktualLimStat(hWnd,0);//Liest Werte ein, und aktuallisiert die entsprechenden Bereiche im Fenster. break; }Jetzt weiß ich zwar, dass hier irgendwo der fehler ist, aber ich finde ihn nicht.
Kann es sein, dass die Timer zu knapp eingestellt ist, und so keine Zeit mehr für die Aktuallisierung des Fensters bleibt?
P.S. : falls es euch interessiert, hier noch ein Bild von meiner Oberfläche:
http://www.imagebanana.com/view/swcm6qjw/meinProg.png
-
Jetzt kannst du doch noch einen Schritt weitergehen und die Dauer dieser beiden Funktionen, die per Timer aufgerufen werden, messen. Ist die Zeit zufällig deutlich größer als auf deinem Entwicklungsrechner? Wenn ja, woran genau liegt es?
EDIT: Nachmessen ist immer besser als raten.

-
Zusätzlich könnte man auch statt "durchlaufenden" Timern Einweg-Timer nehmen. Etwa so:
case WM_CREATE:{ ... TimerOnce( hWnd, IDT_TIMER1, 100 ); //Timer für einlesen von StartSignal TimerOnce( hWnd, IDT_TIMER2, 500 ); //Timer für Aktualisierung von weiteren Werten ... } case WM_TIMER: switch (wParam) { case IDT_TIMER1: PLCStart(); //liest das Startsignal ein TimerOnce( hWnd, IDT_TIMER1, 100 ); //Timer für einlesen von StartSignal break; case IDT_TIMER2: AktualLimStat(hWnd,0);//Liest Werte ein, und aktuallisiert die entsprechenden Bereiche im Fenster. TimerOnce( hWnd, IDT_TIMER2, 500 ); //Timer für Aktualisierung von weiteren Werten break; }So vermeidest du Nachrichtenstau.
-
Ich würde in jedem Fall ein InvalidateRect ausführen und nur in WM_PAINT zeichnen...