前几天学习了一些基本的Win32 多线程知识,为了巩固一下多线程,特意在书上找了一些简单的代码来练习,以此加深对多线程的理解。

简单例子:在控制台随机的显示字符

#include <iostream>
#include <windows.h>
#include <process.h>
#include <ctime>
#include <cstdlib>
using namespace std;

CONSOLE_SCREEN_BUFFER_INFO csbi;//描述控制台的信息结构
HANDLE hStdOut;//控制台窗口句柄
bool repeat = true;//控制程序是否继续运行

void stopRunning();
void Thread(LPVOID lpParam);
int getRandom(int,int);

int main()
{
    char c='A';
    hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hStdOut,&csbi);
    //_beginthread(stopRunning,0,NULL);
    CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)stopRunning,NULL,NULL,NULL);
    while (repeat)
    {
        
        CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)Thread,&c,NULL,NULL);
        c++;
        Sleep(1000);
    }
    return 0;
}
/************************************************************************/
/* stopRunning 等待键盘输入以便终止程序                                 */
/************************************************************************/
void stopRunning()
{
    getchar();
    repeat = false;
}
/************************************************************************/
/* Thread线程负责创建和控制在屏幕上四处移动的色彩颜色                   */
/************************************************************************/
void Thread(LPVOID lpParam)
{
    char *p=(char*)lpParam;
    //cout<<*p<<endl;
    //根据线程参数产生颜色
    char blankcell=0x20;
    char blockcell=*p;
    bool first = true;
    COORD oldcoord,newcoord;
    DWORD result;
    
    //根据当前时间产生一个随机数
    
    newcoord.X = getRandom(0,csbi.dwSize.X-1);
    newcoord.Y = getRandom(0,csbi.dwSize.Y-1);

    while (repeat)
    {
        Sleep(100);
        if (first)
        {
            first=false;
        } 
        else
        {
            //cout<<"here\n";
            WriteConsoleOutputCharacter(hStdOut,&blockcell,1,oldcoord,&result);
        }
        //位置转换
        oldcoord.X = newcoord.X;
        oldcoord.Y = newcoord.Y;

        newcoord.X += getRandom(-5,5);
        newcoord.Y += getRandom(-5,5);

        //如果将要超出屏幕,那么得对位置进行调整

        if (newcoord.X < 0)
            newcoord.X = 1;
        else if (newcoord.X == csbi.dwSize.X)
            newcoord.X = csbi.dwSize.X -2;
        else if(newcoord.Y<0)
            newcoord.Y = 1;
        else if(newcoord.Y == csbi.dwSize.Y)
            newcoord.Y = csbi.dwSize.Y - 2;
        else
            continue;

        //产生声音
        Beep((*p-'A')*100,175);
    }
    //ExitThread()
    //_endthread();

}

/************************************************************************/
/* 产生一个min和max间的随机数                                           */
/************************************************************************/
int getRandom(int min,int max)
{
    srand(time(0));
    return rand()%(max-min+1)+min;
}

/************************************************************************/

 运行时需要如图设置

运行效果: