IPB

Benvenuto Visitatore ( Log In | Registrati )

Seguici su:    
 
Reply to this topicStart new topic
> Spiegazione codice
Ciozun
messaggio Monday 18 January 2016 - 20:17
Messaggio #1

Special User
Gruppo icone

Gruppo: Membri
Messaggi: 106
Iscritto il: Sun 26 October 2014 - 22:19
Utente Nr.: 62.702
Feedback: 0 (0%)

Codice Amico 3DS:
2208-5264-9252



Salve,

starei cercando di capire come implementare dei thread in un homebrew 3DS, ma nell'esempio di devkitPRO ho trovato diverse cose che non mi sono chiare. Ecco qui il codice con dei commenti riportanti i miei dubbi:

CODICE
#include <string.h>
#include <stdio.h>
#include <3ds.h>

#define NUMTHREADS 3
#define STACKSIZE (4 * 1024)

volatile bool runThreads = true; // perché l'ha creata volatile?

void threadMain(void *arg) // è un puntatore... non mi sembra. "arg" sta per? E' una variabile normale (che poi void???) o è una parola riservata?
{
    u64 sleepDuration = 1000000ULL * (u32)arg;  // 1000000ULL??? (u32)arg che vuol dire? (so per cosa sta u32)
    int i = 0;
    while (runThreads)
    {
        printf("thread%d says %d\n", (int)arg, i++);
        svcSleepThread(sleepDuration);
    }
}

int main(int argc, char** argv)
{
    gfxInitDefault();
    consoleInit(GFX_TOP, NULL);

    Thread threads[NUMTHREADS];
    int i;
    s32 prio = 0;
    svcGetThreadPriority(&prio, CUR_THREAD_HANDLE); // tutta la linea
    printf("Main thread prio: 0x%lx\n", prio);

    for (i = 0; i < NUMTHREADS; i ++)
    {
        // The priority of these child threads must be higher (aka the value is lower) than that
        // of the main thread, otherwise there is thread starvation due to stdio being locked.
        threads[i] = threadCreate(threadMain, (void*)((i+1)*250), STACKSIZE, prio-1, -2, false); // tutta la linea
        printf("created thread %d: %p\n", i, threads[i]);
    }

    // Main loop
    while (aptMainLoop())
    {
        gspWaitForVBlank();
        hidScanInput();

        u32 kDown = hidKeysDown();
        if (kDown & KEY_START)
            break; // break in order to return to hbmenu

        // Flush and swap framebuffers
        gfxFlushBuffers();
        gfxSwapBuffers();
    }

    // tell threads to exit & wait for them to exit
    runThreads = false;
    for (i = 0; i < NUMTHREADS; i ++)
    {
        threadJoin(threads[i], U64_MAX); // Join dovrebbe interrompere il thread, giusto? U64_MAX??
        threadFree(threads[i]); // Sarebbe?
    }

    gfxExit();
    return 0;
}


Grazie!


--------------------
Mi sono rotto di videogiocare
 Go to the top of the page
 
+Quote Post
Cusy
messaggio Monday 18 January 2016 - 20:38
Messaggio #2

Fanatic GBA/NDS
Gruppo icone

Gruppo: Membri
Messaggi: 1.052
Iscritto il: Sun 17 March 2013 - 21:20
Da: Veneto, Italia
Utente Nr.: 60.589
Feedback: 0 (0%)

Codice Amico 3DS:
0447-5676-8144



ULL = Unsigned Long Long, ovvero almeno 64 bit.
void* è un puntatore senza specifica di tipo, ergo a threadMain può essere passata una qualsiasi zona di memoria.
Join non è una funzione di terminazione di un thread (quella sarebbe stop o interrupt, in base al tipo di linguaggio usato), quanto di attesa di terminazione di quel thread per poi processarne il risultato.
Non sono pratico della programmazione 3DS (che per quanto posti sembra una cosa C-Like) quindi provo ad indovinare il resto:
- La prima funzione ti ritorna la priority di un thread, per capire con che priorità andrà in esecuzione sulla CPU
- La seconda istanzia un thread nella memoria allocandolo (probabilmente con una malloc o qualcosa di simile)
- La terza libera la memoria una volta che il thread è finito (altrimenti rimarrebbe occupata e andresti presto out of memory).

