Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Synchronisierung von Subthreads (VCL) + Pointerzugriff (https://www.delphipraxis.net/67972-synchronisierung-von-subthreads-vcl-pointerzugriff.html)

markusj 23. Apr 2006 10:50

Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
 
Das bedeutet, dass ich wieder ein TCriticalSections als Globale Variable brauche?
Und wenn ich zwei Subthreads aufeinander Zugreifen lasse? Brauche ich dann auch ein globales Critical Section? Oder reicht es, wenn ich es bei einem Thread als public deklariere und dessen Unit per Uses einbinde?

mfG

Markus

HERMES 23. Apr 2006 11:56

Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
 
Es ist egal wie du es machst, aber die Threads müssen das selbe CriticalSection Objelt benutzen, damit eine Synchronisation stattfindet.

alzaimar 23. Apr 2006 12:14

Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
 
Du musst Dir überlegen, in wessen Kontext die Variable lebt.
Wenn z.B. Thread1 irgendetwas deklariert, verwendet oder kontrolliert, dann packst Du die Eigenschaft in Thread1:
Delphi-Quellcode:
Type
  TMyThread = Class (TThread)
  Private
    fMyCS : TCriticalSection;
  Public
    Property MyValue : TSomeType Read GetValue Write SetValue;
  End;
...
Oder du deklarierst Dir eine eigene Klasse, die den threadsicheren Zugriff implementiert. Das würde ich empfehlen, wenn die Eigentusverhältnisse nicht eindeutig geklärt sind. Alles eine Frage der Sichtweise: Die Implementierung ist in jedem Fall ähnlich. :stupid:

markusj 23. Apr 2006 15:12

Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
 
Vielen Dank,

ich denke, ich werd das Objekt in den Unter-Unter-Thread Packen, welcher bei den beiden anderen über uses eingebunden ist
--> Zugriff auf das public-Objekt var csMan : TCriticalSection sollte möglich sein ... wenn nicht, bitte warnen *g*

mfG

Markus

markusj 23. Apr 2006 16:51

Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
 
So, mir ist gerade noch eine ganz neue Idee gekommen ...
Ist es möglich, eine ganz normale Klasse einfach zu einenm Thread umzumodden?
Kann ich dann auf dessen Methoden zugreifen, und wenn ja, werden die dann im Hauptthread oder im Subthread ausgeführt?
BTW: Was passiert nach dem Execute? Ich meine, wenn der Code abgearbeitet ist, und kein FreeOnTerminate aktiviert ist? Ist der Thread dann Suspended? In welchem Zusand befindet er sich dann?

mfG

Markus

markusj 24. Apr 2006 13:57

Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
 
*push*

himitsu 24. Apr 2006 15:40

Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
 
Wenn du nur auf einen 1-, 2-, oder 4-Byte-Wert zugreifen willst, dann sollte es keine Probleme geben, wenn diese zur selben Zeit ausgelesen werden, nur beim ändern mußt du aufpassen, aber eventuell hilft da auch schon ein kurzer Umschalter in den SingelThreadModus.

Var B: ByteBool;

auslesen wie immer
z.B.
Delphi-Quellcode:
If B Then ...
Und das Setzen
Delphi-Quellcode:
//B := True;
ASM
  LOCK MOV &B, $FF
End;

//B := False;
ASM
  LOCK MOV &B, 0
End;

markusj 24. Apr 2006 16:01

Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
 
Könntest du mir kurz erklären, was dieser Code macht/bedeutet? Ich kann leider (noch) kein ASM ...
Ach ja, die anderen Fragen in den Posts 14 und 15 "dürfen" auch beantwortet werden *g*

ansonsten, Danke!

mfG

Markus

himitsu 24. Apr 2006 17:14

Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
 
Im Grunde sind es jeweils 2 Befehle.

Dieses kopiert den Wert/Inhalt von x2 nach x1
Code:
MOV x1, x2
Hier also den Wert $FF in den Speicherbereich der Variable B.
Code:
MOV &B, $FF
Wobei das obere nur die Kurzfassung ist, ausfühlich würde es so aussehn, wobei B eigentlich ein Pointer (hier ist es ein BYTEPoinTeR) zu einem bestimmten Speicherbereich ist:
Code:
MOV BYTE PTR &B, $FF
MOV BYTE PTR [Pointer], $FF
Das LOCK ist ein Befehl, welcher die CPU für den nachfolgenden Befehl in einen Singlethreadmodus schaltet, es wird also sozusagen nur der nachfolgende Befehlausgeführt, während die anderen threads warten ... somit kann also kein anderer Thread wärend dieser Zeit Befehl ausführen, welcher zu dieser Zeit eventuell auch auf deisen Speicherbereich zugreifen könnte (es läuft ja schließlich Keiner)

also
Delphi-Quellcode:
LOCK  MOV  BYTE PTR &B, $FF
oder
Delphi-Quellcode:
LOCK  MOV  &B, $FF
setzt alle Bits (ist beim ByteBounter halt besser) auf 1 und somit auf TRUE, ohne daß zur selben Zeit ein anderer Thread auf B zugreifen kann.
Darum kann man auch ganz normal lesend auf B zugreifen, ohne das es Probleme gibt.

markusj 24. Apr 2006 17:40

Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
 
Danke!

EDIT:

Zitat:

Zitat von markusj
So, mir ist gerade noch eine ganz neue Idee gekommen ...
Ist es möglich, eine ganz normale Klasse einfach zu einenm Thread umzumodden?
Kann ich dann auf dessen Methoden zugreifen, und wenn ja, werden die dann im Hauptthread oder im Subthread ausgeführt?
BTW: Was passiert nach dem Execute? Ich meine, wenn der Code abgearbeitet ist, und kein FreeOnTerminate aktiviert ist? Ist der Thread dann Suspended? In welchem Zusand befindet er sich dann?

mfG

Markus

Wie siehts damit aus?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:29 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz