2009-05-22 5 views
7

Kann ich eine Anzahl der Threads unter Windows CE mit C oder Visual C++ abbrechen, ohne die Funktionen resume oder suspend aufzurufen? Der einzige Weg, die ich sehen kann, es zu tun ist so etwas wieWie kann ich wissen, ob ein Thread unter Windows CE ausgesetzt ist

int Count = SuspendThread(ThreadHandle); 
ResumeThread(ThreadHandle); 

dies ein paar Probleme hat, erstens, würde ich eher den Faden nicht suspendieren, und zweitens, wenn der Thread-Kernel-Code in den Suspend möglicherweise fehl läuft . Ich kann das umgehen, aber ich finde, dass es eine elegantere Lösung geben sollte. Ich könnte es auch umkehren mit

int Count = ResumeThread(ThreadHandle); 
SuspendThread(ThreadHandle); 

Aber das hat ähnliche Probleme. Jede gute alternative Methode, die Aussetzungszählung vom Handle zu erhalten?

Antwort

4

Ich habe eine kombinierte Lösung. Verwenden Sie WaitForSingleObject(), um festzustellen, ob der Thread ausgesetzt ist oder nicht.

Wenn es nicht ausgesetzt ist, ist die suspendieren Zahl offensichtlich 0.

Wenn es ausgesetzt ist, ist es sicher SuspendThread() aufrufen, um die Zählung auszusetzen zu bekommen. Da es bereits gesperrt ist, wirst du nichts mehr aufhalten.

+0

Ja, das ist der einzige Weg, es zu tun. – ctacke

+0

Interessante Antwort. Wie lange würde warten, würde 1ms in allen Fällen genügen, oder ist es wahrscheinlich langsamer? –

+0

Eigentlich denke ich, dass Sie Wartezeit 0 verwenden können. WaitForSingleObject() wird den Status testen und sofort zurückkehren. Sie möchten nur den Rückgabewert gegen WAIT_OBJECT_0 prüfen.Was würde Ihnen sagen, dass der Thread-Status signalisiert und daher nicht ausgesetzt ist. – ralphtheninja

0

Wahrscheinlich mit WaitForSingleObject können Sie überprüfen, ob der Thread gesperrt ist, aber Sie können den Suspend-Counter nicht abrufen.

0

Sogar der Thread in Active erhalten Sie immer noch ein WAIT_TIMEOUT-Ergebnis, da Threads nur signalisieren, wenn sie fertig sind, nicht wenn sie ausgeführt werden.

Das sagte WaitForSingleObject (hThread, INFINITE) wartet, bis die Threads beendet ist.

+0

Aus diesem Grund war die vorgeschlagene Wartezeit für 0, nicht unendlich. – ctacke

1

Sie sollten auf keiner Plattform jemals einen Thread anhalten.

Sie sollten stattdessen Synchronisationspunkte in Ihrem Threading-Code hinzufügen, die explizit darauf warten, dass ein Flag signalisiert wird, bevor es fortgesetzt werden darf. Auf diese Weise können Sie wissen wo es pausiert wird, oder zumindest wissen, dass es an sicheren Punkten pausiert wird.

Die folgenden Operationen an Threads sollten für jeden Programmierer von jeder Plattform verboten, geradezu werden:

  • Lebenslauf Suspend (da Sie es nicht brauchen, wenn Sie den Faden nicht aussetzen kann)
  • Tötung/Abbruch

Sie sollten nie, nie, mit Gewalt Ihren Willen von außen an einem Faden verhängen. Sie haben keine Garantie, was es tut, welche Art von Ressourcen es gerade sperrt.

Immer Threading in einem kooperativen Modus schreiben. Dein Thread sollte sich seiner Umgebung bewusst sein und den Wünschen der Außenwelt nachgeben, entweder in geordneter Weise auszutreten oder innezuhalten, bis er sicher fortfahren kann.

+0

In ähnlicher Weise mit INFINITE in einem Warten sollte nie passieren. – ctacke

+0

Ich stimme völlig zu, es ist ein Hang, der darauf wartet, passiert zu sein. –

+0

+1, nach viel mühsamer Fehlersuche, habe ich alle Suspend/Resume-Aufrufe entfernt und alle Synchronisierungsobjekte auf einen einzelnen Mutex reduziert, der mit einem Kommunikationsstapel zwischen den beiden fraglichen Threads verknüpft ist. –

Verwandte Themen