-
Forum: Programmieren allgemein
by Sir Rufo,
3. Sep 2014
Was soll man dazu sagen ausser: Wenn es so ist, dann ist es so.
Überleg mal, warum ...
(Kleiner Tip: Wenn überhaupt arbeitet ein zu vernachlässigbar kleiner Kreis an Personen hier im Forum bei der NSA/irgendeinem Geheimdienst oder als Hellseher - wir können also nicht auf deinen Rechner zugreifen oder deine Gedanken lesen. Wie sollen wir also jetzt etwas zu dem Quelltext sagen, der dieses...
-
Forum: Programmieren allgemein
by Sir Rufo,
3. Sep 2014
Ein Getter/Setter der lockt, sichert eben nicht das Kopieren der Referenz ;)
Ok, der Zugriff auf die Referenz ist gesichert, jupp, darum ja auch die Methode aus Beitrag #19 ;)
-
Forum: Programmieren allgemein
by Sir Rufo,
3. Sep 2014
@Medium
Die Eigenschaft BMP direkt auf das Feld zu leiten ist natürlich auch Quell des Übels. Da sollte ein Getter den Zugriff regeln.
Und warum willst du mit dem Thread auf genau diese Instanz malen?
Wieso bekommt der Thread dafür nicht eine temporäre Instanz, erstellt das Bitmap und wenn fertig, wird das einfach per Assign an die Bitmap-Instanz gegeben, die von aussen lesbar ist?
Das...
-
Forum: Programmieren allgemein
by Sir Rufo,
3. Sep 2014
Darum nimmt man dafür auch ein try .. finally, dann ist das gesichert
SomeCanvas.Lock;
try
// use SomeCanvas
finally
SomeCanvas.Unlock;
end;
Irgendwie scheint dir das aber (warum auch immer) zu missfallen ...
-
Forum: Programmieren allgemein
by Sir Rufo,
3. Sep 2014
Das kann der Delphi-Compiler gar nicht ... :shock:
Es wird komplett kompiliert und dann schrittweise durch den erzeugten Code gelaufen ;)
-
Forum: Programmieren allgemein
by Sir Rufo,
3. Sep 2014
Eigentlich schon, aber wohl nicht solche komischen Sachen, die du da machst. ;)
-
Forum: Programmieren allgemein
by Sir Rufo,
3. Sep 2014
Gibt auch keine Fehler, aber wozu willst du die Methode TPaintThread.zeichnen überhaupt von aussen aufrufen?
-
Forum: Programmieren allgemein
by Sir Rufo,
3. Sep 2014
Könntest du bitte mal den gesamten Quelltext (Thread und Form) - die wo du den Fehler hast - hier posten?
Und bitte genau den Quelltest und nicht irgendeinen - CopyPaste
-
Forum: Programmieren allgemein
by Sir Rufo,
3. Sep 2014
Kann ich so nicht nachvollziehen, läuft wie erwartet
EDIT Überwachung des Thread-Kontexts
unit PaintThread;
interface
uses
Classes;
-
Forum: Programmieren allgemein
by Sir Rufo,
3. Sep 2014
Es gibt ja nur einen Prozess und innerhalb dessen mehrere Threads.
Also wer ruft jetzt in welchem Thread-Kontext was auf?
procedure TPaintThread.Execute;
begin
While (Terminated = False) do
begin
try
Synchronize( Zeichnen );
-
Forum: Programmieren allgemein
by Sir Rufo,
3. Sep 2014
Also wir müssen uns hier auf eine korrekte Sprache einigen, denn sonst weiß keiner was wirklich gemeint ist. Beim Thema Multithreading ist das einfach unerlässlich.
Es kommt immer auf den Thread-Kontext an.
Wenn du also bei irgendetwas im Bereich Multithreading Probleme hast, dann ist es sehr wichtig, dass du dabei den Thread-Kontext mit angibst, und nicht welche Form da was aufruft.
...
-
Forum: Programmieren allgemein
by Sir Rufo,
1. Sep 2014
Beim Multithreading spricht man von Threadkontext und nicht "von der Hauptform ausgeführt". Entweder es wird im MainThreadContext ausgeführt (du kannst gefahrlos auf als Form-Komponenten zugreifen) oder eben nicht. Wenn du nicht im MainThreadContext bist, kannst du per Synchronize eine Methode im MainThreadContext ausführen lassen.
-
Forum: Programmieren allgemein
by Sir Rufo,
1. Sep 2014
Aber wie soll das passieren, er übergibt dem Thread die Referenz auf die Komponente, und dazu müsste man vorher per Synchronize das Bitmap daraus holen, dann verarbeiten und dann zurückschreiben. Und immer hoffen, dass die Komponente noch da ist.
So sollte Multithreading eben gerade nicht funktionieren. Der Backgroundthread bekommt alle Informationen zum Abarbeiten als Kopie übergeben,...
-
Forum: Programmieren allgemein
by Sir Rufo,
1. Sep 2014
Ähm, das eigentliche Zeichnen erledigt du jetzt im Kontext des Hauptthreads
Synchronize( Zeichnen );
Damit hast du rein gar nichts gewonnen ... ja, es funktioniert, aber wozu benötigst du dann einen Thread, wenn du es eh wieder im Hauptthread zeichnen lässt.
-
Forum: Programmieren allgemein
by Sir Rufo,
1. Sep 2014
Ah, war mir nicht aufgefallen, dass du nur Delphi 7 hast (du könntest das ja in dein Profil eintragen).
Das Prinzip der CriticalSections, Events und Synchronize bleibt aber gleich und kannst du fast 1:1 übernehmen. Wichtig ist einfach, dass alle Zugriffe von aussen entsprechend geschützt erfolgen.
Auch die Bitmap, die im Thread erzeugt wird, ist erst nach der Fertigstellung von aussen...
-
Forum: Programmieren allgemein
by Sir Rufo,
1. Sep 2014
Hier mal so ein BitmapThread
unit BitmapProducerThread;
interface
uses
System.Generics.Collections,
System.Classes,
System.SyncObjs,
-
Forum: Programmieren allgemein
by Sir Rufo,
1. Sep 2014
So wie du da in den Thread reingreifst, ist das wie Schalten ohne Kuppeln.
Manchmal funktioniert es, manchmal knirscht es und manchmal fliegt dir das Getriebe um die Ohren.
Generell solltest du hier wohl mit Queues arbeiten.
In die Eingangsqueue trägst du die Vorgaben ein (Größe, etc.) die der Thread benötigt um das Bild zu erstellen.
Der Thread holt sich aus der Queue diese Werte,...