Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 06.07.2007, 07:11 Titel: Variable Programm erweiterungen... |
|
|
Tach,
Ich hatte mir gerade Gedanken darueber gemacht wie man zusaetzliche Aufgabenprogramme in ein laufendes Hauptprogramm implementieren koennte und dachte dabei mit hilfe von FBC eine Exe zu erzeuge und diese in nerhalb eines Threads zu starten..
Kann man diesem zusaetzlich gestarteten Programm vom Hauptprogramm Variablen uebergeben oder vorzeitig beenden/abrechen lassen, falls notwendig ?
Beispiel:
Hauptprogramm
Code: | Declare Sub Thread1 (byval i as integer)
Randomize Timer
Screen 19,32
Dim Th as any ptr
Th=Threadcreate (@Thread1,0)
Dim co as integer
do
co=int(rnd*&hFFFFFF)
color co
?"Test"
loop until multikey(&h01)
end
Sub Thread1 (byval i as integer)
Exec ("Thread_exe_test.exe","")
End Sub
|
Programm-erweiterung:
Thread_exe_test.exe
Code: |
randomize Timer
Screen 19,32
Dim co as integer
For l as integer=0 to 1000
co=int(rnd*&hFFFFFF)
color co
?"kjhdsafkjsdhfkjdh"
next l
end
|
So laufen beide Programme gleichzeitig... doch die erweiterug laeuft halt auch noch bis zum schluss weiter wenn das Hauptprogramm beendet wurde, nun dachte ich mir das im erweiterungsprogram ein weiterer Thread lauft der wiederum eine Variable vom Hauptprogramm ueberpruefen koennte und somit das Programm bei bedarf abfaengt, weiterhin waere es sinnvoll wenn man vom Erweiterungsprogramm variablen im Hauptprogramm abfragen koennte um dementsprechend eine weitergabe an spezifische Funktionen zu uebergeben... _________________
 |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 06.07.2007, 11:20 Titel: |
|
|
Die WinAPI stellt hierfür Funktionen zur Verfügung:
kernel32.dll hat Folgendes geschrieben: | CreateFileMapping
UnmapViewOfFile
MapViewOfFile
CloseHandle
|
Angewandt wird es folgendermaßen:
Zunächst rufen wir
CreateFileMapping(&hFFFFFFFF,0, 402653188,0,Size,*MapName)) auf. Size ist die maximale Länge der Map, MapName ist ein String der der Map einen Namen gibt.
Von der Funktion bekommen wir eine 0 zurück wenn etwas schiefgegangen ist, ansonsten einen Pointer auf die Map. Auf diesen müssen wir nun viewen: MapViewOfFile(HandleMap, 983071, 0, 0, 0), wobei HandleMap nat. der Wert ist, den wir von CreateFileMapping bekommen haben. Diese Funktion liefert uns einen Pointer eines Views zurück. Von nun an ist das Mapping einsatzbereit.
Im Viewpointer können wir theor. beliebige Speichertransaktionen machen, reinschreiben aber auch lesen. Am besten ein Type anlegen, sodass wir hier nicht die Grenzen überschreiten.
Wenn wir fertig sind, müssen wir zunächst das View mit UnMapViewOfFile(ViewPointer) auflösen und danach auch die Map mit CloseHandle(HandleMap)
Ich hoffe ich konnte es dir so erklären dass es verständlich war, ich habe mir jedenfalls Mühe gegeben  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 06.07.2007, 11:39 Titel: |
|
|
irgendwie hab ich das nicht wirklich verstanden... das ganze sieht so aus als wuerde ich mir hier speicher reservieren lassen um dann dort daten hinein zu schreiben...
dann koennte ich doch eigentlich auch die pointer zu den wichtigen variablen die ich benoetige als parameter ans Programm uebergeben und dann im nebenprogramm einfach auslesen, bzw ueberschreiben? _________________
 |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 06.07.2007, 11:57 Titel: |
