2016-04-17 10 views
0

Ich versuche, einen Thread in Beispielprojekt zu erstellen, aber ich habe eine hier aufgeworfenen Ausnahme ist das Beispielprojekt CodeWarum diese Thread-Ausnahme auslösen?

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 

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

type 
    TURLDownload = class(TThread) 
    private 
    FURL: String; 
    Fnameofimg: string; 
    FPathImage: string; 
    FFileNameImage: string; 
    // Internal // 
    ImageName: string; 
    PathURL: string; 
    protected 
    procedure Execute; override; 
    public 
    constructor Create(const AUrl: String; Const AOutPathImages: string; 
     Anameofimg: String); reintroduce; 
    destructor Destroy; override; 
    property URL: string read FURL write FURL; 
    property PathImage: string read FPathImage; 
    property FileNameImage: string read FFileNameImage; 
    end; 

var 
    Form1: TForm1; 
    th: TURLDownload; 

implementation 

{$R *.dfm} 
{ TURLDownload } 

procedure TURLDownload.reached; 
begin 
showmessage('done'); 
end; 


    constructor TURLDownload.Create(const AUrl, AOutPathImages: string; 
     Anameofimg: String); 
    begin 
     inherited Create(False); 
     FreeOnTerminate := True; 
     FURL := AUrl; 
     Fnameofimg := Anameofimg; 
     FPathImage := AOutPathImages; 
    end; 

    destructor TURLDownload.Destroy; 
    begin 

     inherited; 
    end; 

    procedure TURLDownload.Execute; 
    begin 
     synchronize(reached); 
    end; 

    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
     th.Create('jgvjk', 'ngkj', 'jkgfjk'); 
    end; 

    end. 

wenn ich auf Button1 klicken Thema zu Beginn der Erstellung i mit dieser Ausnahmemeldung stecken

Erste Chance Ausnahme bei $ 004C0384. Ausnahmeklasse $ C0000005 mit Nachricht 'Zugriffsverletzung bei 0x004c0384: Leseadresse 0x0000003c'. Prozess Projekt1.exe (4060)

und dann, wenn ich seine Rückkehr mich Datei Innengewinde an diesem Code erstellen, um Systemklassen brechen klicken

FSuspended := not FExternalThread; 

, was ich falsch mache? Ich bin mit Delphi XE7

Antwort

3

Sie sollten Thread-Objekt mit
th := TURLDownload.Create('jgvjk', 'ngkj', 'jkgfjk');

Another Probleme schaffen:

In Thread Körper rufen Sie VCL Fenster showmessage('Reached'); ohne Synchronisation verwenden. Sie sollten nicht ohne eine Art von Synchronisation mit VCL-Mitarbeitern arbeiten - verwenden Sie Synchronisieren oder Warteschlange.

reintroduce nicht für nicht-virtuellen Konstruktor benötigt wird

inherited tut nichts in Execute

+0

sogar mit synchronize tun das gleiche – MartinLoanel

+0

danken Ihnen sehr viel – MartinLoanel