亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? eventtst.c

?? Windows多線程編碼隨書源碼
?? C
字號:
/*
 * EventTst.c
 *
 * Sample code for "Multithreading Applications in Win32"
 * This sample is dicussed in Chapter 4, but there is
 * no associated listing.
 *
 * Watch the results of using an event object.
 */

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <stdlib.h>
#include "resource.h"
#include "MtVerify.h"

//
// Macro definitions
//
#define MAX_THREADS 3
#define EVENT_NAME "Event Test Object"

#define WM_PLEASE_DISPLAY WM_APP

// Used by the worker threads to ask the dialog to add an entry to the listbox.
#define AddToList(s) SendMessage(hDlgMain, WM_PLEASE_DISPLAY, 0, (LONG)s)


//
// Global Variables:
//
HANDLE hInst;
HANDLE hEventObject;

// HWND of the main dialog window so other threads can find it.
HWND hDlgMain;

// Remember the HANDLES to each of the threads.
HANDLE gThreads[3];
int threadId;

//
// Function declarations
//
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
LRESULT CALLBACK MainWndProc(HWND hWnd, unsigned msg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK EventDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
void StartThreads();
void KillThreads();
DWORD WINAPI ThreadProc(LPVOID n);

BOOL EventDlg_OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam);
void EventDlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);


///////////////////////////////////////////////////////////
//
//		WinMain
//
// Main entry point of application. This will be a
// dialog based app, not a normal window, so this
// routine acts a little differently than "normal".
//
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	MSG		msg;
	HWND	hWnd;
	WNDCLASS wc;

	hInst = hInstance;
	if (!hPrevInstance)
	{
		memset(&wc, 0, sizeof(wc));
		wc.lpfnWndProc	= MainWndProc;
		wc.hInstance	= hInstance;
		wc.hIcon		= LoadIcon (hInstance, "GenIco");
		wc.hCursor		= LoadCursor(NULL,IDC_ARROW);
		wc.hbrBackground= GetSysColorBrush(COLOR_BACKGROUND);
		wc.lpszMenuName = "EVENTTSTMENU";
		wc.lpszClassName= "EventDlgClass";
		if (!RegisterClass(&wc))
			return FALSE;
	}
	
	
	hWnd = CreateWindow(
		"EventDlgClass",
		"Event Object Hands-On",
		WS_OVERLAPPED|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU,
		CW_USEDEFAULT, //At this point we do not want to show
		0,             //the winddow until we know how big
		0,             //the Dialog Box is so that we can "FIT"
		0,             //the main window around it.
		NULL,
		NULL,
		hInstance,
		NULL);
	
	hDlgMain = CreateDialog(hInst, MAKEINTRESOURCE(IDD_EVENT), hWnd, EventDlgProc);
	
	ShowWindow(hWnd, nCmdShow);
	ShowWindow(hDlgMain, SW_SHOW);
	
	
	while (GetMessage (&msg, NULL, 0, 0))
	{
		if(hDlgMain == NULL || !IsDialogMessage(hDlgMain,&msg))
		{
			TranslateMessage(&msg); /* Translate virtual key codes */
			DispatchMessage(&msg);	/* Dispatches message to window */
		}
	}
	return (msg.wParam);  /* Returns the value from
	PostQuitMessage */
}

LRESULT CALLBACK MainWndProc(HWND hWnd, unsigned msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg)
	{
	case WM_CREATE:
		break;
		
	case WM_COMMAND:

		switch (wParam)
		{
		case IDM_ABOUT:
			DialogBox(hInst, "AboutBox", hWnd, (DLGPROC)About);
			break;
		case IDM_EXIT:
			PostQuitMessage(0);
			break;
		default:
			return (DefWindowProc(hWnd, msg, wParam, lParam));
		}
		
	case WM_SETFOCUS:
		SetFocus(hDlgMain); // insure that the Dialog Box has the focus
		break;
		
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
		
	default:
		return (DefWindowProc(hWnd, msg, wParam, lParam));
		
	}
	return 0;
}


