amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > CPU Belastung bei MUI-Application [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

31.12.2002, 10:44 Uhr

StefanHaegele
Posts: 281
Nutzer
Hallo,

habe erstaunt festgestellt, dass ein MUI-Application, welche noch kein Window an die Application gebunden hat, bei der Abfrage

( while ( DoMethod( MUIO_App, MUIM_Application_NewInput, &signal ) != MUIV_Application_ReturnID_Quit )
{
if ( signal )
{
signal = Wait( signal );
}
}

die CPU Belastung auf 80% - 100% steigt. Sobald man ein Window anhängt sinkt die CPU Belastung auf 3%. Da ich die Windows aber erst bei Bedarf binde, habe ich bis jetzt immer ein Dummywindow gebunden.

Gibt es hier noch eine andere Möglichkeit ?


Danke
Stefan


[ Dieser Beitrag wurde von StefanHaegele am 31.12.2002 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

02.01.2003, 14:03 Uhr

Holger
Posts: 8116
Nutzer
Also erstmal ist es überhaupt keine gute Idee, ein und dieselbe Variable für die Signale, auf die man wartet und die man tatsächlich empfangen hat, zu benutzen.
Und wenn Du kein Signal hast, auf das Du wartest, produzierst Du eine permanente Schleife. Die wird dann natürlich mit jedem verfügbaren CPU-Cycle ausgeführt.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

02.01.2003, 14:14 Uhr

StefanHaegele
Posts: 281
Nutzer
Das gleiche passiert aber auch , wenn man 2 verschiedene Variablen für die Signale verwendet. Ich verstehe auch nicht, wieso es schlecht sein soll, hier die gleiche Variable zu benutzen ?

[ - Antworten - Zitieren - Direktlink - ]

02.01.2003, 14:20 Uhr

Holger
Posts: 8116
Nutzer
Wenn zwei Dinge völlig unterschiedliche Bedeutung haben, sollte man sie eben nicht in einer Variablen speichern.
Und entscheidend ist die andere Sache: Wenn Du kein Signal hast, wartest Du auch nicht. Wenn Du nicht wartest, rotiert Dein Programm in einer Schleife.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

02.01.2003, 16:41 Uhr

thomas
Posts: 7718
Nutzer

Wait(0) kommt nie zurück, damit wartet man ewig. Es gibt auch keine CPU-Belastung.

signal = Wait(signal) ist deshalb schlecht, weil du normalerweise nur ein Signal zurückbekommst, und dir damit die anderen Signale ausmaskierst. Wenn du nur auf ein Signal wartest, brauchst du das Ergebnis nicht auszuwerten, du weißt ja, was passiert ist.

Normalerweise macht man das so:

signals = signal1 | signal2 |SIGBREAKF_CTRL_C;
sigrecv = Wait (signals);
if (sigrecv & signal1)
{
}
if (sigrecv & signal2)
{
}
if (sigrecv & SIGBREAKF_CTRL_C)
{
}

Mit MUI kenne ich mich nicht aus, aber vermutlich kommt DoMethod hier sofort mit einem Fehlercode zurück, weil MUIM_Application_NewInput ohne Fenster keinen Sinn macht. Du solltest dir den Rückgabewert mal ausgeben lassen.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

02.01.2003, 21:31 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von thomas:

Wait(0) kommt nie zurück, damit wartet man ewig. Es gibt auch keine CPU-Belastung.

Richtig, aber wenn Du genauer auf den Quellcode schaust, siehst Du, daß er wenn signal==0 ist, Wait() gar nicht aufruft.

Ich programmiere auch nicht mit MUI, aber es spielt ja auch keine Rolle, ob die Variable signal aufgrund eines Fehlers oder einer normalen Operation 0 ist. Wenn kein Intuition-Fenster geöffnet wurde, ist i.A. kein Signal durch Intuition belegt worden, und wenn MUI oder die Anwendung kein weiters Signal benutzen, bzw. es durch die fehlerhafte Benutzung der signal-Variable überschrieben wurde, ist kein sinnvolles Wartekriterium mehr vorhanden.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

04.01.2003, 14:54 Uhr

thomas
Posts: 7718
Nutzer
Zitat:
Richtig, aber wenn Du genauer auf den Quellcode schaust, siehst Du, daß er wenn signal==0 ist, Wait() gar nicht aufruft.

Stimmt Auffällig.

while (DoMethod)
{
}

Klar, daß Busy-Wait die CPU belastet.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

04.01.2003, 15:52 Uhr

StefanHaegele
Posts: 281
Nutzer
Seid ihr sicher ?

Dies ist nämlich die std. MUI-Mainloop.

Stefan

[ - Antworten - Zitieren - Direktlink - ]

06.01.2003, 15:44 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von StefanHaegele:
Dies ist nämlich die std. MUI-Mainloop.

Was nicht automatisch heißt, daß es richtig ist. Erstens sind MUI-Anwendungen eh für langsames und träges Verhalten bekannt, und zweitens muß der Verfasser dieses main-loops ja nicht an die Möglichkeit keiner geöffneten Fenster gedacht haben.
Wobei die if-Anweisung darauf hindeutet, daß jemand an die Möglichkeit, daß signal==0 sein kann gedacht hat, die ganze Schleifenkonstruktion insgesamt ist aber unter diesem Gesichtspunkt katastrophal, selbst wenn man die falsche Benutzung der Variablen ignoriert.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

06.01.2003, 16:08 Uhr

tokai
Posts: 1071
Nutzer
Das ist doch gar nicht so schwierig... man sollte nur die docs richtig lesen. Steht (fast) alles drin. :)

Original by MUI-Oberguru Stefan :)

code:
/*
** This is the ideal input loop for an object oriented MUI application.
** Everything is encapsulated in classes, no return ids need to be used,
** we just check if the program shall terminate.
** Note that MUIM_Application_NewInput expects sigs to contain the result
** from Wait() (or 0). This makes the input loop significantly faster.
*/

        set(window,MUIA_Window_Open,TRUE);

        {
                ULONG sigs = 0;

                while (DoMethod(app,MUIM_Application_NewInput,&sigs) != MUIV_Application_ReturnID_Quit)
                {
                        if (sigs)
                        {
                                sigs = Wait(sigs | SIGBREAKF_CTRL_C);
                                if (sigs & SIGBREAKF_CTRL_C) break;
                        }
                }
        }

--
http://www.christianrosentreter.de

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > CPU Belastung bei MUI-Application [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.