Probleme mit Timergesteuertem Methodenaufruf

30/04/2008 - 15:18 von Florian Zierer | Report spam
Hallo,

ich habe ein Problem mit einem Methodenaufruf von einem Timer.

Es geht um einen automatischen reconnect einer Bluetoothverbindung auf
einem Mobiltelefon (Windows Mobile 6, .Net CF 2.0). Die
Bluetoothverbindung wird mithilfe der Klassen von
http://nativemobile.blogspot.com/20...urces.html und dem
Widcomm BT Stack umgesetzt. (also über PInvoke mit einer erweiterten
wcbts.dll). Im normalen Betrieb funktioniert alles wie gewollt (connect,
disconnect, Datenübertragung ...).

Wenn ich meine reconnect() Methode direkt aufrufe (über einen Button mit
Click Event) macht sie genau was sie soll. Also die Verbindung wurde
extern getrennt, dann rufe ich reconnect() auf und es wird ein
disconnect() und nach 2s wieder ein connect() ausgeführt.

Das Problem ist jetzt aber die Timergesteuerte Ausführung. Ich teste
alle paar Sekunden, ob die Verbindung noch steht und bei getrennter
Verbindung wird reconnect() aufgerufen.

Es wird exakt die gleiche Methode aufgerufen, deswegen bin ich ein wenig
verwundert, warum es direkt geht, aber über den Timer nicht.

Die Methode wird auch ausgeführt, nur leider kann die
Bluetoothverbindung nicht aufgebaut werden (der Verbindungsaufbau
scheint zu klappen, die Verbindung steht anscheinend auch aber es
fliessen keine Daten).

Jetzt ist eine Vermutung von mir, dass bei einem manuellen reconnect()
über den Button irgendwie bestimmte Ressourcen vom Garbage Collector
freigegeben werden, die bei automatischem reconnect noch belegt sind.

Ich habe eigentlich versucht alle Objekte mit Dispose() zu löschen und
auch die Ressourcen im C++ Code freizugeben bin aber leider in diesem
Bereich noch nicht 100% fit.

Kennt sich jemand mit dem Widcomm BT Stack aus und kann mir sagen wo das
Problem liegen könnte?

Gibt es eine Möglichkeit sich alle im Moment instanziierten Objekte
anzuschauen (einen Coredump oder sowas)?

Was ist anders wenn eine Methode Timergesteuert oder direkt aufgerufen wird?

Hat jemand eine Idee woran das liegen knnte?

Danke schonmal
Flo
 

Lesen sie die antworten

#1 Dietmar
30/04/2008 - 16:39 | Warnen spam
Florian Zierer wrote:
Hallo,

ich habe ein Problem mit einem Methodenaufruf von einem Timer.

Es geht um einen automatischen reconnect einer Bluetoothverbindung auf
einem Mobiltelefon (Windows Mobile 6, .Net CF 2.0). Die
Bluetoothverbindung wird mithilfe der Klassen von
http://nativemobile.blogspot.com/20...urces.html und dem
Widcomm BT Stack umgesetzt. (also über PInvoke mit einer erweiterten
wcbts.dll). Im normalen Betrieb funktioniert alles wie gewollt (connect,
disconnect, Datenübertragung ...).

Wenn ich meine reconnect() Methode direkt aufrufe (über einen Button mit
Click Event) macht sie genau was sie soll. Also die Verbindung wurde
extern getrennt, dann rufe ich reconnect() auf und es wird ein
disconnect() und nach 2s wieder ein connect() ausgeführt.

Das Problem ist jetzt aber die Timergesteuerte Ausführung. Ich teste
alle paar Sekunden, ob die Verbindung noch steht und bei getrennter
Verbindung wird reconnect() aufgerufen.

Es wird exakt die gleiche Methode aufgerufen, deswegen bin ich ein wenig
verwundert, warum es direkt geht, aber über den Timer nicht.

Die Methode wird auch ausgeführt, nur leider kann die
Bluetoothverbindung nicht aufgebaut werden (der Verbindungsaufbau
scheint zu klappen, die Verbindung steht anscheinend auch aber es
fliessen keine Daten).

Jetzt ist eine Vermutung von mir, dass bei einem manuellen reconnect()
über den Button irgendwie bestimmte Ressourcen vom Garbage Collector
freigegeben werden, die bei automatischem reconnect noch belegt sind.

Ich habe eigentlich versucht alle Objekte mit Dispose() zu löschen und
auch die Ressourcen im C++ Code freizugeben bin aber leider in diesem
Bereich noch nicht 100% fit.

Kennt sich jemand mit dem Widcomm BT Stack aus und kann mir sagen wo das
Problem liegen könnte?

Gibt es eine Möglichkeit sich alle im Moment instanziierten Objekte
anzuschauen (einen Coredump oder sowas)?

Was ist anders wenn eine Methode Timergesteuert oder direkt aufgerufen
wird?

Hat jemand eine Idee woran das liegen knnte?

Danke schonmal
Flo



Du schreibst nicht, welchen Timer du verwendest:

Ist es ein System.Windows.Forms.Timer oder ein System.Threading.Timer?

Ich vermute hier eher, dass dein Timer deine Tick-Funktion in einem
anderen Threadcontext als dem GUI-Threadcontext aufruft. Hier kann es
dann zu Problemen kommen, vor allem, wenn deine Funktion unter Umstànden
lànger braucht als das Timer-Intervall: hier kann es sogar soweit
kommen, dass der nàchste Thread schon am Beginn der Funktion hereinkommt
wàhrend der "alte" noch gar nicht fertig ist und es greifen eventuell
zwei Threads auf die gleichen Resourcen zu.
Soweit würde ich allerdings gar nicht gehen, sollte dein Timer ein
anderer als ein System.Windows.Forms.Timer sein, stell entweder auf
diesen um oder such mal nach Invoke, BeginInvoke, InvokeRequired.

Das wàre ein Grund (eigentlich der einzige, der mir spontan einfàllt),
warum eine Funktion etwas anderes machen sollte, wenn sie einmal über
ein Button-Clickevent und einmal über einen Timer aufgerufen wird.

Grüße

Dietmar

Ähnliche fragen