`

[置顶] 多任务和多线程(2)

阅读更多

创建一个有四个窗口的多线程程序,第一个窗口显示一个递增的数列,第二个窗口显示一个递增的质数数列,第三个窗口显示一个递增的斐波那契数列,第四个窗口显示一些随机产生大小不一的圆

一个可能的方案是使用WM_TIMER消息中处理多个更新,但是没有人圆心根据计算机速度来写程序;

看看多线程的解决方法:

程序有点长,思路却很清晰

#include<windows.h>
#include<math.h>
#include<process.h>

typedef struct  
{
	HWND hwnd;
	int cxClient;
	int cyClient;
	int cyChar;
	BOOL bKill;

}
PARAMS,*PPARAMS;


LRESULT CALLBACK WindowProc(
			HWND hwnd,      // handle to window
			UINT uMsg,      // message identifier
			WPARAM wParam,  // first message parameter
			LPARAM lParam   // second message parameter
			);

int WINAPI WinMain(
		HINSTANCE hInstance,      // handle to current instance
		HINSTANCE hPrevInstance,  // handle to previous instance
		LPSTR lpCmdLine,          // command line
		int nCmdShow              // show state
		)
{
	static TCHAR szAppName[]=TEXT("leidemingzi");
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;

	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
	wndclass.hInstance=hInstance;
	wndclass.lpfnWndProc=WindowProc;
	wndclass.lpszClassName=szAppName;
	wndclass.lpszMenuName=NULL;
	wndclass.style=CS_HREDRAW|CS_VREDRAW;

	if(!RegisterClass(&wndclass))
	{
		MessageBox(NULL,TEXT("the program require the window nt"),TEXT("tips"),MB_ICONERROR);
		return 0;
	}

	hwnd=CreateWindow(
		szAppName,  // registered class name
		TEXT("this is title"), // window name
		WS_OVERLAPPEDWINDOW,        // window style
		CW_USEDEFAULT,                // horizontal position of window
		CW_USEDEFAULT,                // vertical position of window
		CW_USEDEFAULT,           // window width
		CW_USEDEFAULT,          // window height
		NULL,      // handle to parent or owner window
		NULL,          // menu handle or child identifier
		hInstance,  // handle to application instance
		NULL       // window-creation data
		);

	ShowWindow(hwnd,nCmdShow);
	UpdateWindow(hwnd);

	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

int CheckBottom(HWND hwnd,int cyClient,int cyChar,int iLine)
{
	if(iLine*cyChar+cyChar>cyClient)
	{
		InvalidateRect(hwnd,NULL,TRUE);
		UpdateWindow(hwnd);
		iLine=0;
	}
	return iLine;
}

//the window1
VOID Thread1(PVOID pvoid)
{
	HDC hdc;
	int iNum=0,iLine=0;
	PPARAMS pparams;
	TCHAR szBuffer[20];

	pparams=(PPARAMS)pvoid;

	while(!pparams->bKill)
	{
		if(iNum<0)
			iNum=0;
		iLine=CheckBottom(pparams->hwnd,pparams->cyClient,pparams->cyChar,iLine);

		hdc=GetDC(pparams->hwnd);
		TextOut(hdc,0,iLine*pparams->cyChar,szBuffer,wsprintf(szBuffer,TEXT("%d"),iNum++));
		ReleaseDC(pparams->hwnd,hdc);
		iLine++;
	}
	_endthread();
}


LRESULT CALLBACK WindowProc1(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	static PARAMS params;
	switch(uMsg)
	{
	case WM_CREATE:
		params.hwnd=hwnd;
		params.cyChar=HIWORD(GetDialogBaseUnits());
		_beginthread(Thread1,0,¶ms);
		return 0;

	case WM_SIZE:
		params.cyClient=HIWORD(lParam);
		return 0;

	case WM_DESTROY:
		params.bKill=TRUE;
		return 0;
	}

	return DefWindowProc(hwnd,uMsg,wParam,lParam);
}

//the second window
VOID Thread2(PVOID pvoid)
{
	HDC hdc;
	int iNum=1,iLine=0,i,iSqrt;
	PPARAMS pparams;
	TCHAR szBuffer[20];

	pparams=(PPARAMS)pvoid;

	while(!pparams->bKill)
	{
		do 
		{
			if(++iNum<0)
			{
				iNum=0;
			}
			iSqrt=(int)sqrt((double)iNum);

			for(i=2;i<=iSqrt;++i)
			{
				if(iNum%i==0)
					break;
			}
		} while (i<=iSqrt);
		iLine=CheckBottom(pparams->hwnd,pparams->cyClient,pparams->cyChar,iLine);
		hdc=GetDC(pparams->hwnd);

		TextOut(hdc,0,iLine*pparams->cyChar,szBuffer,wsprintf(szBuffer,TEXT("%d"),iNum));

		ReleaseDC(pparams->hwnd,hdc);
		iLine++;
	}
	_endthread();
}

LRESULT CALLBACK WindowProc2(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	static PARAMS params;

	switch(uMsg)
	{
	case WM_CREATE:
		params.hwnd=hwnd;
		params.cyChar=HIWORD(GetDialogBaseUnits());
		_beginthread(Thread2,0,¶ms);
		return 0;

	case WM_SIZE:
		params.cyClient=HIWORD(lParam);
		return 0;

	case WM_DESTROY:
		params.bKill=TRUE;
		return 0;
	}
	return DefWindowProc(hwnd,uMsg,wParam,lParam);
}

//the third window
VOID Thread3(PVOID pvoid)
{
	HDC hdc;
	int iNum=0,iNext=1,iLine=0,iTemp;
	PPARAMS pparams;
	TCHAR szBuffer[20];

	pparams=(PPARAMS)pvoid;

	while(!pparams->bKill)
	{
		if(iNum<0)
		{
			iNum=0;
			iNext=1;
		}
		iLine=CheckBottom(pparams->hwnd,pparams->cyClient,pparams->cyChar,iLine);

		hdc=GetDC(pparams->hwnd);

		TextOut(hdc,0,iLine*pparams->cyChar,szBuffer,wsprintf(szBuffer,TEXT("%d"),iNum));
		ReleaseDC(pparams->hwnd,hdc);
		iTemp=iNum;
		iNum=iNext;
		iNext+=iTemp;
		iLine++;
	}
	_endthread();
}

LRESULT CALLBACK WindowProc3(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	static PARAMS params;

	switch(uMsg)
	{
	case WM_CREATE:
		params.hwnd=hwnd;
		params.cyChar=HIWORD(GetDialogBaseUnits());
		_beginthread(Thread3,0,¶ms);
		return 0;

	case WM_SIZE:
		params.cyClient=HIWORD(lParam);
		return 0;

	case WM_DESTROY:
		params.bKill=TRUE;
		return 0;
	}
	return DefWindowProc(hwnd,uMsg,wParam,lParam);
}

//the forth window
VOID Thread4(PVOID pvoid)
{
	HDC hdc;
	int iDiameter;
	PPARAMS pparams;
	pparams=(PPARAMS)pvoid;

	while(!pparams->bKill)
	{
		InvalidateRect(pparams->hwnd,NULL,TRUE);
		UpdateWindow(pparams->hwnd);

		iDiameter=rand()%(max(1,min(pparams->cxClient,pparams->cyClient)));

		hdc=GetDC(pparams->hwnd);
		Ellipse(hdc,(pparams->cxClient-iDiameter)/2,(pparams->cyClient-iDiameter)/2,
			(pparams->cxClient+iDiameter)/2,(pparams->cyClient+iDiameter)/2);
		
		ReleaseDC(pparams->hwnd,hdc);



	}
	_endthread();
}

LRESULT CALLBACK WindowProc4(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	static PARAMS params;
	switch(uMsg)
	{
	case WM_CREATE:
		params.hwnd=hwnd;
		params.cyChar=HIWORD(GetDialogBaseUnits());
		_beginthread(Thread4,0,¶ms);
		return 0;

	case WM_SIZE:
		params.cxClient=LOWORD(lParam);
		params.cyClient=HIWORD(lParam);
		return 0;

	case WM_DESTROY:
		params.bKill=TRUE;
		return 0;
	}

	return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
LRESULT CALLBACK WindowProc(
							HWND hwnd,      // handle to window
							UINT uMsg,      // message identifier
							WPARAM wParam,  // first message parameter
							LPARAM lParam   // second message parameter
							)
{
	static HWND hwndChild[4];
	static TCHAR *szChildClass[]={TEXT("Child1"),TEXT("Child2"),TEXT("Child3"),TEXT("Child4")};
	static WNDPROC ChildProc[]={WindowProc1,WindowProc2,WindowProc3,WindowProc4};
	HINSTANCE hInstance;
	int i,cxClient,cyClient;
	WNDCLASS wndclass;

	switch(uMsg)
	{
	case WM_CREATE:
		hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
		wndclass.cbClsExtra=0;
		wndclass.cbWndExtra=0;
		wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
		wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
		wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
		wndclass.hInstance=hInstance;
		wndclass.lpszMenuName=NULL;
		wndclass.style=CS_HREDRAW|CS_VREDRAW;

		for(i=0;i<4;++i)
		{
			wndclass.lpfnWndProc=ChildProc[i];
			wndclass.lpszClassName=szChildClass[i];
			
			RegisterClass(&wndclass);

			hwndChild[i]=CreateWindow(szChildClass[i],NULL,WS_CHILDWINDOW|WS_BORDER|WS_VISIBLE,0,0,0,0,hwnd,(HMENU)i,hInstance,NULL);

		}
		return 0;

	case WM_SIZE:
		cxClient=LOWORD(lParam);
		cyClient=HIWORD(lParam);

		for(i=0;i<4;++i)
		{
			MoveWindow(hwndChild[i],(i%2)*cxClient/2,(i>1)*cyClient/2,cxClient/2,cyClient/2,TRUE);

			
		}
		return 0;

	case WM_CHAR:
		if(wParam=='x1B')
			DestroyWindow(hwnd);
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}

	return DefWindowProc(hwnd,uMsg,wParam,lParam);
}



分享到:
评论

相关推荐

    C# 线程A访问非线程A创建的控件 、 线程内创建窗体置顶显示ShowDialog

    在C#编程中,线程安全性和多线程交互是一个重要的主题。特别是在Windows Forms或WPF应用程序中,UI(用户界面)元素通常由主线程创建并管理,而其他后台线程可能需要与这些UI元素进行交互。这涉及到跨线程访问控件的...

    置顶小工具

    4. **多线程处理**:为了确保窗口置顶功能的稳定性和响应性,开发者可能需要处理多线程问题,确保用户交互和窗口管理在同一上下文中同步进行。 5. **用户界面设计**:良好的用户界面设计可以使用户更容易理解和操作...

    VC++ 窗口置顶程序及源代码

    在IT领域,窗口置顶是一种常见的功能,它允许用户指定一个窗口始终显示在其他窗口之上,以便于同时处理多个任务。本资源包“VC++ 窗口置顶程序及源代码”提供了一个完整的解决方案,涵盖了如何在Windows操作系统中...

    多任务多IP批量ping工具

    1,支持自动获取剪贴板数据省去...4,支持单线程多线程切换(少于10个ip自动单线程) 5,支持ping D段ip 6,按钮右键可清空数据如列表框、编辑框 7,支持设置ping次数,ping包大小,-t选项 8,统计最终结果 9,其他...

    窗口置顶的小工具

    总的来说,"窗口置顶的小工具"是一个实用的辅助软件,通过调用系统API和利用钩子机制,帮助用户更高效地进行多任务处理。同时,了解其背后的技术原理也能让我们对Windows操作系统有更深入的理解。

    前端置顶工具

    标签“前端置顶”进一步强调了这个工具的主要功能,即让选定的窗口在用户界面中保持顶层状态,确保用户在执行多任务时可以方便地查看或交互。在多任务处理日益普遍的今天,这样的功能极大地提高了工作效率。 在提供...

    VB任务管理器

    VB任务管理器不仅可以显示进程,还能进一步列出每个进程中的线程,这对于调试多线程应用程序或者找出占用资源过多的线程非常有帮助。 3. **结束进程**:VB任务管理器提供了一个功能,允许用户选择并结束某个进程。...

    隐藏游戏、游戏置顶、缩小游戏

    缩小游戏是指将游戏窗口缩小到一个更小的尺寸,通常是为了节省屏幕空间或在进行多任务处理时保持游戏运行。开发者可以通过改变窗口的大小参数(如`SetWindowLong`函数调整窗口风格)来实现这一功能。此外,现代游戏...

    swift—Mac音乐播放器,窗口置顶.zip

    窗口置顶.zip”的压缩包中,我们很显然看到它是一个使用Swift语言开发的Mac音乐播放器项目,具有窗口置顶的功能,这意味着用户在使用其他应用时,音乐播放窗口始终保持在最上方,提高了多任务处理的便捷性。...

    plpingip_jb51.rar

    批量ping ip,这款软件是由“Yjd”制作的批量ip测试是否占用的小工具,其支持Ping间隔时间、多线程全Ping以及多任务多IP批量ping等,是您电脑批量ping ip地址的绝佳软件。 功能介绍: 1,支持自动获取剪贴板...

    windows7操作技巧.docx

    12. **多线程文件复制**:Windows 7改进了文件复制功能,支持多线程复制,提高了大文件传输的速度。 以上技巧可以帮助Windows 7用户更高效地管理和使用操作系统,提升工作效率。无论是安全性、视觉体验,还是日常...

    WindowUtil v2.rar

    2. **自动化脚本**:WindowUtil可能支持编写脚本或宏,让用户能够自动执行一系列窗口操作,比如批量移动、大小调整窗口,这对于多任务处理或工作流自动化非常有用。 3. **窗口识别技术**:为了正确操作特定窗口,...

    EmbeddedSystemCH嵌入式操作系统PPT课件.pptx

    同步与通信是多任务系统中的重要概念。同步是控制不同任务或中断服务之间信息传递的机制,确保资源的正确使用和活动的有序进行。资源同步主要是为了避免多个任务同时访问共享资源,通常通过互斥机制实现,防止数据...

    Win 7超级有用的50个功能和技巧.docx

    12. **多线程文件复制**:利用内置的Robocopy命令,如`/MT[:n]`(n值1到128),可以实现多线程文件复制,提高复制速度。 13. **最大化或恢复窗口**:按下`WIN + 上`键,可以快速最大化或恢复前台窗口。 14. **解锁...

    srqchtmlbcpdf_itmop.com.zip

    7. Web Workers和Web Socket:Web Workers允许在后台线程中执行脚本,提高网页处理大量计算任务的能力。Web Socket则提供了一种双向通信协议,实现了服务器与客户端的实时通信。 8. Geolocation API:HTML5的地理...

    应用中的嵌入式Linux实时优化.pdf

    在多任务环境中,如果一个低优先级任务持有高优先级任务所需的资源,可能导致高优先级任务被阻塞,从而影响实时性。通过优先级置顶,可以临时提升持有资源任务的优先级,避免优先级倒置现象的发生。这种方法需要对...

    windows7不为大多人知道的秘密使用技巧大全.doc

    11. **多线程文件复制**:Windows 7中的Robocopy命令支持多线程复制,通过`/MT[:n]`参数指定线程数,提高文件复制速度。例如,`ROBOCOPY source destination /MT:8`表示使用8个线程进行复制。 12. **解锁被占用的...

    vb定时关机(精简)

    总结,VB定时关机软件结合了VB的基础编程、事件驱动机制、系统API调用、时间处理、多线程技术和界面设计等多方面的知识。它是一个实用的小工具,展示了VB在创建便捷用户界面和控制操作系统功能方面的强大能力。通过...

    windows 7 新功能

    12. **多线程文件复制**:Windows 7的文件复制功能支持多线程,可以提高大文件或大量文件的复制速度。系统会智能地分配资源,加快文件传输。 以上便是Windows 7中一些主要的新功能和改进,这些特性使得操作系统的...

    Windows7使用技巧.doc

    12. **多线程文件复制**:Windows 7中内置的Robocopy命令支持多线程复制,通过指定参数`/MT[:n]`,n的值在1到128之间,可以加快大文件或大量文件的复制速度。用户需在命令行中输入`ROBOCOPY /?`查看详细使用方法。 ...

Global site tag (gtag.js) - Google Analytics