Я использую Embarcadero C ++ Builder (инженер, а не программист)
Я считаю, что функция сна работает у меня только в режиме отладки, а не в режиме выпуска. Я вижу ссылки в StackOverFlow не на использование Sleep, а на использование TTimer.
Я просто хочу, чтобы мое приложение приостанавливалось на несколько секунд между рисованием объектов согласно Sleep (500); в приведенном ниже коде, чтобы я мог видеть каждый рисуемый объект и проверять их правильность, иначе проверка будет слишком быстрой.
DrawSelectedShape (k, сторона, 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
Вот как выглядит мой рендеринг:
Любой совет, очень ценимый.
Sleep()
- это функция Win32 API, она работает в точности одинаково в режимах отладки и выпуска. Просто очень сложно отладить операции рисования таким образом с самого начала. Как только вы переключаетесь между пользовательским интерфейсом и другим окном, таким как отладчик или редактор кода, пользовательский интерфейс получает сигнал перерисовать себя, стирая предыдущие рисунки. Кроме того, очень плохо вводить задержки во время обработки отрисовки, поскольку ОС, вероятно, будет жаловаться на то, что отрисовка занимает слишком много времени и замедляет последующую обработку сообщений пользовательского интерфейса. - person Remy Lebeau   schedule 15.10.2018DrawSelectedShape()
, чтобы дать ему входной параметрTCanvas
, и позволить ему рисовать на этом холсте по мере необходимости. Затем вы можете создатьTBitmap
для каждой фигуры, которую хотите нарисовать, и передатьTBitmap.Canvas
DrawSelectedShape()
. Затем вы можете просматриватьTBitmap
s по мере необходимости, например, сохраняя их в.bmp
файлах или отображая их вTImage
элементах управления и т. Д. - person Remy Lebeau   schedule 15.10.2018Sleep()
неправильно,TTimer
имеет больше смысла. Было бы лучше, если бы таймер нарисовал все на одномTBitmap
, а затем вы могли бы нарисовать текущийTBitmap
на выбранной вами целиCanvas
всякий раз, когда ее нужно раскрасить. Пока не закончите, тяните по одному танку за каждое событие таймера. Например, в случаеTForm
вы можете настроить таймер на обновлениеTBitmap
по мере необходимости, а затемInvalidate()
Форму для запуска перерисовки, а затем нарисовать текущийTBitmap
наCanvas
Формы в событииOnPaint
Формы. - person Remy Lebeau   schedule 15.10.2018