目标是使workin()
成为低优先级线程,同时进行其他非常繁重的计算。
有没有办法制作wait()
,比方说,0.5秒?
是否可以在wait()
时阻止传入的字符到终端?因为它与打印到“处理......”的字符混淆了,这部分解决了,见下面的解决方案
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void *workin(){
int i=0,count=10;
char v[]={' ',' ','-','-','-',' ',' ',' ',' ',' '};
for(;;){
for(i=count-1;i>=0;i--){
v[(i+1)%(count)]=v[i];
}
fflush(stdout);
printf("\r");
printf("processing ");
printf("%s ",v);
sleep(1);
}
}
int main(int argc, char *argv[]){
pthread_t tid;
pthread_create(&tid,NULL,workin,NULL);
sleep(15);/*HEAVY stuff here*/
pthread_cancel(tid);
printf("\r\n");
return 0;
}
一半已解决,缺少wait(0.5)
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
char getch(){
/*#include <unistd.h> //_getch*/
/*#include <termios.h> //_getch*/
char buf=0;
struct termios old = {0};
fflush(stdout);
if(tcgetattr(0, &old) < 0)
perror("tcsetattr()");
old.c_lflag&=~ICANON;
old.c_lflag&=~ECHO;
old.c_cc[VMIN]=1;
old.c_cc[VTIME]=0;
if(tcsetattr(0, TCSANOW, &old) < 0)
perror("tcsetattr ICANON");
if(read(0,&buf,1)<0)
perror("read()");
old.c_lflag|=ICANON;
old.c_lflag|=ECHO;
if(tcsetattr(0, TCSADRAIN, &old) < 0)
perror ("tcsetattr ~ICANON");
return buf;
}
void *workin(){
int i=0,count=10;
char v[]={' ',' ','>','>','>',' ',' ',' ',' ',' '};
for(;;){
for(i=count-1;i>=0;i--){
v[(i+1)%(count)]=v[i];
}
fflush(stdout);
printf("processing ");
printf("%s ",v);
printf("\r");
sleep(1);
}
}
int main(int argc, char *argv[]){
char ch=0;
pthread_t tid;
pthread_create(&tid,NULL,workin,NULL);
do{
ch=getch();/*HEAVY CALCULATIONS HERE*/
}while(1);
pthread_cancel(tid);
printf("\r\n");
return 0;
}
答案 0 :(得分:0)
一种方法是将特定线程输出传递给终端(手动打开),如写入文件内容
答案 1 :(得分:0)
我学会“冲洗”stdin
的方法是从中读取并丢弃信息。
我发现做wait()
半秒(0.5秒)的方式正在使用:
#define _XOPEN_SOURCE 600
usleep(500000);