Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Windows - Multi-threading... questo sconosciuto
Forum - Windows - Multi-threading... questo sconosciuto

Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 23:43
Giovedì, 17/08/2017
Buonasera.

Oggi, per la prima volta, ho provato a mettere insieme un programma in Windows che impiega due thread paralleli. La cosa mi ha procurato non pochi grattacapi, per cui mi sento di chiedere qui se ho seguito un procedimento pertinente oppure no. Dopo aver letto tonnellate di documentazione e sperando di aver capito l'essenziale, ho agito così:

1. Ho predisposto una funzione DWORD ThreadFunction( LPDWORD par ) costituita da un ciclo while che si interrompe se e quando viene impostato un certo flag globale
2. Ho invocato CreateThread() con le impostazioni di default e il flag CREATE_SUSPENDED perché il thread non venisse "avviato" subito e ho memorizzato l'HANDLE restituito
3. Ho inizializzato tutte le variabili globali da usare in ThreadFunction()
4. Ho avviato il ciclo in ThreadFunction() invocando ResumeThread()
5. Periodicamente, ho letto da un altro thread il contenuto delle variabili globali, per usarlo in un ciclo di animazione; non ho provveduto alcun meccanismo di sincronizzazione perché, trattandosi di sola lettura, ho ritenuto non fosse necessario sincronizzare nulla
6. A tempo debito, per interrompere le operazioni ho impostato il flag globale così da determinare l'uscita dal ciclo in ThreadFunction() e fare in modo che ThreadFunction() "ritornasse", invocando implicitamente ExitThread()
7. Ho atteso mezzo secondo tramite WaitForSingleObject() per dare tempo con ultrasicurezza a ThreadFunction() di uscire dal ciclo in corso e a ExitThread() di compiere il suo misterioso dovere
8. Ho usato CloseHandle() per liberare l'HANDLE che avevo ricavato per mezzo di CreateThread()
9. Ho "annullato" l'HANDLE stesso, impostandolo su NULL per evitare di usarlo in modo improprio

In questo modo le cose SEMBRANO funzionare. C'è qualcosa di fuori posto o è un procedimento valido?

Se può servire, specifico che il thread serve a leggere degli input da tastiera e calcolare di conseguenza gli spostamenti di tre oggetti nel contesto di un semplicissimo videogioco. La frequenza di aggiornamento delle coordinate dei tre oggetti viene "moderata" per mezzo di Sleep(1), e le coordinate vengono immesse da ThreadFunction() nelle variabili globali dedicate. Le variabili globali che contengono le coordinate vengono lette da funzioni invocate in un altro thread, per effettuare con GDI il rendering grafico con un frame rate "moderato" anch'esso per mezzo di Sleep(1).

Sul computer monoprocessore da 1.6 GHz che sto usando, con Windows 7, la fluidità visiva è buona; su un altro sistema a sei processori da 3.5 GHz l'uno, con Windows XP, direi che è ottima.


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote