Autor Beitrag
yukon-troll
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 60



BeitragVerfasst: Mi 07.05.03 19:31 
Hallo,

ich habe hier folgendes Problem:
für eine Grafikausgabe unter Delphi6 pro habe ich folgenden Code benutzt:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
procedure IdleLoop(Sender: TObject; var Done: boolean);
begin
  Done := false;
  //...hier weiterer Code zur Berechnung und Grafikausgabe
  Application.ProcessMessages;   
end;

und beim Form.Create zugewiesen:
ausblenden Quelltext
1:
2:
3:
4:
procedure TForm.Create(Sender: TObject);
begin
  Application.OnIdle := IdleLoop;
end;

Funktioniert soweit auch.
Lasse ich das gleiche Programm aber unter Linux laufen (Kylix3 pro, SuSE 8.0),
so erhalte ich in der IDE im Debugger kurze Zeit nach dem Start folgende Fehlermeldung:

Debugger Signal Notification:
Project Test received signal SIGSEV(11) . ...

Beim Start als Standalone bricht das Programm nach dieser Zeit ohne Fehlermeldung ab.

Dabei ist mir noch folgendes aufgefallen:
je weniger das Programm in der Procedure IdleLoop zu berechnen hat (habe einige Zeilen auskommentiert) um so kürzer ist die Zeit bis zum Auftreten des Fehlers.
yukon-troll Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 60



BeitragVerfasst: Mi 07.05.03 19:48 
Oop's bei der Fehlermeldung ist mir ein Fehler unterlaufen, muss heissen

Project Test received signal SIGSEGV(11). ...
(laut Debugger ein Segmentation Fault).
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Mi 07.05.03 20:48 
Das Application.ProcessMessages; darfst du nicht aufrufen, da damit eine Rekursion des OnIdle Ereignisses in Gang gesetzt wird.

_________________
Ist Zeit wirklich Geld?
yukon-troll Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 60



BeitragVerfasst: Do 08.05.03 07:55 
Hallo AndyB,

wenn ich Application.ProcessMessages nicht aufrufe, dann wird bei mir nur dann etwas im Fenster neugezeichnet, wenn ich die Maus über dem Fenster bewege ansonsten passiert nichts !

Ich poste hier mal einen kompletten Quelltext für ein Minibeispiel:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
unit uMain;

interface

uses
  SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms,
  QDialogs, QStdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure IdleLoop(Sender: TObject; var Done: boolean);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.xfm}

procedure TForm1.IdleLoop(Sender: TObject; var Done: boolean);
begin
  Done := false;
  Canvas.MoveTo(random(Width), random(Height));
  Canvas.LineTo(random(Width), random(Height));
  Application.ProcessMessages;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnIdle := IdleLoop;
end;

end.


Wohlgemerkt das Problem tritt nur unter Kylix auf, gleicher Quelltext unter Delphi (Windows) funktioniert.

MfG yukon-troll