Erfahrungen mit FastPointer?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Eingeproggt

Betreff: Erfahrungen mit FastPointer?

BeitragMo, Jun 14, 2010 0:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Abend,

Ich spiel mich schon wieder mit einer Lib für Blitz mit der man einem Programm das gewisse Extra verpassen könnte - wenns klappt. Bei mir natürlich mal wieder nicht...
(Gleich vorweg: Ich versuchs mit der FastPointer-Lib weil die Libs von SilverKnee und Xaymar ja auch nicht so das Gelbe vom Ei sind (verbuggt bzw. nur begrenzt lauffähig))

Folgendes:

Ich verwende die FastPointer.dll um eine Funktion "im Hintergrund" laufen zu lassen. Also das is ne Funktion mit eigener hauptschleife und Timing und die rennt dank eigenem Thread parallel - soweit so gut. Klappt auch alles. Kommunikation muss soweit ich das sehe über globale Variablen erfolgen (Nur ein Integer Parameter bei dieser Lib erlaubt, keine Return Werte) - Auch das krieg cih ja noch hin - hab mich bei der ganzen Geschichte an "Example_ThreadsUse.bb" gehalten.
Jetzt hab ich bloß das Problem dass irgendwann * scheinbar keine Globals mehr verfügbar sind - weder für den THread noch für das Hauptprogramm (Wenn ich mir im Debuglog eine Variable ausgeben lasse dann ist die plötzlich leer) - kurze Zeit später krieg ich dann n MAV an den unterschiedlichsten und verrücktesten Stellen - oder auch einfach nur n kompletter Freeze.

*) Ich vermute es hat was mit andere Fenster aktivieren / minimieren / etc. zu tun aber genau kann ichs nicht sagen. Jedenfalls is das Verhalten mit und ohne Blitz-Debugmode dasselbe.

Hab schon versucht meine Funktion etwas um-zu-designen und Fehlerquellen auszuschließen... (Weitere Funktionsaufrufe eigener Funktionen vermieden, kein Zugriff auf Types mehr, keine Debuglogs) aber es läuft immer aufs selbe raus. Interessanterweise is mir das "Kunststück" dass es derart abstürzt beim Sample noch nicht passiert...

Hat jemand vlt Erfahrungen mit dieser Lib und kann mir Tipps geben?
Ich würde demjenigen auch meinen kompletten Code zum Testen geben.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Silver_Knee

BeitragMo, Jun 14, 2010 2:07
Antworten mit Zitat
Benutzer-Profile anzeigen
hey probier mal als integer n handle von nem object zu übergeben..

Die fastpointer macht so wie ich das gesehn habe nichts anderes als Noobodys lib nur dass die n offset draufaddieren um den Funktionspointer direkt zu bekommen. Daher haste normalerweise auch mit den gleichen problemen zu kämpfen.

BtbN

BeitragMo, Jun 14, 2010 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Da du in BB keine Mutexes oder sonstige mittel zur synchronisierung zur verfügung hast darfst du nicht mit dem Thread auf die selben ressourcen zugreifen wie der Haupt-Prozess.
D.h. nicht geteilte globals verwenden, oder ein gemeinsames Type-Objekt benutzen. Im prinzip garnicht kommunizieren, während der Thread läuft.

Silver_Knee

BeitragMo, Jun 14, 2010 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie wärs damit
BlitzBasic:

Global lol$

Type Work

End Type

Function Thread()
mywork=New Work
Delay 500

While mywork<>Last Work
Delay 100
Wend

lol="ouuuu"
End Function

;Hier Thread starten

w.Work=New Work
lol="wuut"
Delay 1000
Print lol

Delete w

Delay 1000
Print lol

Noobody

BeitragMo, Jun 14, 2010 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich fürchte, dass auch New nicht threadsafe ist. Da ja der neue Type ans Ende der Linked List angehängt wird, muss ja dessen Adresse in den Link des bisher letzten Types eingetragen werden. Tuen das zwei Threads gleichzeitig, fliegt einem B3D um die Ohren.

Die einzige sichere Möglichkeiten geht also über Mutexe und co. Es müsste einfach mal jemand eine passende Lib dazu schreiben Razz
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Silver_Knee

BeitragMo, Jun 14, 2010 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
aber wenn man das genau so macht wie in dem beispiel würde es nur schief gehen wenn man 2 Threads gleichzeitig startet, oder?

Eingeproggt

BeitragMo, Jun 14, 2010 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mich nun an die Vorschläge von btbN bzw. SilverKnee gehalten (zusätzlich noch das beachtet was hier als Hinweise gegeben wurden) und dann noch desöfteren herum getestet, also ich habe nur Erfolg wenn ich:

-) keine globals,
-) keine Types,
-) keine Debuglogs verwende
-) die Threads immer brav wieder schleiße (FreeThread) (*)

Ich starte meinen Thread nun und geb ihm das Handle zu einer Bank in der alles weitere drin steht, das funktioniert zum Glück.
Nun komm ich leider nicht drauf was ich tun kann, um Rückmeldungen vom Thread zu erhalten?
Das ist auch für den oben markierten Punkt (*) wichtig, da ich ja nicht sagen kann wann ich den Thread beenden kann - bis jetzt geschieht das nach Gefühl nach 3sek. - aber was wenn er dann noch nicht fertig ist? (Im Thread geht es darum einen TCP-Ping auszuführen.)

Also ich wiederhole:
Ich kann keine Globals setzen, keine Types erstellen und nichtmal in die übergebene Bank etwas hineinschreiben (das führte auch zum Chaos). Den Return-Wert meiner im Thread ablaufenden Funktion kann ich ja auch nicht kriegen oder?
Wie soll man dann die Ergebnisse des Threads verarbeiten? Crying or Very sad

Ergänzende Frage @SilverKnee:
Die von dir gepostete Userlib is ja auch ganz schön - sogar noch einfacher. Dort soll das ja gehn mit Globals? Aber warum, im Prinzip baust du doch auf den selben Mechanismen? Außerdem stört der "Absturz" beim Beenden des Blitz-Programms... gibts da mittlerweile ne Lösung dafür?

Danke für die bisherige Beteiligung hier!

mfG, Christoph.

EDIT

Hmm... ein Programm, das sich selbst UDP-Nachrichten sendet zum Datenaustausch. Phantasievoll, nicht? Razz
Der erste Versuch hat grad geklappt, aber ob diese Vorgehensweise "serienreif" ist?
Wenn jemand bessere Ideen hat bitte noch melden!
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

hazumu-kun

BeitragMo, Jun 14, 2010 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Namedpipes sind das mittel der Wahl wenn du andersweitig nicht kommunizieren kannst.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Eingeproggt

BeitragMo, Jun 14, 2010 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
An die dachte ich auch zuerst, aber hab mich überhaupt nicht ausgekannt mit der MSDN Beschreibung Sad
Naja, im Moment hab ich eh schon wieder die "üblichen" Wickel dass sich wieder alles zerschießt (nach so etwa einer Minute längstens) - Dabei hab ich jetzt wirklich alles sehr scharf getrennt, der Thread arbeitet nur mit lokalen Vars...
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group