AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Synchronize für nonVCL

Ein Thema von Mr_G · begonnen am 6. Okt 2008 · letzter Beitrag vom 6. Okt 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#1

Synchronize für nonVCL

  Alt 6. Okt 2008, 11:35
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
Jan
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Synchronize für nonVCL

  Alt 6. Okt 2008, 12:05
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Synchronize für nonVCL

  Alt 6. Okt 2008, 12:17
Willst du nur ohne VCL programmieren oder auch ohne große Teile der RTL? Synchronize kann man auch ohne die VCL zum Funktionieren bringen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Synchronize für nonVCL

  Alt 6. Okt 2008, 14:05
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 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
Jan
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Synchronize für nonVCL

  Alt 6. Okt 2008, 14:10
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Synchronize für nonVCL

  Alt 6. Okt 2008, 14:20
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.
Jan
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Synchronize für nonVCL

  Alt 6. Okt 2008, 14:24
Ist das ein Funktionszeiger oder ein Methodenzeiger? Um einen Methodenzeiger threadsicher zu bewegen, muss man ein wenig tricksen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Synchronize für nonVCL

  Alt 6. Okt 2008, 15:57
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.
Jan
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Synchronize für nonVCL

  Alt 6. Okt 2008, 16:01
Das hört sich eigentlich threadsicher an.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Synchronize für nonVCL

  Alt 6. Okt 2008, 16:12
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
Jan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr.
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