Annotation of q_a/samples/semaphor/readme.txt, revision 1.1.1.1

1.1       root        1:  Sample: Using Semaphores to Control Threads
                      2: 
                      3: Summary:
                      4: 
                      5: The SEMA sample application shows how to control four
                      6: threads with a semaphore. It demonstrates this by having
                      7: four threads competing for the right to draw their color to
                      8: a rectangle in the center of the window. Access to the
                      9: center area is controlled by the semaphore.
                     10: 
                     11: More Information:
                     12: 
                     13: When you start the application you will see five rectangles:
                     14: a dynamic rectangle in the center (always changing color),
                     15: and four static rectangles surrounding it. Each of the four
                     16: rectangles has its own color: red, blue, green, and gray.
                     17: The one in the center alternates between these colors.
                     18: 
                     19: The four static rectangles represent four threads. These
                     20: four threads compete for the rectangle in the middle, and
                     21: their access is controlled by the semaphore. When a thread
                     22: gains control of the semaphore, it gets to draw its color in
                     23: the center rectangle. (Note: The threads do not actually
                     24: draw any of the four static rectangles. To make the code
                     25: simpler, this is handled in the WM_PAINT message in the
                     26: MainWndProc function. The rectangles are used only as visual
                     27: representations of the threads. The threads do, however,
                     28: draw the rectangle in the center with their specific color.)
                     29: 
                     30: The semaphore has a use count. When it is set to zero, any
                     31: thread can access the semaphore and execute the code within
                     32: its "semaphore gate" by using WaitForSingleObject. When the
                     33: thread gains control of the semaphore using this call, the
                     34: use count is incremented by 1. When the thread is done
                     35: executing its code, it can call ReleaseSemaphore. This will
                     36: decrement the count by whatever value you indicate (this
                     37: code uses 1), signaling to any other thread that it may gain
                     38: control of the semaphore.
                     39: 
                     40: Note: Any thread that has access to the semaphore may
                     41: decrement the semaphore's use count with ReleaseSemaphore;
                     42: the thread does not have to have control of the semaphore at
                     43: the time.
                     44: 
                     45: In this code, the WM_CREATE message in MainWndProc creates a
                     46: semaphore. The four threads are then created, each waiting
                     47: on the semaphore.
                     48: 
                     49: Each of the threads loop, blocking on a WaitForSingleObject
                     50: call. Once any thread has set the use count to 0, the thread
                     51: gets to draw the center rectangle with its color and then
                     52: sleeps for half a second before freeing the semaphore again.
                     53: The thread then runs through the loop again.
                     54: 
                     55: The followin is a list of the Win32 API used in this sample:
                     56: 
                     57:    BeginPaint     GetClientRect  PostQuitMessa  TerminateThrea
                     58:                                  ge             d
                     59:    CreateSemapho  GetDC          Rectangle      WaitForSingleO
                     60:    re                                           bject
                     61:    CreateSolidBr  GetLastError   RegisterClass  wsprintf
                     62:    ush
                     63:    CreateThread   GetMessage     ReleaseDC      
                     64:    CreateWindow   GetStockObjec  ReleaseSemaph  
                     65:                   t              ore
                     66:    DeleteObject   LoadCursor     SelectObject   
                     67:    DispatchMessa  LoadIcon       ShowWindow     
                     68:    ge
                     69:    EndPaint       MessageBox     Sleep          
                     70: 
                     71: 
                     72: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.