如何在c中创建有效的选取框功能

时间:2013-12-26 14:46:08

标签: c marquee

我尝试创建一个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;
}

是否有一个函数来等待给定的延迟到期或另一个活动并恢复执行,这样就不必为了检查给定的延迟已经过去而继续循环。

2 个答案:

答案 0 :(得分:1)

很明显,它占用了CPU - 你的循环是“忙等待”的一个例子,这通常是微控制器的唯一方法,但是其他任何东西都很糟糕,因为它会从其他应用程序窃取CPU时间并播放反对电力管理。

标准C不提供等待功能,因此您必须使用特定于平台的功能。

在Windows上,您通常使用Sleep API(来自<windows.h>),它允许您指定延迟(以毫秒为单位);相反,在POSIX系统上,您可以使用sleep(其粒度为1秒),usleep(允许传递参数中的精度降至µs - 当然延迟本身的精度通常要差得多,全部来自<unistd.h>nanosleep(理论精度低至纳秒,标题<time.h>)。

答案 1 :(得分:1)

您应该在循环中执行以下操作:

  1. 测量时间
  2. 重新打印文字
  3. 再次测量时间并计算差值为1.
  4. 睡眠(延迟 - 差异);
  5. 从1.再次开始