分享
 
 
 

多线程实现四窗口同时运行(请多多指教)

王朝other·作者佚名  2006-02-01
窄屏简体版  字體: |||超大  

题目:创建一个包含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>

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有