AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread synchronize

Ein Thema von max2621 · begonnen am 3. Mai 2008 · letzter Beitrag vom 3. Mai 2008
Antwort Antwort
max2621

Registriert seit: 26. Dez 2007
Ort: Molfsee
25 Beiträge
 
#1

Thread synchronize

  Alt 3. Mai 2008, 09:57
Hallo,

ich habe ein Problem mit dem Zugriff auf die Main Unit aus einem Thread. Soweit ich verstanden habe, kann ich auf visuelle Komponenten nur über synchronize zugreifen. Leider gelingt es mir aber nicht auf ein Label in der Main unit zuzugreifen.

Mein Versuchscode ( nur der Thread) lautet folgendermaßen:

Delphi-Quellcode:

unit meinthread;

interface

uses
  Classes, sysutils, windows;

type
  test = class(TThread)
  private
    { Private-Deklarationen }
    j: integer;
  protected
    procedure Execute; override;
    procedure getresult;
  public
    constructor create; virtual;
  end;
implementation

procedure test.GetResult;
begin
Form1.label1:='Test';
end;

procedure test.Execute;
begin
{ Thread-Code hier einfügen }
sleep(1000);
windows.beep(2000,50);
Synchronize(Getresult);

end;

constructor test.create;
begin
inherited create(true); // CreateSuspended = true
freeOnTerminate := true;
end;

end.

Die Procedure Test.Result findet den label1 auf Form1 nicht.

Was mache ich falsch?

Euer Max2621
  Mit Zitat antworten Zitat
max2621

Registriert seit: 26. Dez 2007
Ort: Molfsee
25 Beiträge
 
#2

Re: Thread synchronize

  Alt 3. Mai 2008, 10:00
Sorry der Quellcode ist nicht richtig dargestellt. Ich hoffe jetzt:

Delphi-Quellcode:
unit meinthread;

interface

uses
  Classes, sysutils, windows;

type
  test = class(TThread)
  private
    { Private-Deklarationen }
    j: integer;
  protected
    procedure Execute; override;
    procedure getresult;
  public
    constructor create; virtual;
  end;

implementation

procedure test.GetResult;
begin

end;

procedure test.Execute;
begin
  { Thread-Code hier einfügen }
  sleep(1000);
  windows.beep(2000,50);
  Synchronize(Getresult);

end;

 constructor test.create;
begin
  inherited create(true); // CreateSuspended = true
  freeOnTerminate := true;
end;

end.
  Mit Zitat antworten Zitat
bluesbear

Registriert seit: 14. Dez 2005
Ort: Hahnstätten
355 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Thread synchronize

  Alt 3. Mai 2008, 10:05
Form1 ist vom Typ TForm, da gibts das Label nicht. Du musst einen Typecast machen.
Klaus M. Hoffmann
  Mit Zitat antworten Zitat
max2621

Registriert seit: 26. Dez 2007
Ort: Molfsee
25 Beiträge
 
#4

Re: Thread synchronize

  Alt 3. Mai 2008, 10:16
Vielen Dank. Aber wie geht das.

In der procedure test,getrewsult habe ich zur Zeit folgendes stehen:

Delphi-Quellcode:
procedure test.GetResult;
begin
  form1.label1:='test';
end;
vielen Dank.
  Mit Zitat antworten Zitat
fnhofm

Registriert seit: 16. Mär 2006
Ort: Nürnberg
25 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Thread synchronize

  Alt 3. Mai 2008, 10:24
Morgen,

hast Du das Mainform in der uses vom Thread stehen?
Und dem Label weist Du einen Text über seine Eigenschaft Caption zu.
Form1.Label1.Caption := 'Test'; Gruß
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.353 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Thread synchronize

  Alt 3. Mai 2008, 10:54
Zitat von fnhofm:
hast Du das Mainform in der uses vom Thread stehen?
Er hat den Quelltext ja gepostet, da steht die Unit ja nicht drin.

Zitat von max2621:
Die Procedure Test.Result findet den label1 auf Form1 nicht.
Du solltest dir Fehlermeldungen besser anschauen. Dort steht nicht, dass er den Label nicht findet, sondern, dass Form1 nicht gefunden wird.
(Eben weil du die Unit, in der Form1 definiert ist, nicht unter uses in die Liste geschrieben hast, weshalb Delphi auch nicht in dieser Unit nach Form1 sucht.)

Du musst unterhalb von implementation nochmal hinschreiben uses Unit1; bzw. eben wie du deine Unit genannt hast.
Sebastian Jänicke
  Mit Zitat antworten Zitat
max2621

Registriert seit: 26. Dez 2007
Ort: Molfsee
25 Beiträge
 
#7

Re: Thread synchronize

  Alt 3. Mai 2008, 11:03
Zunächst einmal vielen Dank.
Wenn ich die Unit reinschreibe und kompiliere kommt folgende Fehlermeldung:

[DCC Fehler] uPiepsThread.pas(7): F2047 Zirkuläre Unit-Referenz auf 'uPiepsThread'

Meine Main Unit heißt upiepsthread.

Er findet auch label3 nicht.

Vielen Dank bisher
  Mit Zitat antworten Zitat
fnhofm

Registriert seit: 16. Mär 2006
Ort: Nürnberg
25 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Thread synchronize

  Alt 3. Mai 2008, 11:28
Binde die Unit des Hauptformulars unter implementation ein. Nach dem Schlüsselwort implementation. Wie jaenicke übrigens schon gesagt hat.
Gruß
  Mit Zitat antworten Zitat
max2621

Registriert seit: 26. Dez 2007
Ort: Molfsee
25 Beiträge
 
#9

Re: Thread synchronize

  Alt 3. Mai 2008, 11:43
Wieder nur halb gelesen, nach aufführen der unit unterhalb von implementation gehts!!

Vielen Dank für Eure Hilfe!!

Max2621
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 Uhr.
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