Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

без команд видеопроцессору (api directx или opengl) это будет очень медленно

Отправлено ++ 23 января 2007 г. 14:33
В ответ на: Подскажите, пожалуйста, как отобразить в С++ Builder 6.0 график в реальном времени отправлено <font color=gray>strelin_83</font> 23 января 2007 г. 11:36

Но если поставить
GdiSetBatchLimit(побольше); /* буферизация отрисовки экрана */
немного моргало, но работало...


//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "servo167.h"

#include

#define MAX_POINT 8192

extern HANDLE hViewThread;
extern HANDLE tViewThread;

extern TColor desired_speed_color;
extern TColor speed_color;
extern TColor Im_color;
extern TColor Um_color;
extern TColor PWM_color;
extern int npoint;
extern float k_desired_speed; // коэффициэнт пересчета требуемой скорости
extern float k_speed; // коэффициэнт пересчета реальной скорости
extern float k_voltage; // коэффициэнт пересчета реального напряжения на двигателе
extern float k_current; // коэффициэнт пересчета реального тока на двигателе
extern float k_pwm; // коэффициэнт пересчета ШИМ двигателе

extern float xscale, xstep, Fs_yscale, F_yscale, U_yscale, I_yscale, PWM_yscale;
extern int xs, ys;
extern FILE *logfile;
extern FILE *tmp_file;
extern int pronouncement_walkthrough(char *str, int cmd);
extern int change_cursor();
//---------------------------------------------------------------------------
/* нарисовать на экране осциллографа сетку */
int draw_grid()
{int x,y;
float k;
char str[256];

Form1->Image1->Canvas->Lock();
k= fabs((float)xscale * 1000.0/(((float)xs) * xstep));
xs= Form1->Image1->Width / 10;
ys= Form1->Image1->Height / 8;
Form1->Image1->Canvas->Pen->Width=1;
Form1->Image1->Canvas->Pen->Color = clGreen;
for(y=ys ; y <= Form1->Image1->Height; y+=ys )
{Form1->Image1->Canvas->MoveTo(0,y);Form1->Image1->Canvas->LineTo(Form1->Image1->Width, y);}
for(x=xs ; x <= Form1->Image1->Width; x+=xs )
{Form1->Image1->Canvas->MoveTo(x,0);Form1->Image1->Canvas->LineTo(x,Form1->Image1->Height);}
Form1->Image1->Canvas->MoveTo(0,0); Form1->Image1->Canvas->LineTo(Form1->Image1->Width, 0);
Form1->Image1->Canvas->MoveTo(0,0); Form1->Image1->Canvas->LineTo(0, Form1->Image1->Height);
if(logfile!=NULL)
{Form1->Image1->Canvas->Font->Color = clGreen;
Form1->Image1->Canvas->Font->Size = 12;
Form1->Image1->Canvas->Font->Style = TFontStyles()<< fsBold << fsUnderline;
Form1->Image1->Canvas->TextOut(10, 10, "Запоминание");
}
if(Form1->CheckBox2->Checked)
{Form1->Image1->Canvas->Font->Color = clGreen;
Form1->Image1->Canvas->Font->Size = 12;
Form1->Image1->Canvas->Font->Style = TFontStyles()<< fsBold << fsUnderline;
Form1->Image1->Canvas->TextOut(10, 10, "Работа с памятью");
}
if(tmp_file!=NULL)
{k= ((float)Form1->ScrollBar1->Position) / k;
k/=((float)Form1->Image1->Width);
itoa( int(k), str, 10);
Form1->Image1->Canvas->TextOut(Form1->Image1->Width - 150, Form1->Image1->Height -50, "Экран: [" + AnsiString(str) + "]");
}
Form1->Image1->Canvas->Unlock();
return 1;
}
//---------------------------------------------------------------------------
/* отрисовка развертки на экране осциллографа */
int DrawScanning(float ydesired_speed, float yspeed, float yUm, float yIm, float yPWM, int cmd)
{static float aDesiredSpeed[MAX_POINT];
static float aSpeed[MAX_POINT];
static float aIm [MAX_POINT];
static float aUm [MAX_POINT];
static float aPWM[MAX_POINT];

static TPoint DesiredSpeed[MAX_POINT];
static TPoint Speed[MAX_POINT];
static TPoint Im [MAX_POINT];
static TPoint Um [MAX_POINT];
static TPoint PWM[MAX_POINT];
static int i,x;
// char str[32];
float k;
static float _ox=0, ox;
k= fabs((float)xscale /(((float)xs) * xstep));

switch(cmd)
{case 1:for(x=1; x < 2048; x++)
{aDesiredSpeed[x-1]= aSpeed[x-1]= aIm[x-1]= aUm[x-1]= aPWM[x-1]= 0.0;
DesiredSpeed[x-1].x= Speed[x-1].x= Im[x-1].x= Um[x-1].x= PWM[x-1].x= x;
}
npoint=0;
break;
case 4:_ox+=1;
for(ox=_ox - k;ox >= 0; ox-=k)
{if( npoint <= Form1->Image1->Width)
{aDesiredSpeed[npoint]=ydesired_speed;
aSpeed[npoint]= yspeed;
aIm[npoint]= yIm;
aUm[npoint]= yUm;
aPWM[npoint]= yPWM;
npoint++;
_ox=ox;
}
}
break;
case 0:_ox+=1;
for(ox=_ox - k; ox >= 0; ox-=k)
{//int tmp[MAX_POINT];
// memcpy( (char *)tmp, (char *)aDesiredSpeed + sizeof(int), sizeof(int)* Form1->Image1->Width);
// memcpy( (char *)aDesiredSpeed, (char *)tmp, sizeof(int)* Form1->Image1->Width);
// memcpy( (char *)tmp, (char *)aSpeed + sizeof(int), sizeof(int)* Form1->Image1->Width);
// memcpy( (char *)aSpeed, (char *)tmp, sizeof(int)* Form1->Image1->Width);
// memcpy( (char *)tmp, (char *)aIm + sizeof(int), sizeof(int)* Form1->Image1->Width);
// memcpy( (char *)aIm, (char *)tmp, sizeof(int)* Form1->Image1->Width);
// memcpy( (char *)tmp, (char *)aUm + sizeof(int), sizeof(int)* Form1->Image1->Width);
// memcpy( (char *)aUm, (char *)tmp, sizeof(int)* Form1->Image1->Width);
// memcpy( (char *)tmp, (char *)aPWM + sizeof(int), sizeof(int)* Form1->Image1->Width);
// memcpy( (char *)aPWM, (char *)tmp, sizeof(int)* Form1->Image1->Width);
for(x=0; x < Form1->Image1->Width; x++)
{aDesiredSpeed[x]= aDesiredSpeed[x+1];
aSpeed[x]= aSpeed[x+1];
aIm[x]= aIm[x+1];
aUm[x]= aUm[x+1];
aPWM[x]= aPWM[x+1];
}
aDesiredSpeed[Form1->Image1->Width]= ydesired_speed;
aSpeed[Form1->Image1->Width]= yspeed;
aIm[Form1->Image1->Width]= yIm;
aUm[Form1->Image1->Width]= yUm;
aPWM[Form1->Image1->Width]= yPWM;
npoint++;
_ox=ox;
}
break;
}
if( npoint > Form1->Image1->Width)
npoint= Form1->Image1->Width +1;
if(cmd==4) return npoint;
if((Form1->CheckBox2->Checked) && (tmp_file==NULL))
{Form1->Image1->Refresh();
return npoint;
}
if(cmd != 6 && cmd != 4) return npoint;

Form1->Image1->Canvas->Lock();
Form1->Image1->Canvas->Brush->Color = clWhite;
Form1->Image1->Canvas->Brush->Style = bsSolid;
Form1->Image1->Canvas->FillRect(Rect(0,0,Form1->Image1->Width,Form1->Image1->Height));
draw_grid();
if(Form1->CSpinEdit3->Value > 20) Form1->CSpinEdit3->Value=1;
Form1->Image1->Canvas->Pen->Width= Form1->CSpinEdit3->Value;
if(Form1->CheckBox3->Checked)
{Form1->Image1->Canvas->Pen->Color = desired_speed_color;
for(i=0; i<= Form1->Image1->Width; i++)
DesiredSpeed[i].y= Form1->Image1->Height/2 -(int)(aDesiredSpeed[i] * Fs_yscale * (float)ys);
Form1->Image1->Canvas->Polyline(DesiredSpeed,Form1->Image1->Width);
}
if(Form1->CheckBox4->Checked)
{Form1->Image1->Canvas->Pen->Color = speed_color;
for(i=0;i<= Form1->Image1->Width; i++)
Speed[i].y= Form1->Image1->Height/2 -(int)(aSpeed[i] * F_yscale * (float)ys);
Form1->Image1->Canvas->Polyline(Speed,Form1->Image1->Width);
}
if(Form1->CheckBox5->Checked)
{Form1->Image1->Canvas->Pen->Color = Im_color;
for(i=0;i<= Form1->Image1->Width; i++)
Im[i].y= Form1->Image1->Height/2 -(int)(aIm[i] * I_yscale * (float)ys);
Form1->Image1->Canvas->Polyline(Im,Form1->Image1->Width);
}
if(Form1->CheckBox6->Checked)
{Form1->Image1->Canvas->Pen->Color = Um_color;
for(i=0;i<= Form1->Image1->Width; i++)
Um[i].y= Form1->Image1->Height/2 -(int)(aUm[i] * U_yscale * (float)ys);
Form1->Image1->Canvas->Polyline(Um,Form1->Image1->Width);
}
if(Form1->CheckBox7->Checked)
{Form1->Image1->Canvas->Pen->Color = PWM_color;
for(i=0;i<= Form1->Image1->Width; i++)
PWM[i].y= Form1->Image1->Height/2 -(int)(aPWM[i] * PWM_yscale * (float)ys);
Form1->Image1->Canvas->Polyline(PWM,Form1->Image1->Width);
}
Form1->Image1->Canvas->Unlock();

draw_grid();
// Form1->Image1->Repaint();
// Form1->Image1->Update();
return npoint;
}
//---------------------------------------------------------------------------
DWORD WINAPI show_scanning (LPVOID lpvoid)
{char buf[256];
// DrawScanning(0, 0, 0, 0, 0, 1);
if(tmp_file==NULL) return 0;
while(npoint <= Form1->Image1->Width)
{if((fgets(buf, 256 - 2, tmp_file)) == NULL) break;
pronouncement_walkthrough(buf, 4);
}
DrawScanning(0, 0, 0, 0, 0, 6);
change_cursor();
hViewThread=NULL;
ExitThread(1);
return 1;
}

DWORD WINAPI show1_scanning (LPVOID lpvoid)
{ DrawScanning(0, 0, 0, 0, 0, 6);
Form1->Update();
tViewThread=NULL;
ExitThread(1);
return 1;
}



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

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

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru