Ahojte, vypracoval jsem priklad a nefunguje tak, jak ma... zadani je na pocatku zdrojoveho kodu:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
/**********************************************
ZADANI:
Napište program, ve kterém vytvoříte vlákno.
Toto vlákno bude monitorovat stav objektu
události a při signalizovaném stavu se ukončí.
Objekt signalizujte z prvního vlákna.
**********************************************/
/* Obsluha chybovych hlaseni */
void ErrorExit (LPTSTR lpszMessage) {
fprintf(stderr, "%s\n", lpszMessage);
ExitProcess(0);
}
/* funkce predavana novemu vlaknu */
void ThreadFunction(LPVOID lpParam)
{
printf("-----------------------------------\n");
printf("\nvlakno bylo vytvoreno\n\n");
printf("-----------------------------------\n");
HANDLE hEvent; // handle udalosti
hEvent = (HANDLE) lpParam; // udalost zpristupnena ve vlaknu
DWORD dwWaitResult; // vysledek cekaci funkce
dwWaitResult = WaitForSingleObject(
hEvent, // handle udalosti (objektu)
INFINITE); // doba cekani
if (dwWaitResult == WAIT_OBJECT_0)
{
printf("\nvlakno bylo signalizovano\n");
} else if (dwWaitResult == WAIT_FAILED) {
ErrorExit("Funkce WaitForSingleObject selhala.\n");
}
if (!ResetEvent(hEvent)) // nastavi udalost zpet do nesignalizovaneho stavu
{
ErrorExit("Nezdarilo se nastavit udalost do nesignalizovaneho stavu.\n");
}
printf("\n... vlakno bylo ukonceno\n");
ExitThread(0); // ukonci vlakno s navratovym kodem 0
}
/* vytvori objekt udalosti a vlakno, kde bude udalost zpristupnena a signalizuje udalost */
void createObjectsAndSignalizeEvent()
{
HANDLE hEvent; // handle udalosti
// vytvoreni udalosti
hEvent = CreateEvent(
NULL, // ukazatel na strukturu SECURITY_ATTRIBUTES
TRUE, // typ objektu manual-reset
FALSE, // pocatecni stav nesignalizovan
"MonitoredEvent"); // jmeno objektu udalosti
if (hEvent == NULL) { // jestlize vrati CreateEvent NULL
ErrorExit("Funkce CreateEvent selhala.\n");
}
HANDLE hThread; // handle vlakna
DWORD dwThreadId; // identifikator vlakna
// vytvoreni vlakna
hThread = CreateThread(
NULL, // struktura ochrannych parametru - NULL
0, // inicializace velikosti zasobniku - 0 = default size
(LPTHREAD_START_ROUTINE)ThreadFunction, // funkce, kterou vlakno spusti
&hEvent, // parametr dane funkce - zpristupni udalost
0, // priznak ovladajici vytvoreni vlakna - 0 = vlakno se spusti ihned po vytvoreni
&dwThreadId); // promenna, do ktere se ulozi identifikator vlakna
if (hThread == NULL) // jestlize se vlakno nepodari vytvorit, vrati CreateThread NULL
{
ErrorExit("Nepodarilo se vytvorit vlakno.\n");
}
// generuje nahodna cisla v cyklu a pokazde vypise hlasku... az vygeneruje cislo 9, tak signalizuje objekt
srand((unsigned int)time(NULL));// inicializuje generator nahodnych cisel
while ((rand() % 20) != 9) // ceka dokud nahodne cislo do 20 neni rovno 9
{
printf("udalost je stale v nesignalizovanem stavu...\n");
}
printf("\nudalost nastavuji do signalizovaneho stavu...\n");
if (!SetEvent(hEvent))
{
ErrorExit("Nezdarilo se nastavit udalost do signalizovaneho stavu.\n");
}
}
void main()
{
createObjectsAndSignalizeEvent();
printf("\n");
}
po prelozeni je vse vporadku, spustim-li program, rozbehne se, ale rozbehne se asi jen funkce createObjectsAndSignalizeEvent(), protoze se na std vystup vypise parkrat "udalost je stale v nesignalizovanem stavu..." a na konci "udalost nastavuji do signalizovaneho stavu..." a ja bych cekal, ze se nekde mezi tim vypisea ono se tak nestane :-(... nevite, co mam spatne? Mohli byste mi to, prosim nekdo vysvetlit? Mockrat dekuji :-)-----------------------------------
vlakno bylo vytvoreno
-----------------------------------
vlakno bylo signalizovano
... vlakno bylo ukonceno