出于好奇,我决定让程序开始计算,然后允许用户输入一个字符来查看计算的距离.因此,在这种情况下,如果程序正在计算Fibonacci序列的第n项并且尚未完成,则输入数字“1”将使程序输出它当前正在计算的项k.我尝试使用以下方法来做到这一点.
该程序使用scanf获得一个长整数,表示需要计算的序列的项.然后程序创建一个线程,其中包含我编写的例程,用于计算和打印第n个Fibonacci项,一旦完成,就会退出.之后,程序创建一个整数变量,用于存储输入并初始化它,使其具有非零值.然后,只要该int非零,它就连续进入while循环,并且在循环的每次迭代中,它执行scanf(“%d”,& i).然后它将该值与1进行比较,如果它为1,那么它将打印我设置的计数器的值以跟踪斐波纳契计算的进度.
无论如何,尽管我对线程之类的东西非常不敏感,但上述所有工作都非常顺利.但是,我遇到的问题是,当我必须计算序列的第一百万个项时,程序需要几分钟才能完成,而在后台运行它会很不错.但是,如果我使用ctrl z将进程置于后台然后键入bg,则进程将启动但会立即再次停止.我猜这是因为它不断要求用户输入,因此它会停止,直到它获得输入.
任何关于如何规避上述问题的建议都将不胜感激.我并不特别担心这个特定问题(Fibonacci数的计算),因为这只是我选择用于计算的一个相当随机的问题.我对创建用户向程序输入命令的基本方法的一般问题更感兴趣,然后程序在单独的线程中执行,但仍然允许用户在必要时在后台运行程序.
为这个相当冗长的问题道歉,并提前感谢任何帮助!
菲尔
编辑:根据请求,我在这里添加了(一个非常简化的版本)代码.基本思路是一样的:程序在新线程中启动一个冗长的计算,然后使用scanf循环输入.输入0退出程序,输入1显示一个指示计算进度的计数器.我希望能够在后台运行该程序,但由于它不断要求输入,它会立即停止该过程.忽略计数器上的算术溢出;我的实际程序有数据结构来处理这种东西,但我尽可能地简化我的代码以便于阅读.
//Simple program to test threading and input. #include <stdio.h> #include <pthread.h> #define NUM_THREADS 2 void *stuff(); int counter; //keeps track of the progress of the computation int main(){ counter=1; pthread_t threads[NUM_THREADS]; pthread_create(&threads[0],NULL,stuff,NULL); //loop while the input is non-zero so that the program can //accept commands int input=10; while(input){ input=10; printf("Enter 0 to exit or 1 to display progress: "); scanf("%d",&input); if(input==1){ printf("Currently iterating for the %dth time.\n",counter); } } return 0; } //Randomly chosen computation that takes a while. void *stuff(){ long i,j,n=1000000000; for(i=0; i<=n; i++){ for(j=0; j<=n; j++){ i*i*i*i*i*i*i*i*i*i*i; j*j*j*j*j*j*j*j*j*j*j; counter++; } } printf("Done.\n"); pthread_exit(NULL); }