AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Parameterübergabe bei BeginThread für Klassenmethode
Thema durchsuchen
Ansicht
Themen-Optionen

Parameterübergabe bei BeginThread für Klassenmethode

Ein Thema von s.h.a.r.k · begonnen am 2. Jul 2010 · letzter Beitrag vom 5. Jul 2010
Antwort Antwort
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

AW: Parameterübergabe bei BeginThread für Klassenmethode

  Alt 2. Jul 2010, 15:51
Das ist ganz einfach.
Deine Methode TTest.ThreadedMethod sieht intern so aus:
procedure TTest.ThreadedMethod(Self: TTest; Instance: TTest); Es gibt also immer als ersten Parameter den unsichtbaren Self-Parameter. Anders ausgedrückt heißt es das deine Methode incompatibel zur erwarteten Funktion ist die eben nur einen Parameter vom Typ Pointer hat. Man sollte sich aber auch nicht darauf verlassen das es in alle Ewigkeit so aussieht das der erste unsichtbare Parameter Self ist. Denn wenn irgendwann mal in einer neuen Version oder bei einem anderen Compiler das ganze intern anders gehandhabt wird funktionieren dann solche hacks nicht mehr:
procedure TTest.ThreadedMethod(); (also das man eine Parameterlose Methode nimmt wohlwissen das der unsichtbare Parameter Self der einzige ist.
Gehe ich richtig in der Annahme, dass, mit aktuellem Compiler, es mit einer Methode ohne Parameter funktioniert?!
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.573 Beiträge
 
Delphi 12 Athens
 
#2

AW: Parameterübergabe bei BeginThread für Klassenmethode

  Alt 2. Jul 2010, 16:03
Das ist bei Delphi eigentlich schon immer so, also daß Klassen-Methoden diesen unsichtbaren Parameter haben.
Irgendwo muß je die Information herkommen, um welche Klasse/Instanz es sich handelt, wenn man eine Methode aufruft.

Der TMethod-Zeiger ist auch um diesen Parameter größer.
(Zeiger auf Methode + die Objektinstanz)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: Parameterübergabe bei BeginThread für Klassenmethode

  Alt 2. Jul 2010, 16:16
Nur habe ich diese Information immer nur aus dem DP-Forum. An offizieller Stelle habe ich das noch nie gesehen.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.573 Beiträge
 
Delphi 12 Athens
 
#4

AW: Parameterübergabe bei BeginThread für Klassenmethode

  Alt 2. Jul 2010, 18:37
Offiziell steh halt einiges nirgends.

z.B. sieht
function test: String; intern eigentlich so aus
procedure test(var Result: String); Bei einem Integer sieht es aber anders aus.


Ihr könnt ja gerne mal raten, welche Werte von den Messageboxen angezeigt werden ... mal sehn wer alles richtig tippt.
Delphi-Quellcode:
function Test: String;
begin
  Result := Result + 'abc ';
  raise Exception.Create('buhh');
end;

function Test2: String;
begin
  Result := Result + 'abc ';
end;

function Test3: Integer;
begin
  Result := 1;
  raise Exception.Create('buhh');
end;

function Test4: Integer;
begin
  Result := Result + 1;
end;

procedure TForm1.FormCreate(Sender: TObject);
var S: String;
  i: Integer;
begin
  try
    S := Test;
  except
    // heut ma nix
  end;
  ShowMessage(S);
  S := 'tja ';
  S := Test2;
  S := Test2;
  ShowMessage(S);

  try
    i := Test3;
  except
    // heut ma nix
  end;
  ShowMessage(IntToStr(i));
  i := 10;
  i := Test4;
  i := Test4;
  ShowMessage(IntToStr(i));
end;
PS: Das ist auch ein gutes Beispiel, warum meistens Variablenwerte immer initialisiert werden sollten.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Parameterübergabe bei BeginThread für Klassenmethode

  Alt 3. Jul 2010, 10:48
...Ihr könnt ja gerne mal raten, welche Werte von den Messageboxen angezeigt werden ...
Der Vollständigkeit halber wäre es schön wenn du uns verraten könntest was bei dir angezeigt wird. Denn wenn in 20 Jahren niemand mehr das gleiche Delphi hat wie jenes welches du derzeit benutzt, kann man nur raten ob es in deren Versionen das gleiche ergibt wie bei dir jetzt.

Wie sieht es eigentlich mit der Aufrufkonvention aus? Ist BeginThread eine Api-Funktion? Wenn ja wird doch sicher stdcall oder cdecl erwartet oder?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's

Geändert von SirThornberry ( 3. Jul 2010 um 10:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.573 Beiträge
 
Delphi 12 Athens
 
#6

AW: Parameterübergabe bei BeginThread für Klassenmethode

  Alt 3. Jul 2010, 11:57
Es hat sich seit Jahrzehten nichts mehr geändert ... da wird sich wohl so schnell auch nicht dran ändern

Warum haben wir kein [Spoiler]-Tag?
(sonst hätte ich es vorhin ja schon geschrieben)
Code:
1: "abc "

2: "tja abc abc "

3: zufallswert, da i nicht initialisiert und Result nicht zugewiesen

4: zufallswert + 1, da Result nicht initialisiert
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Parameterübergabe bei BeginThread für Klassenmethode

  Alt 3. Jul 2010, 12:33
[QUOTE=SirThornberry;1033246]
Ist BeginThread eine Api-Funktion?
Nein die API-Funktion ist MSDN-Library durchsuchenCreateThread. BeginThread ist der Delphi-Wrapper, um unter anderem durch setzen von IsMultiThreaded den Heap Thread sicher zumachen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#8

AW: Parameterübergabe bei BeginThread für Klassenmethode

  Alt 5. Jul 2010, 01:24
@ himitsu: darauf, dass bei 1. "abc " herauskommt, würde ich mich jedenfalls nicht verlassen. Result wird zwar über den Stack übergeben, aber ob wirklich immer ein push nil erfolgt? Genausogut könnte der generierte Code den Stackpointer direkt erhöhen, ohne einen definierten Wert dort abzulegen, dann löst u.U. schon Result := Result+... eine Exception aus. Turbo Pascal hat das bei Stringresults so gemacht, allerdings waren das short Strings, wo im Stack direkt die Maximallänge des Strings, bis zu 255 bytes + Längenbyte, reserviert wurde und nicht nur ein Pointer.
  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 14:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz