C ++ Builder — Sleep работает только в режиме отладки, а не в режиме выпуска (Embarcadero C ++ Builder)

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

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

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

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

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;
}
}
}  }

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

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

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

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

анимация

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

0

Решение

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

Из вашего описания вы должны иметь какое-то значение 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 с переменной, которую вы фильтруете. Таким образом, вы можете вкладывать больше переменных (объем, масса, положение …) во вложенные if заявления.

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

0

Другие решения

Чтобы избежать циклов 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

По вопросам рекламы [email protected]