Il MultiThreading in C in ambiente Windows | |||
Lun 19 Mag 2008 |
|
Sospendere e Riesumare il Thread
Oltre che terminare un thread è anche possibile sospenderlo e successivamente riesumarlo. Con una chiamata alla funzione SuspendThread si sospende l'esecuzione del thread, con una chiamata alla funzione ResumeThread si ripristina l'esecuzione del thread predentemente sospeso.A ciascun thread è associato un suspend count. Ogni volta che il thread viene sospeso, tramite la funzione SuspendThread, il suspend count viene incrementato di uno, ogni volta che un thread viene riesumato, tramite la funzione ResumeThread, il suspend count viene decrementato di uno.
Un thread è sospeso se il suspend count è diverso da zero, non è sospeso se il suspend count è uguale a zero. Quindi un thread potrà essere effettivamente riesumato solo quando il suo suspend count sarà uguale a zero.
thread5.c
#include <windows.h>
HANDLE Thread1, Thread2;
DWORD dwThrdId;
DWORD WINAPI Thread_Method_1(LPVOID param)
{
int i = 0;
while (i <= 10)
{
printf("Thread Numero 1\n");
i+=1;
sleep(1);
}
printf("Thread Numero 1--> Finito\n");
}
DWORD WINAPI Thread_Method_2(LPVOID param)
{
int i = 0;
while (i <= 10)
{
printf("Thread Numero 2\n");
i+=1;
sleep(1);
}
printf("Thread Numero 2--> Finito\n");
}
int main(int argc, char* argv[])
{
Thread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Method_1, 0,
0, &dwThrdId);
sleep(2);
printf("Thread numero 1 Sospeso\n");
SuspendThread(Thread1);
Thread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Method_2, 0,
0, &dwThrdId);
sleep(10);
printf("Thread numero 1 Riesumato\n");
ResumeThread(Thread1);
system("pause");
return 0;
}
In questo esempio viene creato il thread 1, dopo qualche istante il thread viene sospeso e subito dopo viene creato il thread 2, quindi dopo qualche istante viene riesumato il thread 1.
Figura 7.
thread5_1.c
#include <windows.h>
HANDLE Thread1, Thread2;
DWORD dwThrdId;
DWORD WINAPI Thread_Method_1(LPVOID param)
{
int i = 0;
while (i <= 10)
{
printf("Thread Numero 1\n");
i+=1;
sleep(1);
}
printf("Thread Numero 1--> Finito\n");
}
DWORD WINAPI Thread_Method_2(LPVOID param)
{
int i = 0;
while (i <= 10)
{
printf("Thread Numero 2\n");
i+=1;
if (i == 2)
{
SuspendThread(Thread1);
printf("Thread numero 1 Sospeso\n");
}
if (i == 9)
{
ResumeThread(Thread1);
printf("Thread numero 1 Riesumato\n");
}
sleep(1);
}
printf("Thread Numero 2--> Finito\n");
}
int main(int argc, char* argv[])
{
Thread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Method_1, 0,
0, &dwThrdId);
Thread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Method_2, 0,
0, &dwThrdId);
system("pause");
return 0;
}
In questo esempio il primo thread viene prima sospeso e poi riesumato dall'interno del secondo thread.
Figura 8.
thread5_2.c
#include <windows.h>
HANDLE Thread1, Thread2;
DWORD dwThrdId;
DWORD WINAPI Thread_Method_1(LPVOID param)
{
int i = 0;
while (i <= 10)
{
printf("Thread Numero 1\n");
i+=1;
if (i == 4)
{
printf("Thread numero 1 Sospeso\n");
SuspendThread(Thread1);
}
sleep(1);
}
printf("Thread Numero 1--> Finito\n");
}
DWORD WINAPI Thread_Method_2(LPVOID param)
{
int i = 0;
while (i <= 10)
{
printf("Thread Numero 2\n");
i+=1;
if (i == 9)
{
ResumeThread(Thread1);
printf("Thread numero 1 Riesumato\n");
}
sleep(1);
}
printf("Thread Numero 2--> Finito\n");
}
int main(int argc, char* argv[])
{
Thread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Method_1, 0,
0, &dwThrdId);
Thread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Method_2, 0,
0, &dwThrdId);
system("pause");
return 0;
}
In questo esempio il primo thread viene sospeso dall'interno del primo thread stesso e poi riesumato successivamente dall'interno del secondo thread.
Figura 9.
La funzione SuspendThread sospende il thread specificato dall'handle
hThread
Se la funzione ha successo restituisce il suspend count del thread, se non ha successo restituisce -1.
DWORD WINAPI SuspendThread(
__in HANDLE hThread
);
Se la funzione ha successo restituisce il suspend count del thread, se non ha successo restituisce -1.
La funzione ResumeThread ripristina il thread precedentemente sospeso
specificato dall'handle hThread.
Se la funzione ha successo restituisce il suspend count del thread, se non ha successo restituisce -1.
DWORD WINAPI ResumeThread(
__in HANDLE hThread
);
Se la funzione ha successo restituisce il suspend count del thread, se non ha successo restituisce -1.