//
//  About WndProc
//
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message) {
		case WM_COMMAND:
			if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
				EndDialog(hDlg, TRUE);
				return (TRUE);
			}
			break;

		default:
			return (DefWindowProc(hDlg, message, wParam, lParam));
	}

    return FALSE;
}


LRESULT CALLBACK EventDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	HWND hctlListbox;
	
	switch (uMsg)
	{
	case WM_PLEASE_DISPLAY:
		hctlListbox = GetDlgItem(hDlg, IDC_RESULTS);
		ListBox_SetTopIndex(hctlListbox, ListBox_AddString(hctlListbox, lParam));
		break;

	case WM_CLOSE:
		DestroyWindow(hDlg);
		hDlgMain = NULL;
		break;
		
	case WM_DESTROY:
		return TRUE;
		break;
			
	HANDLE_MSG(hDlg, WM_INITDIALOG, EventDlg_OnInitDialog);
	HANDLE_MSG(hDlg, WM_COMMAND, EventDlg_OnCommand);

	default:
		return (FALSE);
	}

	return 0;
}

BOOL EventDlg_OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam)
{
	HWND hctl;
	RECT rect;

	// Size parent to fit this dialog
	GetWindowRect(hwndDlg, &rect); 
	
	SetWindowPos(GetParent(hwndDlg),NULL,
		0,0,
		rect.right-rect.left,
		rect.bottom-rect.top+GetSystemMetrics(SM_CYMENU)
		+GetSystemMetrics(SM_CYCAPTION),
		SWP_NOMOVE | SWP_NOZORDER);
	
	hctl = GetDlgItem(hwndDlg, IDC_AUTOMATIC);
	Button_SetCheck(hctl, TRUE);
	PostMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_AUTOMATIC, BN_CLICKED), (LPARAM)hctl);

	return TRUE;
}


void EventDlg_OnCommand(HWND hDlg, int id, HWND hwndCtl, UINT codeNotify)
{
	int rc;

	switch (id)
	{
	case IDC_AUTOMATIC:
		KillThreads();
		if (hEventObject) rc = CloseHandle(hEventObject);
		MTVERIFY( hEventObject = CreateEvent(NULL,	// Security
										FALSE,		// Automatic (FALSE = not manual)
										0,			// Clear on creation
										"EventTest")// Name of object
									);
		// CreateEvent ALWAYS sets the last error
		if (GetLastError() == ERROR_ALREADY_EXISTS)
			AddToList("WARNING: Event wasn't destroyed");
		StartThreads();
		AddToList("Event set to AUTOMATIC");
		break;

	case IDC_MANUAL:
		KillThreads();
		if (hEventObject) rc = CloseHandle(hEventObject);
		MTVERIFY( hEventObject = CreateEvent(NULL,	// Security
										TRUE,		// Manual
										0,			// Clear on creation
										"EventTest")// Name of object
									);
		if (GetLastError() == ERROR_ALREADY_EXISTS)
			AddToList("Reusing old event");
		StartThreads();
		AddToList("Event set to MANUAL");
		break;

	case IDC_SIGNAL:
		MTVERIFY( SetEvent(hEventObject) );
		break;

	case IDC_RESET:
		MTVERIFY( ResetEvent(hEventObject) );
		break;

	case IDC_PULSE:
		MTVERIFY( PulseEvent(hEventObject) );
		break;

	case IDC_CLEAR:
		ListBox_ResetContent(GetDlgItem(hDlg, IDC_RESULTS));
		break;

	case IDCANCEL:
	case IDM_EXIT:
		PostMessage(GetParent(hDlg),WM_DESTROY, (WPARAM)0, (LPARAM)0);
		DestroyWindow(hDlgMain);
		hDlgMain = NULL;
		break;
		
	default:
		break;
	}
}

///////////////////////////////////////////////////////////
//
//		StartThreads
//
// Create the threads that will be waiting on the 
// event object. Each thread is passed its number.
//
void StartThreads()
{
	int i;
	for (i=0; i<MAX_THREADS; i++)
	{
		MTVERIFY( gThreads[i] = CreateThread(NULL,
			0,
			ThreadProc,
			(LPVOID)i,
			0,
			&threadId ) );
	}
}