|
|
Aber da ist nicht sichergestellt das Windows dir dazwischenfunkt.
Zumal so die Komponenten auch später gestartet werden können und kommunizieren können. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 06.07.2007, 12:11 Titel: |
|
|
Ja... hab ich gerade gemerkt...
habe ein Programm mit einer Pointeradresse gestartet.. die pointeradresse wird uebergeben, nur liest programm 2 nun was voellig anderes in der adresse als programm 1 _________________
 |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 07.07.2007, 19:24 Titel: |
|
|
Das geht so nicht (wie du's jetzt probiert hast), da jedes Programm seinen eigenen virtuellen Speicherbereich hat. Da müsstest du afaik Segmentregister anders besetzen, wobei du dann wissen wüsstest, welches denn für dein anderes Programm gebraucht wird.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 07.07.2007, 21:22 Titel: |
|
|
Allgemeine Bemerkungen: Normalerweise muss man immer zwischen Proozessen und Threads unterscheiden. Gemeinsam an beiden ist das Sheduling/Kontext-Wechsel bei der CPU sowie Verteilung auf die einzelnen Cores bei Multiprozessor-Systemen. Der Unterschied liegt im Speicherraum: Threads laufen im selben Speicherraum, während bei Prozessen jeder Prozess seinen eigenen virtuellen Speicherraum besitzt. Soweit die Theorie. Falls man auch zwischen Prozessen gemeinsame Variablen benötigt, so muss man auf die Interprozesskommunikation zurückgreifen: Dazu können zwei Prozesse ein gemeinsamer RAM-Bereich (Shared Memory) verwenden. Damit beim Modifizieren von Variablen in diesem Speicher kein Durcheinander durch Unterbruch während der Transaktion entsteht, müssen Variablentransaktionen als kritischer Abschnitt ausgeführt werden, wofür es Locking-Mechanismen mit beispielsweise Semaphoren braucht.
Als alternative Prozesskommunikationsmethode gibt es noch die Pipes. Diese verhalten sich wie Dateien, in denen im Prinzip der eine Prozess mit PRINT# Daten hineinschreiben kann und der andere diese mit INPUT# abholen kann. So wie ich in der FreeBasic-Befehlsreferenz gesehen habe, existiert mit OPEN PIPE genau diese Möglichkeit sogar als Built-In-Befehl, wo der eine Prozess Eure FreeBasic-Applikation ist, der andere ein beliebiger Shell- bzw. CMD.EXE-Befehl. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 07.07.2007, 22:24 Titel: |
|
|
Soll heißen, eine Kurzfassung ohne praktischem Beispiel meines ersten Beitrags dieses Threads  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 08.07.2007, 09:27 Titel: |
|
|
Jepp, das ganze ist doch ein wenig komplizierter als ich zunaechst dachte, zumal das neu erstellte Programm hinterher auch keine zugriffe auf die SUBs und Functions des Hauptprogramms hat... ich werd mir dafuer wohl noch eine andere moeglichkeit einfallen lassen muessen... _________________
 |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 08.07.2007, 09:50 Titel: |
|
|
Wie schaut's mit DLLs aus?
Obwohl, wäre schwierig, ich weiß nicht ob declare mit variablen klarkommt... |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 08.07.2007, 17:23 Titel: |
|
|
Mit DLLs sollte es eigentlich gehen.
@PMedia
Wo siehst du ein Problem mit Variabeln?
Man kann z.B. der Sub in der DLL einfach einen Pointer auf die Variabel mitgeben.
Edit:
Oder man reitet das Pferd verkehrt herum .
Das Hauptprogramm ist die DLL und die Erweiterung ist eine Exe.
Um das Hauptprogramm unabhängig der Erweiterung zu starten könnte eine Mini Exe dienen die nur eine Sub in der DLL aufruft. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 08.07.2007, 18:09 Titel: |
|
|
ich meinte, dass man eine dynamische Anzahl von Plugins laden kann
á la
dim name as string
dim dll as string
declare sub name lib dll alias name (lalalalalalalallaalalalalalalalala) |
|
Nach oben |
|
 |
|