La versione più recente è stata modificata il 2007-05-29 10:30:28 da MarKuS
Aggiunzioni:
CreateThread
ResumeThread
SuspendThread
TerminateThread
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.
WaitForMultipleObjects
Omissioni:
CreateThread
ResumeThread
SuspendThread
TerminateThread
Le funzioni WaitFor_ bloccano il thread corrente fino al verificarsi della condizione specificata o della scadenza del termine.
WaitForSingleObject
Attende un evento (sui Thread attende la loro terminazione).
WaitForMultipleObjects
Modificato il 2007-05-29 10:23:15 da MarKuS
Aggiunzioni:
Mutex & Semafori
CreateMutex
Crea un oggetto mutex, o vi accede.
ReleaseMutex
Rilascia un mutex(up).
%%(c)BOOL WINAPI ReleaseMutex(
HANDLE hMutex
CreateSemaphore
ReleaseSemaphore
Funzioni di attesa
Le funzioni WaitFor_ bloccano il thread corrente fino al verificarsi della condizione specificata o della scadenza del termine.
Omissioni:
Semafori
CreateSemaphore
ReleaseSemaphore
hSemaphore
Lo handle al semaforo.
Modificato il 2007-05-29 10:04:12 da MarKuS
Aggiunzioni:
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.
Semafori
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)//
(c)BOOL WINAPI ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount
hSemaphore
Lo handle al semaforo.
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
Omissioni:
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.
Modificato il 2007-04-21 00:01:46 da DenteDiLupo
Aggiunzioni:
CreateThread
ResumeThread
WaitForSingleObject
WaitForMultipleObjects
TerminateThread
Omissioni:
Modificato il 2007-04-21 00:00:56 da DenteDiLupo
Aggiunzioni:
SuspendThread
Omissioni:
Modificato il 2007-04-20 05:24:10 da MarKuS
Aggiunzioni:
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
Modificato il 2007-04-20 04:51:37 da MarKuS
Aggiunzioni:
Omissioni:
Modificato il 2007-04-20 04:49:44 da MarKuS
Aggiunzioni:
se create più di un thread, ad es. in un ciclo, ricordatevi che non potete
HANDLE hThreads[N_THREADS];
}
ResumeThread
Decrementa il numero di sospensioni del thread. Quando il numero di sospensioni è zero, il thread riprende
SuspendThread
Sospende il thread (aumenta il numero di sospensioni se il thread è già sospeso)
WaitForSingleObject
Attende un evento (sui Thread attende la loro terminazione).
WaitForMultipleObjects
Attende un'insieme di eventi (uno o tutti).
Omissioni:
se create più di un thread, ad es. in un ciclo, ricordatevi che non potete
HANDLE hThreads[N_THREADS];
}
ResumeThread - Decrementa il numero di sospensioni del thread. Quando il numero di sospensioni è zero, il thread riprende.
);
SuspendThread - Sospende il thread (aumenta il numero di sospensioni se il thread è già sospeso)
);
WaitForSingleObject - Attende un evento (sui Thread attende la loro terminazione)
);
Parametri:
WaitForMultipleObjects - Attende un'insieme di eventi (uno o tutti)
);
Parametri:
Modificato il 2007-04-20 04:44:40 da MarKuS
Aggiunzioni:
%%(c)/* (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 ! */
Omissioni:
%%(c)(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.
for (i=0;i<N_THREADS; i) {
La versione più vecchia di questa pagina è stata modificata il 2007-04-20 04:38:49 da MarKuS []
Vista della pagina:
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.
for (i=0;i<N_THREADS; i++) {
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
);
WaitForSingleObject - Attende un evento (sui Thread attende la loro terminazione)
DWORD WINAPI WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
Parametri:
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
);
Parametri:
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!")