Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода Процессы и потоки.doc
Скачиваний:
7
Добавлен:
14.07.2019
Размер:
401.92 Кб
Скачать

CrMutex.C

#include <windows.h>

#include "CrMutex.h"

HINSTANCE hInst; // current instance

LPCTSTR lpszAppName = "MyApp";

LPCTSTR lpszTitle = "My Application";

Int apientry WinMain( hinstance hInstance, hinstance hPrevInstance,

LPTSTR lpCmdLine, int nCmdShow)

{

MSG msg;

HWND hWnd;

WNDCLASSEX wc;

// Register the main application window class.

//............................................

wc.style = CS_HREDRAW | CS_VREDRAW;

wc.lpfnWndProc = (WNDPROC)WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon( hInstance, lpszAppName );

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

wc.lpszMenuName = lpszAppName;

wc.lpszClassName = lpszAppName;

wc.cbSize = sizeof(WNDCLASSEX);

wc.hIconSm = LoadImage( hInstance, lpszAppName,

IMAGE_ICON, 16, 16,

LR_DEFAULTCOLOR );

if ( !RegisterClassEx( &wc ) )

return( FALSE );

hInst = hInstance;

// Create the main application window.

//....................................

hWnd = CreateWindow( lpszAppName,

lpszTitle,

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0,

CW_USEDEFAULT, 0,

NULL,

NULL,

hInstance,

NULL

);

if ( !hWnd )

return( FALSE );

ShowWindow( hWnd, nCmdShow );

UpdateWindow( hWnd );

while( GetMessage( &msg, NULL, 0, 0) )

{

TranslateMessage( &msg );

DispatchMessage( &msg );

}

return( msg.wParam );

}

LPCTSTR lpszMutex = "Example Mutex";

HANDLE hMutex = NULL;

// Child thread procedure waits until mutex becomes signaled,

// holds the object for five seconds, and then releases it.

//...........................................................

DWORD WINAPI ChildThreadProc( LPDWORD lpData )

{

TCHAR szBuffer[128];

HWND hWnd = (HWND)lpData;

HANDLE hTmpMutex = OpenMutex( MUTEX_ALL_ACCESS, FALSE, lpszMutex );

wsprintf( szBuffer,"Thread %x waiting for Mutex %x",

GetCurrentThreadId(), hMutex );

SendMessage( hWnd, WM_USER, 0, (LPARAM)szBuffer );

// Wait for signaled mutex.

//.........................

WaitForSingleObject( hMutex, INFINITE );

wsprintf( szBuffer,"Thread %x got mutex!", GetCurrentThreadId() );

SendMessage( hWnd, WM_USER, 0, (LPARAM)szBuffer );

// Shut out other threads.

//........................

Sleep( 5000 );

// Release mutex.

//...............

wsprintf( szBuffer,"Thread %x is done with mutex", GetCurrentThreadId() );

SendMessage( hWnd, WM_USER, 0, (LPARAM) szBuffer );

ReleaseMutex( hMutex );

CloseHandle( hMutex );

return( 0 );

}

LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )

{

static HWND hList = NULL;

static int nMsgNum = 0;

switch( uMsg )

{

case WM_CREATE :

// Create list box.

//.................

hList = CreateWindowEx( WS_EX_CLIENTEDGE, "LISTBOX", "",

LBS_STANDARD | LBS_NOINTEGRALHEIGHT |

WS_CHILD | WS_VISIBLE,

0, 0, 10, 10,

hWnd, (HMENU)101,

hInst, NULL );

hMutex = CreateMutex( NULL, FALSE, lpszMutex );

break;

case WM_SIZE :

if ( wParam != SIZE_MINIMIZED )

MoveWindow( hList, 0, 0, LOWORD( lParam ), HIWORD( lParam ), TRUE );

break;

case WM_USER :

{

TCHAR szBuffer[128];

wsprintf( szBuffer, "%3d: %s", ++nMsgNum, (LPTSTR)lParam );

SendMessage( hList, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)szBuffer );

}

break;

case WM_COMMAND :

switch( LOWORD( wParam ) )

{

case IDM_TEST:

{

DWORD id;

// Make a thread.

//...............

CreateThread( NULL, 0, ChildThreadProc, hWnd, 0, &id );

}

break;

case IDM_ABOUT :

DialogBox( hInst, "AboutBox", hWnd, (DLGPROC)About );

break;

case IDM_EXIT :

DestroyWindow( hWnd );

break;

}

break;

case WM_DESTROY :

if ( hMutex )

CloseHandle( hMutex );

PostQuitMessage(0);

break;

default :

return( DefWindowProc( hWnd, uMsg, wParam, lParam ) );

}

return( 0L );

}

LRESULT CALLBACK About( HWND hDlg,

UINT message,

WPARAM wParam,

LPARAM lParam)

{

switch (message)

{

case WM_INITDIALOG:

return (TRUE);

case WM_COMMAND:

if ( LOWORD(wParam) == IDOK

|| LOWORD(wParam) == IDCANCEL)

{

EndDialog(hDlg, TRUE);

return (TRUE);

}

break;

}

return (FALSE);

}