Announcement

Collapse
No announcement yet.

Hilfe ich verzweifle an Threads

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hilfe ich verzweifle an Threads

    Also hier der Source Code, sobald ich den Thread createn will bekomme ich ne Fehlermneldung :

    Zugriffsverletzung bei Adresse 00453C20 in Modul 'Projekt1.exe'. Lesen von Adresse 00000000

    hier der Code

    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ubogiethread;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private-Deklarationen }
    
      public
        { Public-Deklarationen }
    
      end;
    
    var
      Form1: TForm1;
    bogie:bogiethread;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    var d:string;
    
    begin
    d:=   edit1.text+'.'+edit2.Text+'.'+edit3.text       ;
    bogie.create;
    
    end;
    
    end.
    und die thread unit

    Code:
    UNIT UBogiethread;
    
    interface
    
    //--------------------  ggf Uses-Liste anpassen !  --------------------
    uses
     Windows, Messages, SysUtils,  ping,classes;  // für windows.beep
    
    type
       Bogiethread = CLASS(TThread)
    
         // weitere Attribute
         private
           b: string;
           start: integer;
           ende: integer;
           i:integer;
         // weitere Methoden
         protected
            procedure execute; override;
            procedure update;
         public
    
            constructor create; virtual;
    
       end;
    
    implementation
    uses unit1;
    
    //+---------------------------------------------------------------------
    //|         TPiepsThread: Methodendefinition
    //+---------------------------------------------------------------------
    
    //-------- execute (protected) -----------------------------------------
    
    procedure bogiethread.update;
    var f:string;
    begin
     f:=  b+'.'+inttostr(i+start);
     ping.Execute( f);
     form1.Memo1.Lines.Add(f + ' antwortet');
    end;
    
    procedure Bogiethread.execute;
    begin
      while not terminated do
      begin
       synchronize(update)
      end;
    end;
    
      //-------- create (public) ---------------------------------------------
    constructor Bogiethread.create;
    begin
      inherited create(false); // CreateSuspended = true
      freeOnTerminate := true;
    end;
    
    end.
    hoffe jemand kann mir helfen und sagen wo der fehler liegt

  • #2
    Hallo,

    In der Routine
    procedure TForm1.Button1Click(Sender: TObject);
    var d:string;

    begin
    d:= edit1.text+'.'+edit2.Text+'.'+edit3.text ;
    bogie.create;

    end;

    muss es heissen:

    boggie := Bogiethread.Create;

    Gruß Uwe

    Comment


    • #3
      ach ja stimmt hab ich völlig übersehen, danke :P

      Comment


      • #4
        so hab das Problem nun das die 2 treads nicht synchron arbeiten sondern nacheinander, warum?

        hier der neuere code:

        Code:
        UNIT UBogiethread;
        
        interface
        
        //--------------------  ggf Uses-Liste anpassen !  --------------------
        uses
         Windows, Messages, SysUtils,  ping,classes;  // für windows.beep
        
        type
           Bogiethread = CLASS(TThread)
        
             // weitere Attribute
             private
        
               adr1:string;
               adr2:string;
               adr3:String;
               adr4:string;
               nam:string;
               start: integer;
               ende: integer;
               range1:integer;
               i:integer;
             // weitere Methoden
             protected
                procedure execute; override;
                procedure update;
             public
                 procedure adresse(name:string;range:integer;adresse1:string;adresse2:string;adresse3:string;adresse4:string);
                constructor create; virtual;
        
           end;
        
        implementation
        uses unit1;
        
        //+---------------------------------------------------------------------
        //|         TPiepsThread: Methodendefinition
        //+---------------------------------------------------------------------
        
        //-------- execute (protected) -----------------------------------------
        
        
        procedure bogiethread.adresse(name:string;range:integer;adresse1:string;adresse2:string;adresse3:string;adresse4:string);
        begin
        nam:=name;
        range1:=range;
        adr1:=adresse1;
        adr2:=adresse2;
        adr3:=adresse3;
        adr4:=adresse4;
        
        end;
        
        procedure bogiethread.update;
        var f:string;
        var aa:integer;
        begin
          aa:=1;
          While  aa < range1 do
          begin
            f:=  adr1+ '.'+ adr2 + '.'+ adr3 +'.'+inttostr(strtoint(adr4)+aa);
         if ping.Execute(f)>=0 then
         form1.Memo1.Lines.Add(f + ' antwortet (von)' +nam)
         else form1.Memo1.Lines.Add(f + ' antwortet nicht ' + nam);
        
         aa:=aa+1;
           end;
        
          terminate;
        end;
        
        procedure Bogiethread.execute;
        begin
          while not terminated do
          begin
        
           synchronize(update) ;
           sleep(0)    ;
          end;
        end;
        
          //-------- create (public) ---------------------------------------------
        constructor Bogiethread.create;
        begin
          inherited create(true); // CreateSuspended = true
          freeOnTerminate := true;
        end;
        
        end.
        Code:
        unit Unit1;
        
        interface
        
        uses
          Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
          Dialogs, StdCtrls, ubogiethread;
        
        type
          TForm1 = class(TForm)
            Button1: TButton;
            Memo1: TMemo;
            Edit1: TEdit;
            Edit2: TEdit;
            Edit3: TEdit;
            procedure FormClose(Sender: TObject; var Action: TCloseAction);
            procedure Button1Click(Sender: TObject);
          private
            { Private-Deklarationen }
        
          public
            { Public-Deklarationen }
        
          end;
        
        var
          Form1: TForm1;
        bogie:bogiethread;
        bogie2:bogiethread;
        
        implementation
        
        {$R *.dfm}
        
        procedure TForm1.Button1Click(Sender: TObject);
        
        var i:integer;
        var a:string;
        var b:string;
        var c:string;
        begin
        i:=4;
        a:=edit1.text;
        b:=edit2.text;
        c:=edit3.text;
        bogie:=bogiethread.create;
        bogie.adresse('Thread 1',i,a,b,c,inttostr(1));
        
        bogie2:=bogiethread.create;
        bogie2.adresse('Thread 2',i,a,b,c,inttostr(1+i));
        bogie2.Resume;
         bogie.Resume;
        end;
        edit1 text ist 192
        edit2 text ist 168
        edit 3 text ist 1

        nun soller pingen, aber synchron und nicht nacheinander, tut er aber nicht T.T

        kann erst montag wieder online kommen würd mich über antworten freuen

        Comment

        Working...
        X