用C多线程实现当年微软的竞赛题

//1986年微软举行的一场程序设计竞赛
/************************************************************************/
/*竞赛题目是:建立一个包含四个窗口的多任务仿真程序。第一个窗口必须显示一系列的递增数,第二个必须
/*显示一系列的递增质数,而第三个必须显示Fibonacci数列(Fibonacci数列以数字0和1开始,后
/*头每一个数都是其前两个数的和-即0、1、1、2、3、5、8等等)。这三个窗口应该在数字达到窗
/*口底部时或者进行滚动,或者自行清除窗口内容。第四个窗口必须显示任意半径的圆,而程序必须
/*在按下一个Esc键时终止。                                                                  
/************************************************************************/
/************************************************************************/
/* 这里采用多线程编写这个程序,程序在VS2005中编译运行通过                                                                  
/************************************************************************/
//引入头文件
#include <Windows.h>
#include <math.h>
#include "process.h"
//定义一个结构体,存放窗口句柄、窗口的宽度和高度、字符的高度和名为bKill的布尔变量
typedef struct {
 HWND hwnd;
 int cxClient;
 int cyClient;
 int cyChar;
 BOOL bKill;
}
PARAMS,*PPARAMS;
//声明窗口过程函数(回调函数)
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//程序主方法
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow){
 static TCHAR szAppName[] = TEXT("Mulit");
 HWND hwnd;
 MSG msg;
 //定义一个窗口类(窗口类是一个结构体)
 WNDCLASS wndclass;
 
 //填充窗口类的各个字段
 wndclass.style = CS_HREDRAW | CS_VREDRAW ;
 wndclass.lpfnWndProc = WndProc;
 wndclass.cbClsExtra = 0;
 wndclass.cbWndExtra = 0;
 wndclass.hInstance = hInstance;
 wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
 wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 wndclass.lpszMenuName = NULL;
 wndclass.lpszClassName = szAppName;
 
 //注册窗口函数
 if(!RegisterClass(&wndclass)){
  MessageBox(NULL,TEXT("this program requires windows NT!"),szAppName,MB_ICONERROR);
  return 0;
 }
 
 //创建窗口
 hwnd = CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,400,NULL,NULL,hInstance,NULL);
 //显示窗口
 ShowWindow(hwnd,iCmdShow);
 //更新窗口
 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;
}
/************************************************************************/
/* Window 1:用来显示一串递增数(从1开始)  线程一                                                             
/************************************************************************/
void Thread1(PVOID pvoid){
 HDC hdc;
 int iNum = 0,iLine = 0;
 PPARAMS pparams;
 TCHAR szBuffer[16];
 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++;
  Sleep(2000);
 }
 _endthread();
}
LRESULT CALLBACK WndProc1(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
 static PARAMS params;
 switch (message){
  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,message,wParam,lParam);
}
/************************************************************************/
/* Window 2:用来显示一串递增的质数  线程二                                                                  
/************************************************************************/
void Thread2(PVOID pvoid){
 HDC hdc;
 int iNum = 1,iLine = 0,i,iSqrt;
 PPARAMS pparams;
 TCHAR szBuffer[16]; 
 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++;
  Sleep(2000);
 }
 _endthread();
}
LRESULT CALLBACK WndProc2(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
 static PARAMS params;
 switch(message){
  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,message,wParam,lParam);
}
/************************************************************************/
/* Window 3:用来显示Fibonacci数列 0,1,1,2,3,5,8,13,21,34......  线程三                                                                  
/************************************************************************/
void Thread3(PVOID pvoid){
 HDC hdc;
 int iNum = 0,iNext = 1,iLine = 0,iTemp;
 PPARAMS pparams;
 TCHAR szBuffer[16];
 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+iNum;
  iNext = iTemp;
  iLine++;
  Sleep(2000);
 }
 _endthread();
}
LRESULT CALLBACK WndProc3(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
 static PARAMS params;
 switch(message){
  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,message,wParam,lParam);
}
/************************************************************************/
/* Window 4:用来画出随机半径的圆  线程四                                                                  
/************************************************************************/
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);
  Sleep(2000);
 }
 _endthread();
}
LRESULT CALLBACK WndProc4(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
 static PARAMS params;
 switch(message){
  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,message,wParam,lParam);
}
/************************************************************************/
/* Main Window:用来创建子窗口                                                                  
/************************************************************************/
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
 static HWND hwndChild[4];
 static TCHAR * szChildClass[] = {TEXT("Child1"),TEXT("Child2"),TEXT("Child3"),TEXT("Child4")};
 static WNDPROC ChildProc[] = {WndProc1,WndProc2,WndProc3,WndProc4};
 HINSTANCE hInstance;
 int i,cxClient,cyClient;
 WNDCLASS wndclass;
 switch(message){
  case WM_CREATE:
   hInstance = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
   wndclass.style = CS_HREDRAW | CS_VREDRAW;
   wndclass.cbClsExtra = 0;
   wndclass.cbWndExtra = 0;
   wndclass.hInstance = hInstance;
   wndclass.hIcon = NULL;
   wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
   wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
   wndclass.lpszMenuName = NULL;
   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:
   //判断是否按下ESC键(此处是键盘虚拟码、十六进制)
   if(wParam == '\x1B'){
    DestroyWindow(hwnd);
   }
   return 0;
  case WM_DESTROY:
   PostQuitMessage(0);
   return 0;
 }
 return DefWindowProc(hwnd,message,wParam,lParam);
}


 

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值