Delphi XE5 für Android

Für Dinge zum Forum, Kritik, Verbesserungsvorschläge, Umfragen und ähnliches.
Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Delphi XE5 für Android

Beitrag von Christian »

Doch es muss, Threads auf die das Hauptprogramm keinen Zugriff mehr hat, sind total sinnfrei.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Delphi XE5 für Android

Beitrag von mschnell »

Threads können Zugriff auf Objekte haben, auf die der Mainthread auch Zugriff hat (es bietet sich z.B,. eine TThreadlist an, die man dem TThread-objekt übergibt, bevor man die die Variable mit der TThread-Referenz wiederverwendet und damit Referenz auf die TThread-instanz löscht, bzw gar keine anlegt). Dafür wird keine Referenz auf das TThread Objekt selbst (neben dem internen Self-Pointer) benötigt (also eine, die beim ARC zählt).

Ob das "sinnvoll" ist, muss der Programmierer der Applikation selbst entscheiden. Möglich und funktionsfähig ist das jedenfalls.

ungetestet, nur prinzipiell:

Code: Alles auswählen

Type
 
TMyEvent = Procedure of object;
 
TMyThread = class(TTHread)
  FList: TThreadList; 
  AMainThreadEvent: TNotifyEvent;
  Constructor Create(AList:TThreadList; AMainThreadEvent: TMyEvent);
  Procedure Execute; Override;
end;
 
Constructor TMyThread.Create(AList:TThreadList; AMainThreadEvent: TNotifyEvent);
begin
  inherited Create(False);
  FreeOnTerminate := True;
  FList := AList;
  FMainThreadEvent := FMainThreadEvent;
end;
 
Procedure  TMythread.Execute;
// der Thread macht irgendwas, trägt Ergebnisse in die Liste ein und beendet sich dann
begin
 ...
   FList.add(...);
   Queue(FMainthreadEvent); //Notify Mainthread;
 ...
end;
 
var
MyThreadlist: TTHreadlist;
 
Procedure Form1.MyEvent(Sender: TObject);
begin
  .... //Hole Ergebnisse aus der Liste
end;
 
Procedure Form1.xyz.....
...
  for i := 0 to 999999 do begin
    TMythread.create(MyThreadlist, MyEvent)//jeder Thread trägt seine Ergebnisse in TMyThreadList ein, der Mainthread analysiert sie.
  end;
...
end;
 
 



Wenn man statt "TThread.Queue()" "Application.QueuAsyncCall()" verwenden würde (z.B. um ein remote TNotifyEvent zu basteln), kann man dem Mainthread sogar eine Referenz auf das aufrufenden TThread Objekt mitteilen. Das zeigt ich dann eines der Probleme von ARC: Der Self-Pointer existiert immer, darf aber beim Referenz-Counting nicht mitgezählt werden. Ein Objekt kann also trotz zulässiger Programmierung ein "Zombie" sein.

- Michael

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Delphi XE5 für Android

Beitrag von m.fuchs »

Socke hat geschrieben:
m.fuchs hat geschrieben:Was ich mir auch noch vorstellen könnte wäre ein Objekt mit Methoden. Auf das Objekt selber gibt es keine Referenz, auf die Methoden schon.

Du glaubst jetzt nicht ernsthaft, dass hier keine Referenz auf das Objekt existiert?!
Wenn du keine Referenz auf ein Objekt hast, kannst du auch keine Methode aufrufen (das ist die Definition).

Doch, ich habe ja eine Referenz auf die Methode. Ich habe das aber gerade mal mit Referenz-gezählten COM-Objekten ausprobiert und tatsächlich reicht dieser Methodenzeiger aus um das Objekt nicht abzuräumen. Da hätte ich nicht mit gerechnet. Wieder etwas gelernt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Delphi XE5 für Android

Beitrag von Socke »

m.fuchs hat geschrieben:
Socke hat geschrieben:
m.fuchs hat geschrieben:Was ich mir auch noch vorstellen könnte wäre ein Objekt mit Methoden. Auf das Objekt selber gibt es keine Referenz, auf die Methoden schon.

Du glaubst jetzt nicht ernsthaft, dass hier keine Referenz auf das Objekt existiert?!
Wenn du keine Referenz auf ein Objekt hast, kannst du auch keine Methode aufrufen (das ist die Definition).

Doch, ich habe ja eine Referenz auf die Methode. Ich habe das aber gerade mal mit Referenz-gezählten COM-Objekten ausprobiert und tatsächlich reicht dieser Methodenzeiger aus um das Objekt nicht abzuräumen. Da hätte ich nicht mit gerechnet. Wieder etwas gelernt.

Dann vergleichen wir mal die verbale Definition einer Methode mit der technischen Defintion:
en.wikipedia.org/wiki/Method_(computer_programming) hat geschrieben:In object-oriented programming, a method is a subroutine (or procedure) associated with a class.

Code: Alles auswählen

type TMethod = record
  Code: Pointer;
  Data: Pointer;
end;

Daraus schließen wir: Ein Zeiger auf eine Methode enthält immer eine Referenz auf das dazugehörige Objekt. Ist keine Referenz auf ein Objekt vorhanden, handelt es sich nicht um eine Methode sondern um eine nicht-objektorientierte Funktion oder Prozedur. Der Parameter Self einer Methode wird also nicht intern vorgehalten. Vielmehr wird er von außen (vom Aufrufer) vorgegeben.

Eine gute automatisierte Umsetzung der Referenzzählung (ARC) muss daher auch solche Referenzen umfassen, die der Entwickler nicht auf den ersten Blick sieht oder überhaupt nicht selbst anlegt (implizite Referenzen). Der Entwickler wird auf der anderen Seite gezwungen, explizite Referenzen zu schaffen, wenn diese vom Compiler nicht erkannt werden (Beispiel: Typecast bei untypisierten Zeigern).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Delphi XE5 für Android

Beitrag von m.fuchs »

Ah ok. Eine procedure of object enthält ja nicht nur den Zeiger auf die Methode, sondern auch noch einen auf die konkrete Instanz. Und damit ist eine weitere Referenz vorhanden und das Objekt bleibt erhalten. Eigentlich ja auch logisch. Danke für die Stupser in die richtige Richtung.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Delphi XE5 für Android

Beitrag von mschnell »

Socke hat geschrieben:Ein Zeiger auf eine Methode enthält immer eine Referenz auf das dazugehörige Objekt.

deshalb ist die zugehörige Typ-Definition auch

Procedure .... of Object;

:D -Michael

Antworten