| Autor |
Beitrag |
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Di 31.08.10 11:37
Ich habe einen Slaveprocess und einen Masterprocess.
Der Slaveprocess hat eine Tabelle mit Einstellungen, auf die er ständig zugreift (>10 mal je Sekunde)
Aus dem Masterprocess will ich jetzt diese Tabelle ändern können.
Synchronisierung ist nicht nötig (nicht schlimm, wenn die Tabelle nicht vollständig geschrieben wurde, bevor sie gelesen wird)
Wichtig ist nur, dass des Lesen absolut schnell geht (ohne Zusatzaufwand)
Wie mache ich das?
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 31.08.10 12:24
Kennst du schon, mit MMFs. Mehr dazu heute Abend nach der Arbeit. 
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Di 31.08.10 16:51
Ist diese Tabelle eine Klasse? Oder ein Array of Records, und was für Daten hast du drin? z.B. Strings?
Im Prinzip kannst du mir MMF Shared Memory haben (ein Memoryblock, der in mehreren Prozessen identisch ist) du musst einfach mit Pointern aufpassen.
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Di 31.08.10 19:10
ist das Pollen wirklich nötig, oder kannst du nicht auch dem Slave ne message schicken, wenns was neues gibt?
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Di 31.08.10 19:58
Der Slave ist ne DLL in nem andren Prozess. Die kümmert sich darum, dass verschiedene Tasten vertauscht werden.
Diese "vertauschung" steht in einem statischen Array. Also kein Pointer-Probleme.
Message kann ich nicht senden, da ich kein Fenster habe.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 31.08.10 20:18
Du kannst auch mit PostThreadMessage eine Nachricht an einen Thread eines Prozesses ohne Fenster senden.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Di 31.08.10 20:45
Wenn es eine Konsolenapplikation ohne GUI ist, kannst du dir auch einen Thread mit Messageloop machen:
www.delphi-library.d...andling_90333,0.html
Dann schickst du die Konfiguration per WM_COPYDATA
Oder ändert sich die Konfiguration ständig?
Und sonst ist MMF sicher auch eine Lösung.
EDIT: Die Library oben hat einen bösen Bug. Und zwar verwende ich dort Classes.AllocateHWnd/DeallocateHWnd in einem Thread. Die Funktionen sind nicht thread-safe (MakeObjectInstance ist nicht thread-safe, weil es die globalen Variablen InstFreeList und InstBlockList verwendet).
EDIT: Nevermind! Hatte meinen Kommentar übersehen
FHandle := Classes.AllocateHWnd(nil);
Es ist also alles gut 
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 31.08.10 21:49
WM_COPYDATA wird nicht funktionieren, da die Nachricht ein Fensterhandle benötigt.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Di 31.08.10 22:00
Luckie hat folgendes geschrieben : | | WM_COPYDATA wird nicht funktionieren, da die Nachricht ein Fensterhandle benötigt. |
Kriegste mit obiger Library auch. Daher die ganze Geschichte in den Edits mit dem AllocateHWnd. Die Funktion kreiert ja ein Fensterhandle.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 31.08.10 22:28
OK, aber ich würde das mal ausprobieren.
|
|
Astat
      
Beiträge: 75
Erhaltene Danke: 1
Windows 2000
D6, D7, D2007, Lazarus
|
Verfasst: Di 31.08.10 22:35
Flamefire hat folgendes geschrieben : | Der Slave ist ne DLL in nem andren Prozess. Die kümmert sich darum, dass verschiedene Tasten vertauscht werden.
Diese "vertauschung" steht in einem statischen Array. Also kein Pointer-Probleme.
Message kann ich nicht senden, da ich kein Fenster habe. |
Hallo Flamefire, hier der Klassiker.
1. Thread in der DLL wartet auf Sperrobjekt (Mutex oder Semaphore)
2. Master schreibt neue Daten in MMF und signalisiert Sperrobjekt
3. DLL Thread liest Daten, und vertauscht Tasten, und wartet wieder auf Sperrobjekt.
usw......
Somit ist permanentes Polling nicht notwendig.
lg. Astat
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mi 01.09.10 07:15
Wenn es einfach nur ein Array of Integer ist und ihm egal ist, ob das Array als ganzes bereits geschrieben wurde oder nicht, muss er nicht locken.
Ich glaube 32-bit aligned sollten die Integers aber sein und sie müssen auch als Integers geschrieben werden (nicht einzelne Bytes schreiben). Das müsste man nochmals genauer nachschauen.
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Mi 01.09.10 10:54
Die DLL braucht dauerhaften Zugriff auf die Daten. Geändert werden die nur 1 mal bis sehr selten. Wenn für nen winzigen Moment die Daten nicht konsistent sind, ist das egal.
Ich muss nur wissen, wie ich direkt aus dem Addressbereich der DLL lesen und schreiben kann. Von mir aus auch per Writeprocessmemory. Ich muss nur irgendwie herauskriegen, wo die Struktur liegt.
Aber wie?
Edit: Ok...delphiphan hat ne Klasse veröffentlicht. Einfach gehts nicht. Thx
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mi 01.09.10 11:05
Alloziere Speicher über [url= www.delphi-forum.de/...wtopic.php?t=101328]TSharedMemory[/url] mit dem gleichen Namen. Die sind dann in allen Prozessen gleich.
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Mi 01.09.10 17:39
Kann ich auch einen SharedMemory auf einen bestehenden Speicher setzen? Also dass ich in meinem Fall den Pointer auf meine Struktur übergebe, und der den bestehenden Bereich dann "shared" setzt?
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mi 01.09.10 20:46
Nein. Das sind spezielle Memorybereiche. Damit kann der Delphi Memory Manager auch nicht umgehen und wenn, dann hättest du Zwingend andere Sachen auch, weil der Pointer i.A. nicht korrekt aligned ist.
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Mi 01.09.10 20:59
Was spricht denn gegen die gennanten Möglichkeiten mittels messages?
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 02.09.10 04:57
|
|