Спящий режим работает только в режиме отладки, а не в режиме выпуска (Embarcadero C ++ Builder) - PullRequest
0 голосов
/ 15 октября 2018

Я использую Embarcadero C ++ Builder (инженер, а не программист)

Я считаю, что функция сна работает только для меня в режиме отладки, а не в режиме выпуска.Я вижу ссылки в StackOverFlow не на использование Sleep, а на использование TTimer.

Я просто хочу, чтобы мое приложение приостановилось на несколько секунд между рисованными объектами согласно Sleep (500);в приведенном ниже коде, чтобы я мог видеть каждый нарисованный объект и проверять их правильность, в противном случае происходит быстрая проверка.

DrawSelectedShape (k, Side, AddOrDeduct, Color);в приведенном ниже коде процесс, который требует приостановки

for (int n=0; n<LiquidLoads->TankBasicData->NoLiquidTypes; ++n){
  for (int m=0; m<LiquidLoads->TankBasicData->NumberOfTanks[n]; ++m)
  {
    for (int l=1; l<LongStrengths->TotalNumberOfParts+1; ++l)
     {
       if (LiquidLoads->TankHeaderArray[n][m]->GhsName == LongStrengths->PartHeader[l]->PartName)
       {

         for (int j=0; j<LongStrengths->PartHeader[l]->NoOfComponents; ++j)
         {
            int k = LongStrengths->PartData[l][j]->ShapeNumber;
            int Side = LongStrengths->PartData[l][j]->Side;
            float AddOrDeduct = LongStrengths->PartData[l][j]->Effectiveness;
            AnsiString Color = LiquidLoads->TankBasicData->LiquidTypeColor[n];
            DrawSelectedShape(k,Side,AddOrDeduct,Color);

            Canvas->TextOut(1200, 300+(n*25),LiquidLoads->TankBasicData->LiquidType[n]);
            Sleep(300);
         }
       break;
       }
   }
}  }

Приведенный выше код прекрасно работает в режиме отладки, но в режиме выпуска он работает нормально, если первые несколько фигур были нарисованы на холсте, а затем вы получаетекурсор мыши с вращающимся колесом на некоторое время, за которым следует пустой холст.

Поэтому я ищу альтернативу Sleep.

При использовании TTimer (без опыта) можно использовать событие OnTimer.и поместите код, который выполняется многократно в событии, с задержкой, связанной с интервалом Timer1, который не совсем совпадает с поиском задержки в несколько секунд в середине цикла for

Вот какмой рендеринг выглядит так:

animation

Любой совет, наиболее ценный.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Чтобы избежать циклов for и операторов if, которые были частью процесса рисования на холст с использованием метода Sleep для приостановки циклов, теперь мне сначала нужно было сгенерировать последовательность рендеринга для Struct, которую я затем мог бы использоватьс одним последовательным счетчиком в TTimer

, как показано ниже

//---------------------------------------------------------------------------
void __fastcall TShipGraphic::DrawSelectedTanksBtnClick(TObject *Sender)
{
    GenerateRenderSequence();
    Timer1->Interval = StrToInt(Edit1->Text);
    CloseButton->Enabled = false;
    render_ix=0; //Initialised globally

     Timer1->Enabled = true;

}
//---------------------------------------------------------------------------
void __fastcall TShipGraphic::Timer1Timer(TObject *Sender)
{
 render_ix++;
 Timer1->Interval = StrToInt(Edit1->Text);
 if (render_ix<=TankShapeCounter)
 {
    DrawSelectedComponentShape(render_ix); // render i-th object
    Canvas->Refresh();
 }
 else
 {
   Timer1->Enabled = false;
   CloseButton->Enabled = true;
 }
}
//---------------------------------------------------------------------------
void TShipGraphic::GenerateRenderSequence()
{
   TankShapeCounter = 0;

  for (int n=0; n<LiquidLoads->TankBasicData->NoLiquidTypes; ++n)
  {
    if ((CheckListBox1->Checked[n]) || (CheckListBox1->Checked[LiquidLoads->TankBasicData->NoLiquidTypes]))
    {
      for (int m=0; m<LiquidLoads->TankBasicData->NumberOfTanks[n]; ++m)
      {

        for (int l=1; l<LongStrengths->TotalNumberOfParts+1; ++l)
         {
           if (LiquidLoads->TankHeaderArray[n][m]->GhsName == LongStrengths->PartHeader[l]->PartName)
           {

             for (int j=0; j<LongStrengths->PartHeader[l]->NoOfComponents; ++j)
             {
                ++TankShapeCounter;
                int k = LongStrengths->PartData[l][j]->ShapeNumber;
                int Side = LongStrengths->PartData[l][j]->Side;
                float AddOrDeduct = LongStrengths->PartData[l][j]->Effectiveness;
                AnsiString Color = LiquidLoads->TankBasicData->LiquidTypeColor[n];
                RenderSequence[TankShapeCounter]->ShapeNumber = k;
                RenderSequence[TankShapeCounter]->Side = Side;
                RenderSequence[TankShapeCounter]->AddOrDeduct = AddOrDeduct;
                RenderSequence[TankShapeCounter]->Color = Color;
             }
           break;
           }
         }
      }
    }
  }
}
//---------------------------------------------------------------------------

Я хотел использовать аккуратный анимированный GIF-метод @ Spectre, чтобы показать результат, но моя игровая панель слишком темпераментна, чтобы захватывать экрананимация к видео.«Win G» для активации Game Bar ничего не делает.

Спасибо Реми и Спектре за ценные советы.

0 голосов
/ 19 октября 2018

хорошо из видео, которое вы разместили, его чистая анимация с использованием таймера - это путь, по которому ...

Из вашего описания У вас должно быть какое-то значение ix для каждого видимого объекта на вашем корабле.Указание слоя или порядка рендеринга объекта.

Итак, добавьте значение render_ix в свой код рендеринга (либо глобальный, либо член формы, в которой вы рендеринг), затем перекодируйте вашу процедуру рисования в это:

int render_ix=0; // order/layer number for object to render up to

void draw()
 {
 // here clear&render background
 for (int i=0;i<objects;i++)
  if (object[i].ix<=render_ix)
   object[i].draw(); // render i-th object
 // here render HUD
 }

теперь просто где-то в вашем таймере с желаемым интервалом

void OnTimerAnimation()
 {
 render_ix++;
 if (render_ix>=objects) render_ix=0;
 // here force repaint either by calling Paint, Refresh,Update ... or what ever way you are using
 }

Вы также можете изменить render_ix с помощью полосы прокрутки или программно.Как вы можете видеть, Sleep или Delay не требуется, следовательно, не нужно блокировать выполнение.

Если ваш рендеринг не основан на порядке объекта, а скорее при некоторой фильтрации, чем просто изменить render_ix с помощью переменнойвы фильтруетеТаким образом, вы можете вкладывать больше переменных (Volume, mass, position ...) во вложенные операторы if.

Другая, но очень полезная схема - использовать выборки.Поэтому создайте список индексов объектов для визуализации ... и визуализируйте / выделите только те, которые присутствуют в списке.Это очень полезно для выбора мышью и работы с несколькими контейнерами одновременно.

...