Per il resto sto vedendo che ultimamente posti tanta roba in ambito programmazione. Se non sei pratico di linguaggi non ad oggetti forse ti conviene dare prima una occhiata al funzionamento di qualcosa di basilare come C/C++ per capire le dinamiche di malloc-free, le direttive al compilatore, i define e cose simili wink.gif

EDIT: Quasi dimenticavo, volatile indica al compilatore che quella variabile può essere cambiata tra un accesso e l'altro e lo costringe a controllarla di volta in volta (es: un thread secondario la modifica e il thread principale deve controllarla per essere sicuro di leggere il valore corretto, non può asserire non sia stata modificata giusto perché lui non l'ha toccata).

Messaggio modificato da Cusy il Monday 18 January 2016 - 20:41


--------------------
Attualmente in uso:
- New Nintendo 3DS XL - ZMM Limited Edition -- Now Playing: --
- Sony PS4 -- Now Playing: Final Fantasy XII The Zodiac Age
- Sony PSVita -- Now Playing: ---
- PC -- HP 1279 SL -- OS: Windows 7 Professional SP1 (x64) - RAM: 6GB - GPU: Intel HD3000 + AMD 6470 - CPU: Intel i5-2430M@2.4 GHz -- Now Playing: ---
- Macbook Pro Retina Late 2013 -- OS: OSX Sierra 10.12 - RAM 8GB - GPU: Intel Iris - CPU: Intel i5-4258U 2.6ghz -- Now Playing: ---

Mobile:
- iPad Mini 3 16gb WiFi (iOS 10.0.1) -- Now Playing: --
- Xiaomi Redmi Note 4X -- Now Playing: Fate/Grand Order

Con due dita di polvere sopra:
PS3 - PS2 - PSPGo - PSX - X360 - Wii - DSLite
Huawei Ideos U8150 - Vodafone Smart II
 Go to the top of the page
 
+Quote Post
Rinnegatamante
messaggio Monday 25 January 2016 - 02:31
Messaggio #3

Boss GBA/NDS
Gruppo icone

Gruppo: Membri
Messaggi: 493
Iscritto il: Wed 7 April 2010 - 21:03
Utente Nr.: 45.827
Feedback: 3 (100%)




