我尝试创建一个marquee函数,每次调用它时都会移动给定的文本(它放在一个无限循环中)。但它使用了太多的CPU进程。 有没有办法让它变得有效?
int myfunc_Marquee ( COORD StartPosition, int Direction, char Text [ ], int Delay)
{
int Length = strlen ( Text ),
width,
height;
clock_t time2,timeD;
static clock_t time1;
static COORD CurrentPosition;
static BOOL flag;
COORD RestorePosition = { wherex ( ), wherey ( ) };
width = 60;
height = 20;
time2 = clock ( );
timeD = time2 - time1; //time difference
if ( time1 == 0 ) //on first call just prints the text
{
CurrentPosition = StartPosition;
myfunc_gotoxy ( CurrentPosition.X, CurrentPosition.Y );
fputs ( Text, stdout );
Direction %= 4;
if ( ( Direction == 2) || ( Direction == 3 ) )
flag = 1;
time1 = time2;
}
else if ( timeD > Delay) // if more than the given delay time has passed move the text
{
myfunc_SetOutputColor ( 0, 0 );//erases the last printed text
myfunc_gotoxy ( CurrentPosition.X, CurrentPosition.Y );
fputs ( Text, stdout );
if (Direction%2 == 0) //0 for horizontal or 1 for vertical
{
if (flag == 0)//move left or right
{
if ( CurrentPosition.X < width)
{
CurrentPosition.X++;
}
else
{
flag = 1;
CurrentPosition.X--;
}
}
else
{
if ( CurrentPosition.X > 2 )
{
CurrentPosition.X--;
}
else
{
flag = 0;
CurrentPosition.X++;
}
}
}
else
{
if (flag == 0) //move up or down
{
if ( CurrentPosition.Y < height)
{
CurrentPosition.Y++;
}
else
{
flag = 1;
CurrentPosition.Y--;
}
}
else
{
if ( CurrentPosition.Y > 1)
{
CurrentPosition.Y--;
}
else
{
flag = 0;
CurrentPosition.Y++;
}
}
}
myfunc_gotoxy ( CurrentPosition.X, CurrentPosition.Y ); /* positions the cursor at given coordinates */
myfunc_SetOutputColor ( 0, 10 );/*prints the text*/
fputs ( Text, stdout );
time1 = time2;
}
myfunc_gotoxy ( RestorePosition.X, RestorePosition.Y );//restores the cursor position
return 0;
}
是否有一个函数来等待给定的延迟到期或另一个活动并恢复执行,这样就不必为了检查给定的延迟已经过去而继续循环。
答案 0 :(得分:1)
很明显,它占用了CPU - 你的循环是“忙等待”的一个例子,这通常是微控制器的唯一方法,但是其他任何东西都很糟糕,因为它会从其他应用程序窃取CPU时间并播放反对电力管理。
标准C不提供等待功能,因此您必须使用特定于平台的功能。
在Windows上,您通常使用Sleep
API(来自<windows.h>
),它允许您指定延迟(以毫秒为单位);相反,在POSIX系统上,您可以使用sleep
(其粒度为1秒),usleep
(允许传递参数中的精度降至µs
- 当然延迟本身的精度通常要差得多,全部来自<unistd.h>
或nanosleep
(理论精度低至纳秒,标题<time.h>
)。
答案 1 :(得分:1)
您应该在循环中执行以下操作: