win32调试宏

#ifndef MTVERITY_H_
#define MTVERITY_H_
#pragma comment(lib, "user32")
#include <Windows.h>

#define MTASSERT(a) _ASSERTE(a)
#define MTVERITY(a) if(!(a))\
	PrintError(#a,__FILE__,__LINE__,GetLastError()) 

static void PrintError(LPSTR linedesc, LPSTR filename,
					   int lineno, DWORD errnum)
{
	LPSTR lpBuffer;
	char errbuf[256];
#ifndef _CONSOLE
	char modulename[MAX_PATH];
#else
	DWORD numread;
#endif //_WINDOWS_

FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER 
                  | FORMAT_MESSAGE_FROM_SYSTEM, 
          NULL, 
          errnum, 
          LANG_NEUTRAL, 
          (LPTSTR)&lpBuffer, 
          0, 
          NULL );
sprintf(errbuf, "\nThe following call failed at line %d in %s:\n\n     %s\n\nReason: %s\n", lineno, filename, linedesc, lpBuffer);

#ifdef _CONSOLE
	WriteFile(GetStdHandle(STD_ERROR_HANDLE),  errbuf, strlen(errbuf), 
		  &numread, FALSE ); 
	Sleep(5000); 
#else 
	GetModuleFileNameA(NULL, modulename, MAX_PATH); 
	MessageBoxA(NULL, errbuf, modulename,  
	MB_ICONWARNING|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND); 
#endif
	exit(EXIT_FAILURE);
}
#endif



下面是使用技巧:

// win32Thread.cpp : 定义控制台应用程序的入口点。
//

#include <stdio.h>
#include <Windows.h>
#include <tchar.h>
#include "mtverify.h"
DWORD WINAPI ThreadProc(void* pmsg)
{
	DWORD n = (DWORD)pmsg;

	Sleep(n*5000);

	return n * 10;
}

DWORD WINAPI ThreadProc1(void* pmsg)
{

	ExitThread(100);

	return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE hThread1, hThread2;
	DWORD dThreadID1,DThreadId2;
	DWORD dExitCode1,dExitCode2;

	hThread1 = CreateThread(NULL,0,ThreadProc,LPVOID(1), 0, &dThreadID1);

	hThread2 = CreateThread(NULL,0,ThreadProc1,LPVOID(2), 0, &DThreadId2);


	CloseHandle(hThread1);
	CloseHandle(hThread2);

	while(1)
	{
		printf("please Enter:");

		getchar();

		MTVERITY( GetExitCodeThread(hThread1, &dExitCode1));
		MTVERITY( GetExitCodeThread(hThread2, &dExitCode2));

		if (dExitCode1 == STILL_ACTIVE)
		{
			printf("Thread 1 running\n");
		}

		if (dExitCode2 == STILL_ACTIVE)
		{
			printf("Thread2 running\n");
		}
		if (dExitCode1 !=STILL_ACTIVE && dExitCode2 != STILL_ACTIVE)
		{
			printf("Thread Two End\n");
			break;
		}
	}



	printf("%d,%d\n",dExitCode1, dExitCode2);

	system("pause");

	return 0;
}


你可能感兴趣的:(win32线程1)