Threading + RaiseEvent = Stillstand?

03/05/2009 - 23:23 von Andreas Mahub | Report spam
Hi Leute,

ich habe hier etwas, dass mich etwas unglàubig stutzen làßt. Wenn wenigstens
ein Thread-Error kommen würde, wàre ich ja schon fast "glücklich".

Kurz erklàrt:
Ich habe in meiner WinForm eine Methode gehabt, welche bis jetzt einwandfrei
funktioniert hat. Diese habe ich jetzt 1:1 an den anfang einer anderen
Methode verschoben. Urplötzlich stand mein Programm. Es lief einfach nicht
weiter, CPU-Auslastung bei ca. 60%, aber es passierte nichts mehr.

Was passiert:
1.) Da die Aktion lànger dauert, soll ein kleines Statusfenster angezeigt
werden. Damit dieses überhaupt aufgebaut wird und die Labels aktualisiert
werden, habe ich ein Threading-Objekt erzeugt. Was auch einwandfrei lief
(Bis ich die eine Methode mit der anderen Methode verschmelzte).

2.) Daten werden zum externen Datenbank-Server versendet. Gleich beim ersten
Datensatz bleibt das Programm einfach stehen und macht nichts mehr. (Der
erste Datensatz wurde aber geschrieben - nur der!)

3.) Nach langem suchen habe ich rausgefunden WANN das Programm stehen
bleibt. Die WinForm ruft eine Methode in einer Klasse auf (welche den
Datensatz schreibt), und diese wiederum macht ein RaiseEvent worauf wiederum
meine WinForm "lauscht". Von da an bleibt alles stehen, keine Fehlermeldung
nichts. Cpu-Auslastung bei 60%

4.) Nehme ich in der besagten Klasse die RaiseEvents raus làuft das Programm
einwandfrei es werden alle Datensàtze geschrieben etc.

Soll dieses Verhalten wirklich so sein?

Gruß
Andy
 

Lesen sie die antworten

#1 Armin Zingler
04/05/2009 - 00:40 | Warnen spam
Andreas Mahub wrote:
Hi Leute,

ich habe hier etwas, dass mich etwas unglàubig stutzen làßt. Wenn
wenigstens ein Thread-Error kommen würde, wàre ich ja schon fast
"glücklich".
Kurz erklàrt:
Ich habe in meiner WinForm eine Methode gehabt, welche bis jetzt
einwandfrei funktioniert hat. Diese habe ich jetzt 1:1 an den anfang
einer anderen Methode verschoben.



Den Inhalt oder den Aufruf? Um welche Methoden geht es denn?

Urplötzlich stand mein Programm. Es
lief einfach nicht weiter, CPU-Auslastung bei ca. 60%, aber es
passierte nichts mehr.
Was passiert:
1.) Da die Aktion lànger dauert, soll ein kleines Statusfenster
angezeigt werden. Damit dieses überhaupt aufgebaut wird und die
Labels aktualisiert werden, habe ich ein Threading-Objekt erzeugt.
Was auch einwandfrei lief (Bis ich die eine Methode mit der anderen
Methode verschmelzte).



Verschmelzen? Was genau hast du geàndert? Wenn der Ablauf derselbe ist, ist
es egal, wo der Code steht.

2.) Daten werden zum externen Datenbank-Server versendet. Gleich beim
ersten Datensatz bleibt das Programm einfach stehen und macht nichts
mehr. (Der erste Datensatz wurde aber geschrieben - nur der!)



Bist du per Einzelschritt durchgegangen? Was sieht der Callstack (die
Aufrufliste) aller Threads aus wenn du zu diesem Zeitpunkt das Programm
unterbrichst (Strg+Pause)? Bitte _alle_ Stackframes anzeigen lassen (->
Kontextmenü im Callstack-Fenster)

3.) Nach langem suchen habe ich rausgefunden WANN das Programm stehen
bleibt. Die WinForm ruft eine Methode in einer Klasse auf (welche den
Datensatz schreibt), und diese wiederum macht ein RaiseEvent worauf
wiederum meine WinForm "lauscht". Von da an bleibt alles stehen,
keine Fehlermeldung nichts. Cpu-Auslastung bei 60%



Was làuft in welchem Thread? Wenn alles in einem Thread làuft, könnte es
sich um rekursive Aufrufe handeln. Allerdings recht unwahrscheinlich da dann
recht bald ein Fehlermeldung (Stack overflow) kàme. Ansonsten können
dead-locks die Ursache sein, oder...

4.) Nehme ich in der besagten Klasse die RaiseEvents raus làuft das
Programm einwandfrei es werden alle Datensàtze geschrieben etc.

Soll dieses Verhalten wirklich so sein?




Das kann ich deiner Beschreibung nicht entnehmen. Grundsàtzlich kann ich nur
sagen:
- auf ein Control (inkl Form) darf nur in dem Thread zugegriffen werden, die
das Control erzeugt hat (=UI-Thread). Jeder andere Thread muss per
DasControl.Invoke/.BeginInvoke den Aufruf einer Methode im UI-Thread
veranlassen. In dieser kann dann auf das Control zugegriffen werden.
- Raiseevent: Die Ereignishandler werden im gleichen Thread ausgeführt wie
der Code, der RaiseEvent ausführt.

Welche VB-Version verwendest du? Am wichtigsten sind die Callstacks aller
(relevanten) Threads. Bitte posten, sonst làsst sich's schwer finden.


Armin

Ähnliche fragen