实验内容
在 windows 环境下,利用高级语言编程环境(限定为 VS 环境或 VC 环境) 调用CreateThread 函数实现“并发地画圆和画方”。圆的中心,半径,颜色,正方形的中心,边长,颜色等参数自己确定,合适就行。圆和正方形的边界上建议 取 720 个点。为直观展示绘制的过程,每个点绘制后睡眠 0.2 秒~0.5 秒。
实现
就这道题的思想而言,要实现实验内容其实并不难。对于我们来说,只需要编写一个画圆的函数和一个画方的函数,然后再用CreateThread函数创建两个线程,分别画圆和画方,就可以实现并发的画圆和画方了。
关于画圆和画方的函数
这里,我们有两个思路。第一,直接在控制台对应的坐标打印*来画圆和画方,但这样画出来太丑。因此,我们采取第二种方法,导入graphcis.h头文件,创建画板,再调用里面的putpixel函数,给对应坐标的像素点赋色。这样画出来的圆和方就是一个标准的圆和方了。
需要说的一点是,graphcis.h是TC才有的头文件,因此如果你是用的VS之类的编译器,还需要自己手动导入这一头文件。导入的方法可以参考我写的另一篇博客:
https://blog.youkuaiyun.com/qq_42606750/article/details/89296952
代码
#include "pch.h"
#include <iostream>
#include<stdlib.h>
#include <graphics.h>
#include<math.h>
#include <windows.h>
DWORD WINAPI drawCircle(LPVOID lpParam) {
double pi = 3.1415926;
for (int i = 0; i < 800; i++) {
int x = 200 + 100*cos(i*pi/400);
int y = 200 + 100*sin(i*pi/400);
putpixel(x, y, RED);
Sleep(10);
}
return 0;
}
DWORD WINAPI drawRectangle(LPVOID lpParam) {
int x, y;
for (int i = 0; i < 800; i++) {
if (i < 200) {
x = 500 + i;
y = 100;
}
else if (i < 400) {
x = 700;
y = 100 + (i-200);
}
else if (i < 600) {
x = 700 - (i - 400);
y = 300;
}
else {
x = 500;
y = 300 - (i - 600);
}
putpixel(x, y, RED);
Sleep(10);
}
return 0;
}
int main(){
initgraph(800, 400);
setbkcolor(YELLOW);
HANDLE hThread[2];
hThread[0] = CreateThread(NULL, 0, drawCircle, NULL, 0, NULL);
hThread[1] = CreateThread(NULL, 0, drawRectangle, NULL, 0, NULL);
WaitForMultipleObjects(2, hThread, TRUE, INFINITE); //等待子线程运行
system("pause");
closegraph(); // 关闭绘图窗口
return 0;
}