///////////////////////////////////////////////////////////
//
//		KillThreads
//
// Terminate all of the threads that are waiting, because
// we are about to create a new event object.
//
// The threads own no resources, so calling TerminateThread
// thread on them should be fairly safe.
//
// Note that if we do not explicitly wait for the thread
// to exit with WaitForSingleObject, then the OS does not
// have time to clean up the event object and it will still
// be there when we try and open a new one.
//
void KillThreads()
{
	int i;
	for (i=0; i<MAX_THREADS; i++)
	{
		if (gThreads[i] != NULL)
		{
			TerminateThread(gThreads[i], 0);
			WaitForSingleObject(gThreads[i], INFINITE);
			CloseHandle(gThreads[i]);
			gThreads[i] = NULL;
		}
	}
}


///////////////////////////////////////////////////////////
//
//		ThreadProc
//
// This is the entry point for new threads. Make an entry
// in the log that this thread is about to wait, then go to
// sleep waiting on the event object. When we wake up,
// tell the user and go back to sleep.
//
// We Sleep briefly after the event is signaled to prevent
// the app from generating thousands of wakeup messages with
// with manual events.
//
DWORD WINAPI ThreadProc(LPVOID n)
{
	char buf[80];

	for (;;)
	{
		wsprintf(buf, "Thread #%d calling WaitForSingleObject", n);
		AddToList(buf);
		Sleep(100);
		MTVERIFY( WaitForSingleObject(hEventObject, INFINITE) != WAIT_FAILED );
		wsprintf(buf, "Thread #%d woke up", n);
		AddToList(buf);
	}
	return 0;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲三级在线播放| 精品一区二区在线看| 久久中文字幕电影| 国产三级精品三级| 一区二区三区日韩| 六月婷婷色综合| 日韩成人精品在线观看| 一区二区三区四区五区视频在线观看| 国产三级一区二区三区| 国产欧美日韩三区| 一区二区三区精品视频在线| 日本系列欧美系列| 成人国产精品视频| 日韩欧美色综合网站| 成人欧美一区二区三区1314| 日韩一区二区三区视频在线| 91精品国产综合久久久久久| 91免费精品国自产拍在线不卡| 懂色中文一区二区在线播放| 国产麻豆视频一区| 91啪九色porn原创视频在线观看| 久久久精品免费观看| 国产美女一区二区| 国产精品视频免费看| 日韩国产高清在线| 这里只有精品电影| 精品写真视频在线观看| 亚洲精品一区二区三区福利| 国产成人无遮挡在线视频| 精品久久久久久久久久久久久久久久久 | 亚洲一卡二卡三卡四卡| 国产福利一区二区三区视频在线 | 久久久另类综合| 国产精品国产自产拍高清av| 蜜桃av噜噜一区二区三区小说| 国产一区二区美女| 欧美丰满少妇xxxxx高潮对白 | 欧美日韩午夜精品| 亚洲一区二区成人在线观看| 欧美三级蜜桃2在线观看| 亚洲视频每日更新| 在线欧美小视频| 亚洲国产一区二区视频| 欧美日韩精品电影| 青草国产精品久久久久久| 欧美一区二区三区免费视频| 欧美三级一区二区| 国产一区在线观看视频| 亚洲在线观看免费视频| 久久青草欧美一区二区三区| 精一区二区三区| 欧美美女喷水视频| 国产精品一区二区久激情瑜伽| 亚洲天堂精品视频| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 亚洲午夜激情网站| 精品国产免费人成电影在线观看四季| 国产在线不卡一区| 亚洲男人的天堂一区二区| 91精品在线免费| 亚洲成人av在线电影| 国产精品久久久久毛片软件| 国产欧美一区二区精品久导航| 国产欧美综合在线观看第十页| 精品久久久久一区二区国产| 国产精品私人自拍| 国产精品高清亚洲| 亚洲精品国产视频| 亚洲va国产天堂va久久en| 日本一区中文字幕| 国产一区二区不卡| 91一区二区在线| 国产成人精品免费一区二区| 日韩精品成人一区二区三区| 亚洲一区二区精品视频| 亚洲人成网站精品片在线观看| 国产欧美精品一区二区色综合| 欧美一级高清大全免费观看| 精品视频一区二区三区免费| 在线亚洲一区观看| 欧美亚洲综合久久| 欧美日韩一级视频| 777午夜精品视频在线播放| 日本女优在线视频一区二区| 亚洲一二三区视频在线观看| 国产一区二区三区最好精华液| 国产凹凸在线观看一区二区| 99久久亚洲一区二区三区青草| 综合中文字幕亚洲| 日韩av不卡一区二区| 91丨porny丨户外露出| 99国产精品99久久久久久| 日韩一区二区免费电影| 免费看欧美美女黄的网站| 亚洲国产日韩在线一区模特| 亚洲精品国产品国语在线app| 自拍偷在线精品自拍偷无码专区| 国产精品国产自产拍高清av王其 | 亚洲人精品午夜| 亚洲精品成人精品456| 一区二区三区毛片| 久久国产精品露脸对白| 国产精品一区二区不卡| 99精品视频在线观看| 欧美日韩国产小视频在线观看| 欧美二区在线观看| 久久午夜国产精品| 亚洲综合丝袜美腿| 狠狠色狠狠色综合系列| 色婷婷综合视频在线观看| 欧美性一区二区| 国产欧美日韩综合精品一区二区| 国产精品网站导航| 丝袜亚洲精品中文字幕一区| 国产成人综合在线| 91精品国产美女浴室洗澡无遮挡| 欧美成人r级一区二区三区| 18成人在线视频| 国产精品中文欧美| 日韩一区二区三区视频| 亚洲黄色录像片| 国产成人精品免费| 日韩欧美综合一区| 日韩国产精品91| 欧美色视频一区| 亚洲免费av在线| 91亚洲精品久久久蜜桃网站 | 久久国产精品第一页| 91.麻豆视频| 69p69国产精品| 2020国产精品| 国内精品国产成人| 久久天天做天天爱综合色| 日韩福利视频导航| 欧美精品精品一区| 亚洲第四色夜色| 日韩一区二区三区av| 亚洲图片自拍偷拍| 7777精品伊人久久久大香线蕉经典版下载| 日韩一区欧美小说| 欧美中文字幕一区二区三区 | 成人永久看片免费视频天堂| 精品99999| 91污在线观看| 一区二区高清视频在线观看| 成人精品国产免费网站| 亚洲激情五月婷婷| 51精品视频一区二区三区| 精品在线播放午夜| 国产精品福利一区| 91精品国产91久久综合桃花| 九九视频精品免费| 《视频一区视频二区| 欧美三级日韩三级| 成人一级黄色片| 视频在线观看国产精品| 国产日韩成人精品| 欧美亚洲禁片免费| av综合在线播放| 久久电影网站中文字幕| 一级做a爱片久久| 国产亚洲一区字幕| 日韩欧美成人一区二区| 色综合激情五月| 成人av电影在线| 久久99国内精品| 日韩av中文在线观看| 自拍视频在线观看一区二区| 26uuu亚洲婷婷狠狠天堂| 91福利区一区二区三区| 99国产精品一区| 国产成人鲁色资源国产91色综| 免费成人av资源网| 久久综合九色综合97_久久久| 91麻豆精东视频| 成人丝袜高跟foot| 9i在线看片成人免费| 成人国产在线观看| 国产精品综合二区| 国产福利一区在线| 国产+成+人+亚洲欧洲自线| 国产一区欧美日韩| 成人免费视频视频| 日本乱人伦一区| 日本二三区不卡| 9191久久久久久久久久久| 69堂成人精品免费视频| 精品国产凹凸成av人导航| 国产欧美日韩在线视频| 国产精品污污网站在线观看| 综合精品久久久| 午夜精品一区二区三区免费视频 | 99riav一区二区三区| 91麻豆福利精品推荐| 欧美另类videos死尸| 久久在线观看免费| 一区二区三区中文免费| 奇米精品一区二区三区四区| 国产一区视频在线看| 91麻豆国产福利在线观看|