Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Synchronize für nonVCL (https://www.delphipraxis.net/121873-synchronize-fuer-nonvcl.html)

Mr_G 6. Okt 2008 11:35


Synchronize für nonVCL
 
Hallo zusammen,
ich wollte mal fragen wie man nonVCL eine procedure eines anderen Threads aufrufen kann (die VCL-Klasse bietet dafür ja Synchronize...).
Gruß

Mr_G

sirius 6. Okt 2008 12:05

Re: Synchronize für nonVCL
 
Aufrufen kannst du sie immer. Es ist nur die Frage, ob du auf Daten aus dem Mainthread zugreifst. Dafür gibt es dann Critical Sections. Oder du nutzt Messages, oder....
Das kommt auf deinen Fall an.

Apollonius 6. Okt 2008 12:17

Re: Synchronize für nonVCL
 
Willst du nur ohne VCL programmieren oder auch ohne große Teile der RTL? Synchronize kann man auch ohne die VCL zum Funktionieren bringen.

Mr_G 6. Okt 2008 14:05

Re: Synchronize für nonVCL
 
Zitat:

Zitat von Apollonius
Willst du nur ohne VCL programmieren oder auch ohne große Teile der RTL? Synchronize kann man auch ohne die VCL zum Funktionieren bringen.

Wenn man es genau nimmt nonRTL (Visuelle Komponenten habe ich eh nicht).
Zitat:

Zitat von sirius
Aufrufen kannst du sie immer. Es ist nur die Frage, ob du auf Daten aus dem Mainthread zugreifst. Dafür gibt es dann Critical Sections. Oder du nutzt Messages, oder....
Das kommt auf deinen Fall an.

Also im moment nutze ich zur Ablaufsteuerung Events. Das funktioniert wunderbar. Das Problem ist folgendes:
Ich möchte nun einen Thread in einem Objekt starten.
Dann möchte ich aus dem Thread eine Methode des Objekts aufrufen.
Die Methode soll dann eine Callback-Funktion (Feld des Objekts) aufrufen (evtl. wieder aus einem anderen Thread).
Wie muss ich das anstellen damit es hier nicht kracht? Critical Sections bei den Zugriffen auf die Felder und die nicht lokalen Variablen?
Gruß

Mr_G

Apollonius 6. Okt 2008 14:10

Re: Synchronize für nonVCL
 
Das hängt alles davon ab, um was für Felder es sich handelt und wie sie verändert werden. Ich sehe es immer als Ziel an, möglichst ohne Locks irgendeiner Art auszukommen. Mit den Interlocked-Funktionen lässt sich sehr viel machen, z.B. kann man so Listen ohne Locks verwalten.

Mr_G 6. Okt 2008 14:20

Re: Synchronize für nonVCL
 
Im Prinzip geht es nur um diesen Pointer auf die Function. Der liegt aber wie gesagt in dem Objekt (also anderer Thread). Bisher habe ich da gar nichts gesichert, weil ich dachte es handelt sich beim Aufrufen dann nur um einen lesenden Zugriff. Leider gibt es aber in dem Umfeld sehr seltsame Fehler, daher dachte ich es könnte hieran liegen.

Apollonius 6. Okt 2008 14:24

Re: Synchronize für nonVCL
 
Ist das ein Funktionszeiger oder ein Methodenzeiger? Um einen Methodenzeiger threadsicher zu bewegen, muss man ein wenig tricksen.

Mr_G 6. Okt 2008 15:57

Re: Synchronize für nonVCL
 
Bei dem Callback handelt es sich um einen Funktionszeiger.
Aber... ich hab nochmal in den Code gesehen (Problem liegt schon etwas länger hier) und die Struktur ist noch etwas anders:
-> Thread erzeugt Objekt
-> Objekt erzeugt neuen Thread (übergibt Refernz auf sich an ThreadProc)
-> ThreadProc ruft nun eine Methode des Objekts auf die die eigentliche Aufgabe des Threads enthält
-> Diese Methode ruft nun eine weite Methode auf, die auf das Callback-Feld zugreift und die Funkion aufruft
Auch wenn es sich überladen anhört, von der Programmlogik her wäre es so in Ordnung, aber ich denke, dass es nicht treadsicher ist.
Diese Objekt macht das ganze etwas kompliziert.

Apollonius 6. Okt 2008 16:01

Re: Synchronize für nonVCL
 
Das hört sich eigentlich threadsicher an.

Mr_G 6. Okt 2008 16:12

Re: Synchronize für nonVCL
 
Wenn das wirklich so wäre, wäre das extrem dumm... Das eigentliche Problem ist wie gesagt älter und ich habs nochmal ausgegraben.
Ich kann mir einfach nicht erklären woran das liegt. Wenn man in meinem nonVCL/RTL-Fall keinen "Ersatz" für Synchronize braucht bin ich nun vollkommen planlos :pale:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 Uhr.
Seite 1 von 2  1 2      

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