KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: Eine Frage zu sceKernelExitGame()
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo, ich hätte mal eine kurze Frage. Wenn ich folgenden Code kompiliere und ausführe, klappt es perfekt. Wenn man die X-Taste drückt, beendet sich das Homebrew und kehrt zurück ins XMB:

Code:
int main()
{
    pspDebugScreenInit();
    SetupCallbacks();

    printf("Hello World by Fly Destination\n");

    SceCtrlData pad;

    while(1)
    {
        sceCtrlReadBufferPositive(&pad, 1);

    if (pad.Buttons & PSP_CTRL_CROSS) {
    pspDebugScreenClear();
    printf("Exiting\n");
    printf("Please Wait...");
    sceKernelExitGame();
    }
    }

    sceKernelSleepThread();
    return 0;
}


Aber wieso klappt es nur, wenn man das while(1) davor setzt? Wenn man den Code so schreiben würde, würde das Homebrew zwar starten, aber wenn man X drückt, würde es sich nicht beenden:

Code:
int main()
{
    pspDebugScreenInit();
    SetupCallbacks();

    printf("Hello World by Fly Destination\n");

    SceCtrlData pad;
        sceCtrlReadBufferPositive(&pad, 1);

    if (pad.Buttons & PSP_CTRL_CROSS) {
    pspDebugScreenClear();
    printf("Exiting\n");
    printf("Please Wait...");
    sceKernelExitGame();
    }

    sceKernelSleepThread();
    return 0;
}


Wieso? Ergibt doch Sinn? Falls die X-Taste gedrückt ist, beende das Spiel...
Aber wieso geht es nicht, wieso muss man das in eine while Schleife packen?

Fly Destination

Aus dem ganz einfachen grund, es ist nicht LUA was standartmässig in einer schleife läuft.
C arbeitet von oben bis unten durch.
Wird x nicht beim abarbeiten gedrückt ist die bedingung "nicht wahr" und wird überstrungen, würdest du C verstehen hättest du es dir selbst beantworten können Wink
Wenn du die X Taste schon beim Starten der EBOOT gedrückt hältst funktioniert es bestimmt. Er liest den Tastenbuffer halt nur ein mal ganz kurz aus und springt dann zu sceKernelSleepThread().

Eine While Schleife dagegen würde sich immer wiederholen bis du sie durch break oder sonstwas beendest.
Der gesammte Code innerhalb der Main-Funktion wird einmal durchlaufen.

Daher funktioniert dein Code oben, weil da eine Schleife vorhanden ist. Daher überprüft die PSP permanent ob die Taste gedrückt ist oder nicht.

Unten fehlt die Schleife. Daher wird dein gesamter Code innerhalb von Bruchteilen durchgearbeitet und auch nur einmal (!). Innerhalb dieser Zeit wirst du die Taste nicht gedrückt bekommen.

MfG ferra
Mal ehrlich warum schreiben hier noch 2 weiter laute rein? Er sollte ertsmal C/C++ lernen und verstehen ansonsten wird das sowieso nichts. Das ist eigentlich das erste was man lernt bei C und wenn das noch nichtmal vorhanden ist wird alles weitere absolut nichts und wenn dann nur C/P und hoffen das es geht.

Sry Fly Destination aber lerne wirklich erstmal C/C++ und dann fang mit der PSP an.
Ich kann C Rolleyes
Und ich weiß auch wofür eine while Schleife gut ist, nur war mir unklar wieso denn das mit den Tastenfunktionen in die while-Schleife muss. Ich meine, dass printf ist ja auch nicht in der while schleife und wird trotzdem die ganze Zeit angezeigt. Laut euch müsste es der Text in printf() nur kurz angezeigt werden, und dann sofort wieder verschwinden. Aber danke für die guten Erklärungen Wink

Fly Destination

Fly Destination :
Ich kann C Rolleyes
Und ich weiß auch wofür eine while Schleife gut ist, nur war mir unklar wieso denn das mit den Tastenfunktionen in die while-Schleife muss. Ich meine, dass printf ist ja auch nicht in der while schleife und wird trotzdem die ganze Zeit angezeigt. Laut euch müsste es der Text in printf() nur kurz angezeigt werden, und dann sofort wieder verschwinden. Aber danke für die guten Erklärungen Wink

Fly Destination


Dank dem sceKernelSleepThread wird dein main Thread einfach gestoppt... dass heißt Bildschirmausgabe bleibt gleich, andere Threads (bsp.: der Exit-Thread) laufen weiter, aber von deiner main wird kein Code mehr ausgeführt.

Referenz-URLs