zoukankan      html  css  js  c++  java
  • 线程响应键盘按键的例子

    例子1:键盘输入的字符会排队,一个一个被线程处理。

    #include <iostream>
    #include <stdio.h>
    #include <pthread.h>
    using namespace std;
    
    char ch = 0;
    pthread_t tid;
    
    void *thread_func(void *arg)
    {
            while(true)
            {
                    ch=getchar();
                    sleep(1);
            }
    }
    
    int main()
    {
            //pthread_t tid;
            if (pthread_create(&tid, NULL, thread_func, NULL) != 0)
            {
                    cout<<"Create thread error
    ";
                    return -1;
            }
    
            while(1)
            {
                    if(ch=='p' || ch=='P')
                    {
                            cout<<"Keboard: '"<<ch<<"': print"<<endl;
                            ch=0;
                            continue;
                    }else if(ch=='q' || ch=='Q')
                    {
                            cout<<"Keboard: '"<<ch<<"': exit"<<endl;
                            break;
                    }
    
            }
            return 0;
    
    }

    输出结果:

    [root@localhost thread]# ./a.out
    p
    Keboard: 'p': print
    p
    p
    op
    Keboard: 'p': print
    Keboard: 'p': print
    Keboard: 'p': print
    pppppq
    Keboard: 'p': print
    Keboard: 'p': print
    Keboard: 'p': print
    Keboard: 'p': print
    Keboard: 'p': print
    Keboard: 'q': exit

    [root@localhost thread]# ./a.out
    p
    Keboard: 'p': print
    ^C

    例子2:信号和线程一起的例子

    #include <iostream>
    #include <stdio.h>
    #include <pthread.h>
    #include <signal.h>
    using namespace std;
    
    char ch = 0;
    
    //signal
    void handle_sigint(int)
    {
            printf("[singal]: catched ctrl+c
    ");
            ch='q';
    }
    
    //pthread
    pthread_t tid;
    void *thread_func(void *arg)
    {
            while(true)
            {
                    ch=getchar();
                    sleep(1);
            }
    }
    
    int main()
    {
            //signal
            struct sigaction sig;
            sig.sa_handler = handle_sigint;
            sigemptyset(&sig.sa_mask);
            sig.sa_flags = 0;
            sigaction(SIGINT, &sig, NULL);
    
            //pthread_t
            if (pthread_create(&tid, NULL, thread_func, NULL) != 0)
            {
                    cout<<"Create thread error
    ";
                    return -1;
            }
    
            while(1)
            {
                    if(ch=='p' || ch=='P')
                    {
                            cout<<"Keboard: '"<<ch<<"': print"<<endl;
                            ch=0;
                            continue;
                    }else if(ch=='q' || ch=='Q')
                    {
                            cout<<"Keboard: '"<<ch<<"': exit"<<endl;
                            break;
                    }
    
            }
    
            return 0;
    
    }

    输出结果:

    [root@localhost thread]# ./a.out
    p
    Keboard: 'p': print
    p
    p
    Keboard: 'p': print
    Keboard: 'p': print
    q
    Keboard: 'q': exit

  • 相关阅读:
    解决360浏览器兼容模式的页面显示问题
    .NET知识点汇总
    C# 6.0新加特性
    C# 5.0新加特性
    C# 4.0新加特性
    C# 3.0新加特性
    C# 2.0新加特性
    C#中null、""、string.empty区别
    C#使用SQLite
    页面 关于处理如何点击按钮实现定位到某一位置操作
  • 原文地址:https://www.cnblogs.com/jacklikedogs/p/3957828.html
Copyright © 2011-2022 走看看