zoukankan      html  css  js  c++  java
  • 多线程的简单应用

    前几天学习了一些基本的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
    ";
                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;
    }
    
    /************************************************************************/

     运行时需要如图设置

    运行效果:

  • 相关阅读:
    SCOI2014 方伯伯的OJ onlinejudge
    【JZOJ4854】【NOIP2016提高A组集训第6场11.3】小澳的坐标系
    【JZOJ4847】【NOIP2016提高A组集训第5场11.2】夕阳
    【JZOJ4846】【NOIP2016提高A组集训第5场11.2】行走
    【JZOJ4845】【NOIP2016提高A组集训第5场11.2】寻找
    【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集
    【JZOJ4840】【NOIP2016提高A组集训第4场11.1】小W砍大树
    【JZOJ4835】【GDOI2017模拟10.31】量化交易
    【JZOJ4831】【NOIP2016提高A组集训第3场10.31】方程式
    【JZOJ4832】【NOIP2016提高A组集训第3场10.31】高维宇宙
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/3389022.html
Copyright © 2011-2022 走看看