2014-04-08 2 views
0

나는 Firemonkey 및 XE3 환경의 초보자입니다.TeeChart 업데이트하는 방법

내 프로그램은 일부 계산을 수행하며 TeeChart 구성 요소를 사용하여 사용자에게 피드백을 제공해야합니다.

OnClick() 
begin 

    while(boolContinue) do 
    begin 
    NextStep(boolContinue); 

    DoSomeCalculations(); 

    UpdateTeeChart(); 
    end; 
end; 

저는 Delphi7에서 Application.ProcessMessage를 사용했습니다. FireMonkey 응용 프로그램에서는 단일 ProcessMessage 호출을 만들기 위해 거의 1 초가 걸리는 것으로 보입니다.

TChart (TLineSeries/TeeChart Lite v 2012.06.120613)를 업데이트하는 적절한 방법은 무엇입니까? HandleMessage (작동하지만 느린) - - 을 처리 페인트 메시지 만 (작동하지만 느린) - 무효화 (나던 작업) - 다시 칠 (나던 작업)

나는 또한에 tryied :

나는 tryied 성공하지 못한 쓰레드를 사용하라.

편집 :

추가하는 간단한 테스트 프로그램 :

unit Unit1; 

interface 

uses 
    System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes, 
    System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, 
    FMXTee.Engine, FMXTee.Procs, FMXTee.Chart, FMXTee.Series; 

type 
    TForm1 = class(TForm) 
    Chart1: TChart; 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.fmx} 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    line : TLineSeries; 
    ii, x1, x2 : integer; 

begin 

    line := TLineSeries.Create(chart1); 
    line.ParentChart := chart1; 

    for ii := 1 to 100 do 
    begin 
    line.AddXY(ii, random(20)); 

    // Do some calculations... 
    self.Caption := IntToStr(ii); 
    for x1 := 1 to 10000 do 
     for x2 := 1 to 1000 do 
     begin 
     end; 
    end; 
end; 

end. 
+0

'ProcessMessages'는 결코 옳은 일이 아니 었습니다. 아마도 당신은 SSCCE를 줄 수있어서 좋은 조언을 줄 수 있습니다. –

+0

'Chart1.Draw();'시도해 봤어? – Yeray

+0

chart1.Draw()가 도움이되지 않습니다. – user3509858

답변

0

솔루션을 발견!

제목도 여기서 논의되고 해결책이 발견되었다 :

https://forums.embarcadero.com/message.jspa?messageID=427282

이제 차트 다시 그리기하고 실행하는 데에만 1 ~ 2 초 정도 걸립니다.

unit Unit1; 

interface 

uses 
    System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes, 
    System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, 
    FMXTee.Engine, FMXTee.Procs, FMXTee.Chart, FMXTee.Series, Windows; 


type MyThread = class(TThread) 
    protected 
    procedure Execute; override; 
    public 
    line : TLineSeries; 

    constructor Create; overload; 
    destructor Destroy; override; 
end; 


type 
    TForm1 = class(TForm) 
    Chart1: TChart; 
    Button1: TButton; 
    Label2: TLabel; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.fmx} 




constructor MyThread.Create; 
begin 
    inherited Create(true); 
    FreeOnTerminate := true; 
end; 

destructor MyThread.Destroy; 
begin 
    inherited; 
end; 


procedure MyThread.Execute; 
var 
ii, x1, x2 : integer; 
begin 
    for ii := 1 to 100 do 
    begin 
    line.AddXY(ii, random(20)); 

    // Do some calculations... 
    for x1 := 1 to 10000 do 
     for x2 := 1 to 1000 do 
     begin 
     end; 
    end; 
end; 




procedure TForm1.Button1Click(Sender: TObject); 
var 
    MT : MyThread; 
    line : TLineSeries; 
begin 
    chart1.BottomAxis.Minimum := 0; 
    chart1.BottomAxis.Maximum := 100; 
    chart1.BottomAxis.AutomaticMinimum := false; 
    chart1.BottomAxis.AutomaticMaximum := false; 

    chart1.Legend.Visible := false; 

    line := TLineSeries.Create(chart1); 
    line.ParentChart := chart1; 

    MT := MyThread.Create; 
    MT.line := line; 
    MT.Start; 
end; 


end.