Delphi XE5 für Android
-
- 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
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/
-
- 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
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:
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
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
- 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
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
-
- 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
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
- 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
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
-
- 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
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;
-Michael