很多人在做聊天室项目,处理聊天窗口会发生信息挤压,光标乱跳的情况;
要实现像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