![]() |
Auf Beendigung einer Methode warten
Hallo,
folgendes Problem: Ich habe eine Klasse vom typ TCustomPanel abgeleitet um hierauf zu zeichen. Nun habe ich das Problem, dass die Objekte nicht gleichzeitig zeichnen dürfen. Habe das auch schon abgefangen. Das Problem ist, dass das Zeichnen der Panels einfach verworfen wird. Meine Idee wäre es, wenn ich den anderen Objekten eine Nachricht schicke, wenn das Zeichnen beim ersten Objekt beendet ist. Oder gibt es eine Möglichkeit, das Zeichnen der anderen Objekte irgendwie in eine Warteschlange zu stellen? Momentan sieht mein Quelltext so aus:
Code:
...
CriticalSection.enter; if not Semaphor then Semaphor := true; fonPainting := true; CriticalSection.Leave; if fonPainting then Zeichnen; Semaphor := false; fOnPainting := false; End; |
Re: Auf Beendigung einer Methode warten
Threads :?: :!:
|
Re: Auf Beendigung einer Methode warten
Zitat:
|
Re: Auf Beendigung einer Methode warten
An Threads hab ich auch schon gedacht, aber die Objekte selbst arbeiten schon parallel...
|
Re: Auf Beendigung einer Methode warten
Okay, wieder was dazu gelernt. (Hatte in Kunst 'ne 5 ;))
|
Re: Auf Beendigung einer Methode warten
Zitat:
Zitat:
Zitat:
Jedes Wincontrol hat einen in der Regel rechteckigen Bildschirmbereich in dem es sich zu zeichnen hat. Wird dieser Bereich von einem anderen Wincontrol zum Teil oder ganz überdeckt, so kann das Wincontrol in diesem Teil nicht zeichnen. Zitat:
Code:
Ich würde die Zeichenobjekte von TGraphicControl ableiten.
...
if not Semaphor then begin Semaphor := true; fonPainting := true; end ... Schau dazu einfach mal die Quellen von TShape und TBevel an. |
Re: Auf Beendigung einer Methode warten
Ich habe bis zu 3 Zeichenflächen nebeneinander, auf denen unterschiedliche Darstellungen wiedergegeben werden. Sie dürfen nicht zur gleichen Zeit zeichnen, da sie alle auf die selbe Datei zugreifen. Und hier kommt es zum Fehler, wenn ich
Delphi-Quellcode:
aufrufe, ist die Datei in Benutzung. Wenn ich ein Sleep(500) dazwischensetze, ist alles ok.
Zeichenflaeche1.paint;
Zeichenflaeche2.paint; Zeichenflaeche3.paint; Soweit ich weiß arbeiten Objekte doch zeitlich (quasi)parallel. Warum sollten Sie dann nicht zeitgleich zeichnen oder zumindest die Berechnungen fürs zeichnen zeitgleich durchführen? |
Re: Auf Beendigung einer Methode warten
Objekte arbeiten nicht parallel. Threads arbeiten parallel.
|
Re: Auf Beendigung einer Methode warten
Dazu mal ein Zitat aus meinen Studienunterlagen zum Thema oop:
Zitat:
|
Re: Auf Beendigung einer Methode warten
Ich habe sowas zwar nie studiert, aber rein aus praktischer Sicht und ohne Kontext ist das erstmal falsch.
In einem Modell kann man das vielleicht so betrachten, aber... Wenn du nur einen Thread (MainThread) hast, dann wird definitiv nur eine Methode abgearbeitet und dann die nächste. Die Messages werden gepuffert und nacheinander (entspr. ihrer Prioritäten) abgearbeitet. |
Re: Auf Beendigung einer Methode warten
Sirius beschreibt das richtig,
Wenn innerhalb eines Programms Arbeiten zu erledigen(Objecte/Methoden) sind dann kann dies technisch nur nacheinander funktionieren. Es kann genausowenig wie ein Thread aufgeteilt werden. Aufteilen geht nur mit mehreren Threads wenn mehrere Prozessoren(oder Kerne) vorhanden sind und dies auch vom Betriebssystem unterstützt wird. Dürfte bei allen modernen Systemen aber der Fall sein denn das aufteilen der Threads managed das BS und nicht die Hardware. Ein einzelner Thread oder Programm kann niemals aufgeteilt und teile davon parallel bearbeitet werden. Das Problem was du mit deiner Datei hast liegt im Windows begraben. Da eine geschlossene datei nicht sofort vom Filesystem freigegeben wird, deine Anwendung hat ja erstmal den Fukos und somit priorität. Alle Funktionen im System werden eben nacheinander abgearbeitet. Das heist zuerst kommen deine 3 Paintaktionen und dann das Dateischließen sobald dein Programm auf die nächste Message vom Windows wartet. Es sei denn du würdest die Datei selber schließen, was aber blödsinn wäre. Wenn du ein Sleep einbaust dann wird dem Betriebssystem Zeit gegeben in der Programmpause was anderes zu machen und damit wird eine andere Aufgabe dazwischengeschoben - zum beispiel das schließen der Datei was noch vom Filemanager ansteht. Zum problem: warum lädst du dein Bild nicht in einen Container und zeichnest von dort aus (TBitmap) Gruß Matthias |
Re: Auf Beendigung einer Methode warten
Ok, wieder was gelernt. Ich hab auch mal genauer nachgelesen:
Zitat:
|
Re: Auf Beendigung einer Methode warten
BTW: Die CriticalSection kannst du auch getrost rauslassen, denn die helfen dir hier nicht.
Ein Prozess kann eine CriticalSection so oft betreten wie er möchte (nur andere Prozesse können nicht gleichzeitig). Einen anderen Prozess bekomme ich aber nur mit Threads, und die sind für VCL doof, also sind die CS überflüssig. cu Oliver |
Re: Auf Beendigung einer Methode warten
Zitat:
|
Re: Auf Beendigung einer Methode warten
Ok, die CS hab ich schon rausgenommen. Und werde nun auch die Datei puffern.
Auf jeden Fall danke für die neuen Erkenntnisse... ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 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