INFOPedia : LSOw32api

HomePage :: Categorie :: Indice :: Ultime modifiche :: Ultimi commenti :: Login/Registrazione

Piccola Guida alle API Windows

(Quello che serve per il corso)

Le informazioni contenute in questa pagina provengono dal sito di MSDN condite da sperimentazioni personali e costituiscono una libera espressione di opinioni personali. Se vi sembrano striminzite, bene! Quello che volevo fare era proprio andare all'essenziale. Per maggiori informazioni va benissimo MSDN. Se credete di trovare errori ditelo pure, ne discuteremo insieme.

Qualche "dritta" per leggere i prototipi.


Una rapida nota sulle convenzioni osservate per alcuni tipi di dati e nomi di variabili. Le API Win32 usano la cosiddetta "Notazione Ungherese" per la denominazione delle variabili. Questa notazione richiede che il nome della variabile sia preceduto da un prefisso che ne indica il tipo, in modo tale da rendere immediata la comprensione del codice.

I tipi di windows


Oltre ai tipi ANSI su Windows vengono definiti molti altri tipi di dato, molto usati nella libreria di sistema, quindi é bene saperli usare.

Tipi interi senza segno

BYTE 8 bit (0 - 255)
WORD 16 bit (0 - 65535)
DWORD 32 bit (0 - 4294967295)
DWORDLONG 64 bit (0 - 18446744073709551615)

HANDLE - identificativo di una risorsa (Thread, Mutex o quant'altro...). E' un intero, ma fate finta di non saperlo. Non fate aritmetica con variabili di questo tipo, davvero.

Puntatori

P<tipo>, LP<tipo>: Puntatore a <tipo> [32 bit] (es. LPWORD, LPCHAR, LPVOID). La differenza tra P ed LP aveva senso nei sistemi a 16 bit (win 3.1). Adesso sono la stessa cosa. Usate LP.

Gestione dei Thread (si legge thréd, con la "e", non thrid con la "i")


CreateThread

Crea un nuovo thread.

Restituisce un HANDLE al nuovo thread. Conservatelo con cura: tutte le chiamate di sistema che manipolano i thread necessitano di questo valore. In ogni funzione troverete sempre un parametro HANDLE hThread, che vuol dire sempre la stessa cosa: su quale thread deve operare la funzione che state invocando.

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  SIZE_T dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID lpParameter,
  DWORD dwCreationFlags,
  LPDWORD lpThreadId
);


lpThreadAttributes
puntatore a una struttura di descrittori di sicurezza. Fondamentamentalmente a noi non serve. (NULL)

dwStackSize
dimensione iniziale dello stack. Usate 0 per il default.

lpstartAddress
la funzione che deve girare nel Thread separato. Questa va dichiarata "DWORD my_func( LPVOID param )", param riceve il valore lpParameter (vedi sotto)

lpParameter
puntatore ai dati passati all funzione nel nuovo thread

dwCreationFlag
FLAG di creazione del thread
+ SUSPENDED, il thread non si avvia automaticamente dopo la creazione (vedi ResumeThread, SuspendThread)

0 default

lpThreadId
Sostanzialmente inutile (NULL)

/* (NdM - Nota di MarKuS)
    se create più di un thread, ad es. in un ciclo, ricordatevi che __non__ potete
    fare affidamento sull'ordine di esecuzione dei diversi thread. */

   
    HANDLE hThreads[N_THREADS];
    for (i=0;i<N_THREADS; i++) {
        hThreads[i] = CreateThread( NULL, 0, my_func, &i, 0, NULL ); /* NO! */
    }   
   
    /* i verrà modificato mille volte prima che il primo dei thread creati si svegli ! */

ResumeThread

Decrementa il numero di sospensioni del thread. Quando il numero di sospensioni è zero, il thread riprende

DWORD WINAPI ResumeThread(
  HANDLE hThread
);


SuspendThread

Sospende il thread (aumenta il numero di sospensioni se il thread è già sospeso)
DWORD WINAPI SuspendThread(
  HANDLE hThread
);



TerminateThread

Uccide un thread senza pietà. Non c'è motivo di usarla.
«TerminateThread è una funzione pericolosa da utilizzare solo nei casi più estremi.» (MSDN)

BOOL WINAPI TerminateThread(
  HANDLE hThread,
  DWORD dwExitCode
);


dwExitCode
Codice di ritorno del Thread terminato

Mutex & Semafori


CreateMutex

Crea un oggetto mutex, o vi accede.

ReleaseMutex

Rilascia un mutex(up).

BOOL WINAPI ReleaseMutex(
  HANDLE hMutex
);


CreateSemaphore

Crea un oggetto semaforo, o vi accede.

HANDLE WINAPI CreateSemaphore(
  LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
  LONG lInitialCount,
  LONG lMaximumCount,
  LPCTSTR lpName
);


lpSemaphoreAttributes
Serve ad impostare politiche di sicurezza. Messo a NULL, utilizza il default. Leggete MSDN per saperne di più

lInitialCount
Il valore iniziale del semaforo. Dev'essere >= 0 e <= lMaximumCount

lMaximumCount
Il valore massimo che il semaforo può assumere. Dev'essere >0.

lpName
Il nome assegnato al semaforo. NULL lascia il semaforo anonimo (va benissimo anche così).


ReleaseSemaphore

Incrementa il semaforo (up)
BOOL WINAPI ReleaseSemaphore(
  HANDLE hSemaphore,
  LONG lReleaseCount,
  LPLONG lpPreviousCount
);


lReleaseCount
La quantità di cui incrementare il semaforo. Il valore dev'essere >0. Se il semaforo supera i limiti impostati in occasione della sua creazione, l'incremento non viene effettuato e la funzione restituisce FALSE.

lpPreviousCount
Puntatore ad una variabile che riceve il precedente valore del semaforo. Se il parametro è NULL il valore precedente non viene restituito.

Return Value

Restituisce zero in caso di errore. Per ottenere maggiori informazioni, chiamate GetLastError

Funzioni di attesa

Le funzioni WaitFor_ sono funzioni polimorfe che bloccano il thread corrente fino al verificarsi della condizione specificata o della scadenza del termine. Il loro comportamento cambia a seconda del tipo di oggetto che viene loro passato

- Mutex & Semafori: acquisizione (lock)
- Thread (terminazione)

WaitForSingleObject

Attende il verificarsi di un evento.

DWORD WINAPI WaitForSingleObject(
  HANDLE hHandle,
  DWORD dwMilliseconds
);


dwMilliseconds
Quanto a lungo attendere l'evento prima di proseguire. Va benissimo INFINITE("aspetta e basta!")

WaitForMultipleObjects

Attende un'insieme di eventi (uno o tutti).
DWORD WINAPI WaitForMultipleObjects(
  DWORD nCount,
  const HANDLE* lpHandles,
  BOOL bWaitAll,
  DWORD dwMilliseconds
);


nCount
Numero degli eventi descritti

lpHandles
Array degli descrittori (handle degli eventi)

bWaitAll
Uno solo o tutti?

dwMilliseconds
Quanto a lungo attendere l'evento prima di proseguire. Va benissimo INFINITE("aspetta e basta!")

Non ci sono commenti in questa pagina. [Scrivi commento]

La pagina è stata generata in 0.1413 secondi