Laden...

Control.Invoke verschluckt?

Erstellt von Stu42 vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.808 Views
S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 15 Jahren
Control.Invoke verschluckt?

Hallo,

ich stehe gerade vor einem, mir seltsam vorkommenden, Problem.

Ich habe ein event welches aufgerufen wird und 2 Funktion via Invoke aufruft:


void OnInjected()
{
            if (!bIsCollectiong)
            {
                Invoke(new DelegateCallVoidVoidFunktion(HideInjectedWaitingForm));
                Invoke(new DelegateCallBoolVoidFunktion(StartAquisition));
            }
}

Und so wie es aussieht, wird der erste Aufruf (HideInjectedWaitingForm) nicht ausgeführt.

Kann es sein, das ein "Invoke" aus irgentwelchesn Gründen nicht aufgerufen wird? z.B. wenn der Rechner echt lahm ist, und die CPU auslastung hoch geht?

Gruß Stu

Gelöschter Account
vor 15 Jahren

Kann es sein, das ein "Invoke" aus irgentwelchesn Gründen nicht aufgerufen wird? z.B. wenn der Rechner echt lahm ist, und die CPU auslastung hoch geht?

nein.

hast du gedebuggt?

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 15 Jahren

Nein, kann ich auch leider nicht. Der Rechner ist beim Kunden. Und bei mir kommt der Fehler nicht.

Gelöschter Account
vor 15 Jahren

dafür verwendet man remot-debugging. schick deinem kunden die pdb´s, die er in das ausführungsverzeichniss kopieren soll, sag ihm das er seinen router eine port-weiterleitung beibringen muss (welchen port habe ich vergessen...) und mach ein attach to process mit deinem debugger im vs.

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 15 Jahren

Ja ist nicht so einfach, der der Fehler (wenn er kommt) erst noch 4 stunden oder so kommt. Muss ich so mal schauen.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Stu42,

wir reden über Control.Invoke?

Control.Invoke arbeitet synchron. Da kann nichts verloren gehen. Allerdings wird Control.Invoke nicht ausgeführt, wenn das GUI (durchgehend) beschäftigt ist.

herbivore

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 15 Jahren

Ja genau, Control.Invoke.

Ja ich hab es schon fast vermutet das es dadran nicht liegen kann, bzw die funktion immer aufgerufen wird.

Bin in letzer Zeit entwas Paranoid in sachen Threadsicherheit, bzw mit diesen Asynchronen Invokes.

Denn mein Programm läuft auf einen schnellen Rechner sehr gut, nur auf einem langsameren kommen Fehler!

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Stu42,

Denn mein Programm läuft auf einen schnellen Rechner sehr gut, nur auf einem langsameren kommen Fehler!

das deutet aber schon auf Probleme mit Synchronisation oder dem Fehlen derselben hin. Stichwort Racing Condition.

herbivore

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 15 Jahren

Ich habe mal eben gegoogelt und eine Race Condition wäre denn sowas?


bool bTrigger = false;
void DoIt()
{
    while(bTrigger )
        Application.DoEvents();
      bTrigger = true;
     //sicherer code
     bTrigger = false;
}

Und wie ist das eigentlich mit dem "lock (this)" in Timer-Tick-Funktionen?
Ist jeder Timer-Tick in einem eigenen Thread? Denn wenn dann der nächste Tick kommt, während der vorherige Tick noch ausgeführt wird, könnte sowas sich dann aufschaukeln zu einem Deadlock?

Gelöschter Account
vor 15 Jahren

Ist jeder Timer-Tick in einem eigenen Thread?

ja.

Denn wenn dann der nächste Tick kommt, während der vorherige Tick noch ausgeführt wird, könnte sowas sich dann aufschaukeln zu einem Deadlock?

nicht deadlock. das ist was anderes aber es kommt dann zum sogenannten "sterbenden thread"

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Stu42,

Ist jeder Timer-Tick in einem eigenen Thread?

nein!

Tick gibt es nur bei System.Windows.Forms-Timer und da laufen alle Events im GUI-Thread.

herbivore

Gelöschter Account
vor 15 Jahren

ok ich bin jetzt vom System.Timers.Timer augegangen.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo JAck30lena,

System.Timers.Timer sollte man - wenn kein besonderer Grund vorliegt - in WinForms-Anwendungen ohnehin nicht verwenden.

herbivore