很多人在做聊天室项目,处理聊天窗口会发生信息挤压,光标乱跳的情况;
要实现像QQ那样的聊天窗口,我们需要多开一个进程或线程;
且执行线程/子进程的时候,不影响主线程/进程的输入;
#include<stdio.h> #include<pthread.h> #include<signal.h> #include <unistd.h> int n=0; void handle(int signum) { n++; //使每次进程内容不同 printf("\033[0m\033[s"); //保存当前光标 printf("\033[0m\033[1;1H"); //光标跳到第一行,第一格 printf("hello %d\n",n); printf("\033[0m\033[u"); printf("\033[0m\033[u"); //恢复光标 fflush(stdout); //清空I/O缓存中的标准输出缓存使光标恢复到原点 alarm(5); //定时器计5秒 } int main() { setbuf(stdin, NULL); system("clear"); pthread_t a1; int ret; alarm(2); signal(SIGALRM,handle); //设置一个定时器,每五秒开个子进程执行handle函数 while(1) { printf("\033[0m\033[7;0H"); //光标跳到第七行 printf("Enter:\n"); //主进程输入 char a[20]={0}; fgets(a,20,stdin); printf("you printf is %s",a); } }
以上代码可以避免光标乱跳;
TIP: signal接受信息后的处理函数属于原子操作;
为了避免聊天记录挤压到输入行
我们可以采取定向清屏操作
#include<stdio.h> int main() { int i=0; for(i=0;i<3;i++) printf("12121\n1212121\n2121212\n"); //输出多行信息 printf("\033[0m\033[1;1H"); //跳到第一行 for(i=0;i<5;i++) //清空五行信息 { printf("\033[0m\033[K"); //清空当前光标所在行 printf("\n"); } getchar(); //回车键结束 } ~ ~
关于聊天室的其他问题
可以去参考 http://blog.csdn.net/wjb123sw99/article/details/77331281