Trovo il wrapper thread recentemente introdotto nelle ctrulib abbastanza dispersivo (preferisco di gran lunga utilizzare direttamente le syscall relative al servizio svc [ https://github.com/smealum/ctrulib/blob/mas...clude/3ds/svc.h ] ) comunque sia, come consigliato da Cusy, prima di guardare a thread secondari e programmazione concorrenziale sarebbe buona norma partire da roba ben più basilare.

Che genere di homebrew staresti sviluppando che richiede l'utilizzo di un thread secondario?

Messaggio modificato da Rinnegatamante il Monday 25 January 2016 - 02:34


--------------------
 Go to the top of the page
 
+Quote Post
Ciozun
messaggio Monday 25 January 2016 - 14:13
Messaggio #4

Special User
Gruppo icone

Gruppo: Membri
Messaggi: 106
Iscritto il: Sun 26 October 2014 - 22:19
Utente Nr.: 62.702
Feedback: 0 (0%)

Codice Amico 3DS:
2208-5264-9252



CITAZIONE (Rinnegatamante @ Monday 25 January 2016 - 02:31) *
Trovo il wrapper thread recentemente introdotto nelle ctrulib abbastanza dispersivo (preferisco di gran lunga utilizzare direttamente le syscall relative al servizio svc [ https://github.com/smealum/ctrulib/blob/mas...clude/3ds/svc.h ] ) comunque sia, come consigliato da Cusy, prima di guardare a thread secondari e programmazione concorrenziale sarebbe buona norma partire da roba ben più basilare.

Che genere di homebrew staresti sviluppando che richiede l'utilizzo di un thread secondario?


L'anno scorso creai un giochino per Windows in Pascal, che utilizzando il prompt, simulava una navicella la quale doveva evitare una serie di asteroidi e totalizzare un punteggio.
"All'epoca" non conoscevo i thread (ed i sottoprogrammi), neanche concettualmente, e feci un casino assurdo per creare l'avanzamento simultaneo degli astreoidi ed il movimento della navetta.
Ora, sapendo l'esistenza dei thread, vorrei implementarli per rendermi il lavoro di conversione più facile, dato che si, il codice è mio, ma non avendo scritto mezzo commento, non capisco tutto.


--------------------
Mi sono rotto di videogiocare
 Go to the top of the page
 
+Quote Post
DaG
messaggio Monday 25 January 2016 - 14:19
Messaggio #5

Expert GBA/NDS
Gruppo icone

Gruppo: Veterani
Messaggi: 2.146
Iscritto il: Fri 14 May 2004 - 11:04
Da: Voghera/Pisa
Utente Nr.: 662
Feedback: 16 (100%)

Codice Amico 3DS:
2680 9485 1564



CITAZIONE (Ciozun @ Monday 25 January 2016 - 14:13) *
CITAZIONE (Rinnegatamante @ Monday 25 January 2016 - 02:31) *
Trovo il wrapper thread recentemente introdotto nelle ctrulib abbastanza dispersivo (preferisco di gran lunga utilizzare direttamente le syscall relative al servizio svc [ https://github.com/smealum/ctrulib/blob/mas...clude/3ds/svc.h ] ) comunque sia, come consigliato da Cusy, prima di guardare a thread secondari e programmazione concorrenziale sarebbe buona norma partire da roba ben più basilare.

Che genere di homebrew staresti sviluppando che richiede l'utilizzo di un thread secondario?


L'anno scorso creai un giochino per Windows in Pascal, che utilizzando il prompt, simulava una navicella la quale doveva evitare una serie di asteroidi e totalizzare un punteggio.
"All'epoca" non conoscevo i thread (ed i sottoprogrammi), neanche concettualmente, e feci un casino assurdo per creare l'avanzamento simultaneo degli astreoidi ed il movimento della navetta.
Ora, sapendo l'esistenza dei thread, vorrei implementarli per rendermi il lavoro di conversione più facile, dato che si, il codice è mio, ma non avendo scritto mezzo commento, non capisco tutto.


Beh, così al volo mi pare di capire che in realtà "quel casino assurdo" è più giusto di quello che hai intenzione di fare adesso. In un gioco di solito è presente un loop principale in cui vengono aggiornate prima tutte le posizioni degli oggetti presenti sulla scena e poi renderizzati solo quelli presenti su schermo.
Mi pare di aver capito che tu, adesso, vorresti fare un thread per ogni asteroide presente su schermo, ma te lo sconsiglio vivamente, anche perché questo non ti faciliterebbe per nulla la vita visto che ti imbatteresti nella programmazione concorrente; probabilmente ti troveresti anche nella situazione che qualche asteroide avanza più velocemente di qualcun altro, in maniera non voluta.
 Go to the top of the page
 
+Quote Post
Ciozun
messaggio Monday 25 January 2016 - 14:36
Messaggio #6

Special User
Gruppo icone

Gruppo: Membri
Messaggi: 106
Iscritto il: Sun 26 October 2014 - 22:19
Utente Nr.: 62.702
Feedback: 0 (0%)

Codice Amico 3DS:
2208-5264-9252



CITAZIONE (DaG @ Monday 25 January 2016 - 14:19) *
CITAZIONE (Ciozun @ Monday 25 January 2016 - 14:13) *
CITAZIONE (Rinnegatamante @ Monday 25 January 2016 - 02:31) *
Trovo il wrapper thread recentemente introdotto nelle ctrulib abbastanza dispersivo (preferisco di gran lunga utilizzare direttamente le syscall relative al servizio svc [ https://github.com/smealum/ctrulib/blob/mas...clude/3ds/svc.h ] ) comunque sia, come consigliato da Cusy, prima di guardare a thread secondari e programmazione concorrenziale sarebbe buona norma partire da roba ben più basilare.

Che genere di homebrew staresti sviluppando che richiede l'utilizzo di un thread secondario?


L'anno scorso creai un giochino per Windows in Pascal, che utilizzando il prompt, simulava una navicella la quale doveva evitare una serie di asteroidi e totalizzare un punteggio.
"All'epoca" non conoscevo i thread (ed i sottoprogrammi), neanche concettualmente, e feci un casino assurdo per creare l'avanzamento simultaneo degli astreoidi ed il movimento della navetta.
Ora, sapendo l'esistenza dei thread, vorrei implementarli per rendermi il lavoro di conversione più facile, dato che si, il codice è mio, ma non avendo scritto mezzo commento, non capisco tutto.


Beh, così al volo mi pare di capire che in realtà "quel casino assurdo" è più giusto di quello che hai intenzione di fare adesso. In un gioco di solito è presente un loop principale in cui vengono aggiornate prima tutte le posizioni degli oggetti presenti sulla scena e poi renderizzati solo quelli presenti su schermo.
Mi pare di aver capito che tu, adesso, vorresti fare un thread per ogni asteroide presente su schermo, ma te lo sconsiglio vivamente, anche perché questo non ti faciliterebbe per nulla la vita visto che ti imbatteresti nella programmazione concorrente; probabilmente ti troveresti anche nella situazione che qualche asteroide avanza più velocemente di qualcun altro, in maniera non voluta.



Beh allora seguii il concetto che stai enunciando tu adesso. linguetta.gif
Quindi mi consigli di creare un unico loop enorme dove mettere tutto dentro? Non verrà troppo intricato?


--------------------
Mi sono rotto di videogiocare
 Go to the top of the page
 
+Quote Post
Aurelio
messaggio Tuesday 26 January 2016 - 00:39
Messaggio #7

DsOs Developer
Gruppo icone

Gruppo: Tecnico
Messaggi: 3.798
Iscritto il: Tue 7 June 2005 - 09:23
Da: Vico Equense(NA) - Milano
Utente Nr.: 5.122
Feedback: 6 (100%)

Codice Amico 3DS:
2664-2091-2256



CITAZIONE (Ciozun @ Monday 25 January 2016 - 14:36) *
Beh allora seguii il concetto che stai enunciando tu adesso. linguetta.gif
Quindi mi consigli di creare un unico loop enorme dove mettere tutto dentro? Non verrà troppo intricato?


Il multithreading è bene usarlo quando vuoi eseguire diverse operazioni totalmente indipendenti. Nel tuo caso col multithreading avresti problemi di desincronizzazione tra i vari asteroidi...
 Go to the top of the page
 
+Quote Post
DaG
messaggio Tuesday 26 January 2016 - 17:24
Messaggio #8

Expert GBA/NDS
Gruppo icone

Gruppo: Veterani
Messaggi: 2.146
Iscritto il: Fri 14 May 2004 - 11:04
Da: Voghera/Pisa
Utente Nr.: 662
Feedback: 16 (100%)

Codice Amico 3DS:
2680 9485 1564



CITAZIONE (Ciozun @ Monday 25 January 2016 - 14:36) *
Beh allora seguii il concetto che stai enunciando tu adesso. linguetta.gif
Quindi mi consigli di creare un unico loop enorme dove mettere tutto dentro? Non verrà troppo intricato?


Alla fine non è così intricato se utilizzi bene il polimorfismo, in fondo è così che vengono fatti tutti i giochi attualmente. Ovvio che i giochi moderni siano tutti multithreading, ma per altri motivi (ad esempio un thread per i calcoli fisici, un thread per il rendering, ecc...).

Io ti consiglio di fare un'interfaccia "IUpdatable" con un metodo update() che verrà poi implementata da ogni oggetto che ha bisogno di muoversi sullo schermo. Poi ti crei una lista di questi oggetti di tipo IUpdatable e dal loop principale richiami il relativo metodo update() in cui ci saranno tutti gli aggiornamenti da fare per l'oggetto in questione.
 Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utenti stanno leggendo questa discussione (1 visitatori e 0 utenti anonimi)
0 utenti:

 

Modalità di visualizzazione: Normale · Passa a: Lineare · Passa a: Outline


RSS Versione Lo-Fi Oggi è il: Tue 28 May 2024- 12:31

.: GBArl.it :. Copyright © 2003-2020, All Rights Reserved.
Loghi, documenti e immagini contenuti in questo Sito appartengono ai rispettivi proprietari,
e sono resi pubblici sotto licenza Creative Commons

Creative Commons License
.::.