Delphi-PRAXiS
Seite 6 von 8   « Erste     456 78      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Threads und TBitmaps (https://www.delphipraxis.net/181416-threads-und-tbitmaps.html)

TheGroudonx 3. Sep 2014 14:38

AW: Threads und TBitmaps
 
Dann ist es entweder die Delphi Version, die den Unterschied macht, oder, was wahrscheinlicher ist, das Durchsteppen wurde nicht so durchgeführt, wie es muss, damit der fehler auftaucht.
Zum Nachvollziehen habe ich ein Video
gelinkt
Es zeigt das Kompilieren, welches am Haltepunkt (Thread-constructor) stoppt, und daraufhin mit F7 gedrückt weiterläuft.

PS: Deine Exception wird nicht angezeigt

Sir Rufo 3. Sep 2014 14:44

AW: Threads und TBitmaps
 
Zitat:

Zitat von TheGroudonx (Beitrag 1270900)
Dann ist es entweder die Delphi Version, die den Unterschied macht, oder, was wahrscheinlicher ist, das Durchsteppen wurde nicht so durchgeführt, wie es muss, damit der fehler auftaucht.
Zum Nachvollziehen habe ich ein Video
gelinkt
Es zeigt das Kompilieren, welches am Haltepunkt (Thread-constructor) stoppt, und daraufhin mit F7 gedrückt weiterläuft.

Könntest du bitte mal den gesamten Quelltext (Thread und Form) - die wo du den Fehler hast - hier posten?
Und bitte genau den Quelltest und nicht irgendeinen - CopyPaste

TheGroudonx 3. Sep 2014 14:55

AW: Threads und TBitmaps
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, UThread;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Paintthread : TPaintThread;
  i : Integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin      
Paintthread := TPaintThread.create(false);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
inc(i);
Paintthread.zeichnen;
end;

end.
Delphi-Quellcode:
unit UThread;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, ExtCtrls;
   
type                          
  Image = TImage;
  TPaintThread = class(TThread)



private

    Zeichenflaeche: TImage;

    Original, MyBild : TBitmap;

     i : integer;


  protected

    procedure Execute; override;

  public
                   
    procedure zeichnen;

    constructor Create(CreateSuspended: Boolean);

  end;





implementation





constructor TPaintThread.Create(CreateSuspended: Boolean);
begin
inherited;
end;



procedure TPaintThread.Execute;
begin

 While (Terminated = False) do
 begin

 Synchronize(Zeichnen);
 sleep(1);
 
 end;
end;



procedure TPaintThread.Zeichnen;
begin
inc(i);
end;
end.
Delphi-Quellcode:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  UThread in 'UThread.pas';

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

TheGroudonx 3. Sep 2014 14:56

AW: Threads und TBitmaps
 
Der Timer ist aus.

TheGroudonx 3. Sep 2014 15:05

AW: Threads und TBitmaps
 
Meine Versuche mit dem Timer zeigen, dass der Fehler auftaucht, wenn sich der thread mit sleep(1) aktualisiert, jedoch nicht aufzutreten scheint, wenn er sich mit sleep(1000000) aktualisiert, also nichts tut.
Das deutet darauf hin, dass die beiden threads indirekt miteinander kollidieren, auch wenn sie sich niemals Prozeduren oder deklarierte Variablen teilen.
Wie das möglich ist, oder wie sich das mit Synchronize deckt, da hab ich keine Ahnung :evil:

Sir Rufo 3. Sep 2014 15:10

AW: Threads und TBitmaps
 
Gibt auch keine Fehler, aber wozu willst du die Methode
Delphi-Quellcode:
TPaintThread.zeichnen
überhaupt von aussen aufrufen?

TheGroudonx 3. Sep 2014 15:11

AW: Threads und TBitmaps
 
Ich denke, ich kann das Problem (oder jedenfalls ein ähnliches) jetzt reproduzieren.

Man nehme einen Timer auf der Form 1 und gebe

Delphi-Quellcode:
Paintthread.zeichnen;
ein. Der Haltepunkt sollte darauf liegen.

Der Thread muss erstellt sein und seine Methode

Delphi-Quellcode:
 
While (Terminated = False) do
begin

end;
sein. Jetzt einfach starten und F7 drücken, fertig

TheGroudonx 3. Sep 2014 15:14

AW: Threads und TBitmaps
 
Sollte das bei dir keinen Fehler geben, liegt das Problem wohl am Delphi 7 Debugger.
Neben dem jetzigen Fehler habe ich eben einen bordbk70.dll access violation bekommen, der scheinbar mit Delphi 7 verbunden ist.#
Zudem mehrere schwere Fehler beim Debuggen, woraufhin Delphi geschlossen werden musste.
Das wäre eine Erklärung für das Desaster hier...Delphi 7 mag einfach noch keine Threads...

Sir Rufo 3. Sep 2014 15:17

AW: Threads und TBitmaps
 
Eigentlich schon, aber wohl nicht solche komischen Sachen, die du da machst. ;)

TheGroudonx 3. Sep 2014 15:25

AW: Threads und TBitmaps
 
Ich verwende schrittweises Kompilieren immer zur Fehlersuche.
Wenn dadurch in Verbindung mit Threads aber zusätzliche Fehler entstehen bzw. der Compiler aufhört weiterzuspringen dann ist Fehlersuche kaum möglich.
Werde wohl oder übel ohne die Funktion weitermachen müssen ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 Uhr.
Seite 6 von 8   « Erste     456 78      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz