+ -
当前位置:首页 → 问答吧 → 请教一个多线程的问题

请教一个多线程的问题

时间:2007-09-13

来源:互联网

我在基于9200的班子上写了一个程序,主程序里用死循环在屏幕上显示滚动内容,另外再开了个线程,用定时器每隔几秒钟检测一次硬件,发现主程序里的显示内容有明显停顿,开始我以为是线程里有阻塞函数,导致整个进程的停顿,后来把线程里的代码全部注释,只剩下一个空的死循环,还是有停顿,但是如果在循环里面加上一条printf语句,随便输出几个字符,主程序里的显示内容就很流畅,不会停顿了,请问是什么原因,跟线程的建立有关系吗?请兄弟们指点,谢谢!!!      

作者: alldying   发布时间: 2007-09-13

为什么用死循环

printf显示的和你要显示的不都是字符?printf显示很流畅,你自己写的显示字符的不流畅?      

作者: AIKO_sex   发布时间: 2007-09-14

显示滚动和printf不一样?不知道你说的滚动是什么。      

作者: flag   发布时间: 2007-09-14

首先感谢 flag 和 AIKO_sex 的回复。

可能是我没有描述清楚。程序的功能就是不停的以各种方式(逐行上滚、左移、右移等)在屏幕上显示文字和图片,同时每隔几秒钟检测并设置一些硬件参数,我分了两个线程,主线程用来显示(为方便描述,我称为显示线程),另外一个线程用来每隔几秒钟检测并设置硬件参数(为方便描述,我称为检测线程),检测线程用setitimer(ITIMER_REAL, &itv, &oldtv)和signal(SIGALRM, Contrl)实现每隔几秒钟检测并设置,因为程序的目的就是显示和检测,所以两个线程我都用了死循环while(1){};来实现。

现在我的问题是,如果只有显示线程,那么显示得很流畅,如果把检测线程加上的话,显示线程的显示就有明显的停顿,而且停顿不均匀,我以为检测线程有阻塞函数导致整个进程的阻塞而引起停顿,就把检测线程里所有代码注释掉,只留下一个空的死循环,还是有不均匀的停顿,但是如果在检测线程的空的死循环里加入一条printf,顺便循环输出几个字母后,显示线程的显示就没有了停顿,很流畅了。请问是什么原因呢,跟线程的属性有关吗,请各位兄弟继续指点,谢谢!


补充一下:显示线程的效果就类似有些城市的广场上的大屏显示广告时的效果,只不过我的比较简单,常见的就是一行文字和图片混排的内容从屏幕的右边慢慢移动到左边,我们称这种方式为左移,停留一段时间后再更换内容再从屏幕右边移动到左边,如此循环,直到手动关闭程序。因为程序的目的就是显示这些内容,所以程序不会主动退出,除非出错,所以用死循环,只能手动关闭。

      

作者: alldying   发布时间: 2007-09-14

有两个方面你需要查看一下:
1、每个线程都应该在适当的地方睡眠一会儿,对于显示线程每次可以睡10~40毫秒,检测线程则可以使用秒级的睡眠。
2、显示输出的内容如果没有换行符,则应主动刷新输出,比如使用fflush(stdout)。      

作者: netpublic   发布时间: 2007-09-14

谢谢netpublic的回复。

照你说的在每个线程里加上sleep或usleep后,情况明显改善,非常感谢!      

作者: alldying   发布时间: 2007-09-17