题目:创建一个包含4个窗口的多任务模拟:
第一窗口:显示递增偶数;
第二窗口:显示递增素数;
第三窗口:显示任意半径的圆;
第四窗口:显示随机矩形。
给出多线程解决方案,并调试通过。
步骤及源码:
一、 声明多线程;
DWORD WINAPI Thread1(LPVOID lpParam); HINSTANCE hInstance1;//声明多线程;
DWORD WINAPI Thread2(LPVOID lpParam); HINSTANCE hInstance2;
DWORD WINAPI Thread3(LPVOID lpParam); HINSTANCE hInstance3;
DWORD WINAPI Thread4(LPVOID lpParam); HINSTANCE hInstance4;
二、 声明窗体函数(但要先在资源视图中创建4个窗口DlgProc1~4);
BOOL __stdcall DlgProc1(HWND, UINT, WPARAM, LPARAM);//声明窗体函数;
BOOL __stdcall DlgProc2(HWND, UINT, WPARAM, LPARAM);
BOOL __stdcall DlgProc3(HWND, UINT, WPARAM, LPARAM);
BOOL __stdcall DlgProc4(HWND, UINT, WPARAM, LPARAM);
三、 主函数创建并调用4个线程:
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
DWORD dwThreadId[4];
HANDLE h[4];
// 创建四个线程
h[0] = ::CreateThread (
NULL, // 默认安全属性
NULL, // 默认堆栈大小
Thread1, // 线程入口地址(执行线程的函数)
NULL, // 传给函数的参数
0, // 指定线程立即运行
&dwThreadId[0]);// 返回线程的ID号
h[1] = ::CreateThread (
NULL, // 默认安全属性
NULL, // 默认堆栈大小
Thread2, // 线程入口地址(执行线程的函数)
NULL, // 传给函数的参数
0, // 指定线程立即运行
&dwThreadId[1]);// 返回线程的ID号
h[2] = ::CreateThread (
NULL, // 默认安全属性
NULL, // 默认堆栈大小
Thread3, // 线程入口地址(执行线程的函数)
NULL, // 传给函数的参数
0, // 指定线程立即运行
&dwThreadId[2]);// 返回线程的ID号
h[3] = ::CreateThread (
NULL, // 默认安全属性
NULL, // 默认堆栈大小
Thread4, // 线程入口地址(执行线程的函数)
NULL, // 传给函数的参数
0, // 指定线程立即运行
&dwThreadId[3]);// 返回线程的ID号
// 等待两个线程内核对象都变成受信状态
::WaitForMultipleObjects(
4, // DWORD nCount 要等待的内核对象的数量
h, // CONST HANDLE *lpHandles 句柄数组
TRUE, // BOOL bWaitAll 指定是否等待所有内核对象变成受信状态
INFINITE); // DWORD dwMilliseconds 要等待的时间
::CloseHandle(h[0]);
::CloseHandle(h[1]);
::CloseHandle(h[2]);
::CloseHandle(h[3]);
return 0;
}
四、 线程函数调用创建窗口的函数(线程函数的实现):
DWORD WINAPI Thread1(LPVOID lpParam)
{
::DialogBoxParam(
hInstance1, // 实例句柄
(LPCTSTR)IDD_DOUBLE, // 对话框资源ID号
NULL, // 父窗口句柄
DlgProc1, // 消息处理函数
NULL); // 对话框初始化的值,在WM_INITDIALOG消息的lParam参数中取出
return 0;
}
DWORD WINAPI Thread2(LPVOID lpParam)
{
::DialogBoxParam(
hInstance2, // 实例句柄
(LPCTSTR)IDD_PRIME, // 对话框资源ID号
NULL, // 父窗口句柄
DlgProc2, // 消息处理函数
NULL); // 对话框初始化的值,在WM_INITDIALOG消息的lParam参数中取出
return 0;
}
DWORD WINAPI Thread3(LPVOID lpParam)
{
::DialogBoxParam(
hInstance3, // 实例句柄
(LPCTSTR)IDD_CIRCLE, // 对话框资源ID号
NULL, // 父窗口句柄
DlgProc3, // 消息处理函数
NULL); // 对话框初始化的值,在WM_INITDIALOG消息的lParam参数中取出
return 0;
}
DWORD WINAPI Thread4(LPVOID lpParam)
{
::DialogBoxParam(
hInstance4, // 实例句柄
(LPCTSTR)IDD_RECTANGLE, // 对话框资源ID号
NULL, // 父窗口句柄
DlgProc4, // 消息处理函数
NULL); // 对话框初始化的值,在WM_INITDIALOG消息的lParam参数中取出
return 0;
}
五、 窗口函数显示窗体的内容(窗体客户端的实现):
BOOL __stdcall DlgProc1(HWND hDlg1, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_PAINT: // 窗口客户区需要重画
{
HDC hdc;
PAINTSTRUCT ps;
// 使无效的客户区变的有效,并取得设备环境句柄
hdc = ::BeginPaint (hDlg1, &ps) ;
char szText[56];
int i,a;
a=0;
for(i=0;i<30;i++)
{ a=a+2;
::Sleep(1000);
wsprintf(szText,"输出偶数:%d",a);
::TextOut(hdc, 10, 10, szText, strlen(szText));
}
::EndPaint(hDlg1, &ps);
return 0;
}
case WM_INITDIALOG: // 初始化对话框
::SetWindowText(hDlg1,"偶数");
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
::EndDialog(hDlg1, IDOK);
break;
}
break;
}
return 0;
}
BOOL __stdcall DlgProc2(HWND hDlg2, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_PAINT: // 窗口客户区需要重画
{
char szText[56];
HDC hdc;
PAINTSTRUCT ps;
// 使无效的客户区变的有效,并取得设备环境句柄
hdc = ::BeginPaint (hDlg2, &ps) ;
int i,m;
for(m=0;m<30;m++)
{
double sqrtm=sqrt(m);
for(i=2;i<=sqrtm;i++)
if(m%i==0)
break;
if(sqrtm<i)
wsprintf(szText,"输出素数:%d",m);
::TextOut(hdc, 10, 10, szText, strlen(szText));
::Sleep(1000);
}
::EndPaint(hDlg2, &ps);
return 0;
}
case WM_INITDIALOG: // 初始化对话框
::SetWindowText(hDlg2,"素数");
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
::EndDialog(hDlg2, IDOK);
break;
case IDCANCEL:
::EndDialog (hDlg2, IDCANCEL);
break;
}
break;
}
return 0;
}
BOOL __stdcall DlgProc3(HWND hDlg3, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_PAINT: // 窗口客户区需要重画
{
HDC hdc;RECT rt;
PAINTSTRUCT ps;
int k=::GetClientRect(hDlg3,&rt);
// 使无效的客户区变的有效,并取得设备环境句柄
hdc = ::BeginPaint (hDlg3, &ps) ;
int y;
for(y=0;y<10;y++)
{
int i,j;
srand(time(NULL));
i=rand()%330;j=rand()%150;
::Ellipse(hdc,i,j,j,i);
Sleep(1000);
}
::EndPaint(hDlg3, &ps);
return 0;
}
case WM_INITDIALOG: // 初始化对话框
::SetWindowText(hDlg3,"随机圆");
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
::EndDialog(hDlg3, IDOK);
break;
case IDCANCEL:
::EndDialog (hDlg3, IDCANCEL);
break;
}
break;
}
return 0;
}
BOOL __stdcall DlgProc4(HWND hDlg4, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_PAINT: // 窗口客户区需要重画
{
HDC hdc;
PAINTSTRUCT ps;
// 使无效的客户区变的有效,并取得设备环境句柄
hdc = ::BeginPaint (hDlg4, &ps) ;
int y;int i,j,k,l;
for(y=0;y<10;y++)
{
srand(time(NULL));
i=rand()%330;j=rand()%330;k=rand()%150;l=rand()%150;
::Rectangle(hdc,i,j,k,l);
Sleep(1000);
}
::EndPaint(hDlg4, &ps);
return 0;
}
case WM_INITDIALOG: // 初始化对话框
::SetWindowText(hDlg4,"随机矩形");
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
::EndDialog(hDlg4, IDOK);
break;
case IDCANCEL:
::EndDialog (hDlg4, IDCANCEL);
break;
}
break;
}
return 0;
}
六、 必须包含的头文件:
#include <windows.h>
#include <process.h>
#include "resource.h"
#include<math.h>
#include<time.h>