ncurse界面编程多线程示例
linux ncurses界面编程网上资料很多,这里不再详述,这里只给一个例子。该示例给出了一个左右跳动的字符串数组景象:
//Compile: gcc -g ncurses_demo.c -o ncurses_demo -lpthread -lncurses
//Run: ./ncureses_demo 1 2 3 4 5 6 7 8 9 0
//Usage: q quit, 空白 全部反向, 0-9, 指定某行字符反向显示
//#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <curses.h>
#include <pthread.h>
#include <unistd.h>#define MAXMSG 10 //最多允许用户输入的字符串个数,超过的部分会忽略, 也是创建的线程数
#define TUNIT 20000 //usleep函数休眠的时间因子struct propset
{char *str; //显示的字符串int row; //行数, 一个线程对应一行int delay; //超时时间int dir; //方向, 向左或是向右
};int setup (int, char **, struct propset *);
void *animate (void *arg);pthread_mutex_t mx = PTHREAD_MUTEX_INITIALIZER;int main (int argc, char *argv[])
{int c;pthread_t thrds[MAXMSG];struct propset props[MAXMSG];int num_msg;int i;if (argc == 1){printf ("usage:%s string ...\n", argv[0]);exit (1);}num_msg = setup (argc - 1, argv + 1, props);for (i = 0; i < num_msg; i++){ //用户输入几个字符串就创建几个线程if (pthread_create (&thrds[i], NULL, animate, &props[i])){ //若成功创建线程会返回0fprintf (stderr, "error creating thread");endwin ();exit (0);}}while (1){c = getch ();if (c == 'Q' || c == 'q')break; //退出if (c == ' '){ //全部反向for (i = 0; i < num_msg; i++)props[i].dir = -props[i].dir;}if (c >= '0' && c <= '9'){ //指定某个字符串反向i = c - '0';if (i < num_msg)props[i].dir = -props[i].dir;}}pthread_mutex_lock (&mx); //上锁,然后取消所有的线程for (i = 0; i < num_msg; i++)pthread_cancel (thrds[i]);endwin ();return 0;
}int setup (int nstring, char *strings[], struct propset props[])
{int num_msg = (nstring > MAXMSG ? MAXMSG : nstring); //限制输入的字符串最大个数, 这里是10个int i;srand (getpid ());for (i = 0; i < num_msg; i++){props[i].str = strings[i];props[i].row = i;props[i].delay = 1 + (rand () % 15);props[i].dir = ((rand () % 2) ? 1 : -1);}initscr ();crmode ();noecho ();clear ();mvprintw (LINES - 1, 0, "'Q' to quit,'0'..'%d' to bounce", num_msg - 1); //在屏幕底端打印字条串return num_msg;
}void *animate (void *arg)
{struct propset *info = arg;int len = strlen (info->str) + 2; //+2 for paddingint col = rand () % (COLS - len - 3);while (1){usleep (info->delay * TUNIT);pthread_mutex_lock (&mx);move (info->row, col);addch (' ');addstr (info->str);addch (' ');move (LINES - 1, COLS - 1);refresh ();pthread_mutex_unlock (&mx);col += info->dir;if (col <= 0 && info->dir == -1)info->dir = 1;else if (col + len >= COLS && info->dir == 1)info->dir = -1;}
}
用法如下:
./ncurese_demo 1 2 3 4 5 6 7 8 9 0
q 退出, 空白键 全部反向, 0-9之一 指定某行字符反向显示
运行截图
参考文献
[1].http://www.kuqin.com/cpluspluslib/20111226/316716.html
[2].http://www.cnblogs.com/Xiao_bird/archive/2009/07/21/1527947.html
ncurse界面编程多线程示例相关推荐
- java图形界面多线程_多线程编程、Java I/O系统和Java图形界面编程
多线程编程: 一个正在运行的程序通常称为一个进程,每一个任务称为一个线程,中能够在一个程序内运行多线程的程序称为多线程程序. 线程与进程的区别:①每个进程都需要操作系统为其分配独立的内存空间: ②而同 ...
- 【Java AWT 图形界面编程】使用鼠标滚轮缩放 Canvas 画布中绘制的背景图像 ( 绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩放 + 以当前鼠标指针位置为缩放中心 示例 )
文章目录 一.鼠标滚轮缩放的中心点设置为当前鼠标中心点 - 要点分析 1.保存当前鼠标指针指向的位置 2.根据鼠标指针指向的位置以及比例重新计算图片位置 二.绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩 ...
- 【JAVA小游戏+水果售卖系统】基于GUI界面编程的水果“人生”模拟系统
[JAVA]基于GUI界面编程的水果"人生"模拟系统 一.系统主要功能及简介 二.系统体系结构 三.系统设计技术 四.编码说明 五.效果展示 一.系统主要功能及简介 该系统以JAV ...
- python中的gui界面编程_python应用系列教程——python的GUI界面编程Tkinter全解
全栈工程师开发手册 (作者:栾鹏) python的GUI界面编程,常用的几个python库包含如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包 ...
- 【C语言】控制台窗口图形界面编程(一)句柄和文本属性
00. 目录 文章目录 00. 目录 01. 句柄 02. GetStdHandle函数 03. CloseHandle函数 04. SetConsoleTextAttribute函数 05. 十进制 ...
- linux QT 结束当前进程_软件特攻队|为什么 Qt 成为 c++ 界面编程的第一选择?
一.前言 为什么说QT越来越成为界面编程的第一选择,这要从当初为什么从MFC转到QT开始说.若想把MFC开发界面想做得好看一些是十分困难的一件事,引用第三方基于MFC的界面库代码也比较混乱,而当时看到 ...
- android应用的界面编程----View与ViewGroup的概念
1 UI OverView Android中所有的UI元素都是通过View与ViewGroup来构建的,View是指屏幕中一块可与用户进行交互的空白,类似于java界面编程中的JPanel.为了界面布 ...
- javascript函数式_JavaScript中的函数式编程—结合实际示例(第2部分)
javascript函数式 by rajaraodv 通过rajaraodv JavaScript中的函数式编程-结合实际示例(第2部分) (Functional Programming In Jav ...
- C语言控制台窗口界面编程:printf格式化显示-修改字符字体、颜色和背景
环境:cygwin-Linux+GCC PS:windows的cmd下不能实现. 在linux终端中一个ls指令得出的显示结果文件夹.文件以及不同操作权限的文件的显示颜色是不同的,那么这个是如何实现的 ...
最新文章
- hihoCoder-1830 2018亚洲区预选赛北京赛站网络赛 C.Cheat 模拟
- oracle统计数据库所有表的数据记录数SQL
- Python基础(10)--数字
- Java判断文件类型
- c++ 结构体构造函数使用总结 附一道经典模拟题
- 2019吉首大学计算机调剂,吉首大学2019年硕士研究生调剂考生复试情况分学院公示...
- P3599-Koishi Loves Construction【构造,数论】
- 2020年阿里云年中大促【福利】【选品】全攻略
- pyplot 画多个图时搅合到了一起_这些认数字游戏,宝宝最喜欢,家长可以和宝宝一起玩...
- MyBatis第3天
- Google App Engine 功能被滥用于创建无限制的钓鱼页面
- Python编程:数据可视化《Python编程:从入门到实践 第2版》笔记
- 深入浅出数据分析:最优化-用Excel求解一个线性规划问题
- 人体姿态识别-左肩和左肘的定位识别
- Android, App常用图标尺寸规范
- html5 合成两张图片,HTML5 Canvas笔记——图像合成
- Abis接口的概念和引发的商业策略
- mysql my.cof 配置表空间_my.conf配置大全
- ABB机器人的程序结构与模块属性
- 字节java岗位一面(凉面)
热门文章
- Redis 入门安装(Linux)
- 一个fork短码的扩展版本
- sskeychain使用(轻量级框架)
- Codeforces Round #228 (Div. 1)B
- MySql按日期进行统计(前一天、本周、某一天)[转载]
- 【转】Visual C#创建和使用ActiveX组件
- Linux 常用技巧记录
- usaco ★Stamps 邮票
- byte数组穿换成pcm格式_Apache Arrow:一种适合异构大数据系统的内存列存数据格式标准...
- tcp udp区别优缺点_CCNA必懂篇,传输层协议TCP/UDP的区别和作用