2012-03-31 5 views
0

Was ich im Grunde zu acomplish will, ist auf eine task_group neue Arbeitsaufgaben zu planen, wie Arbeit verfügbar wird. Auf der task_group wird die Methode run() in einem Hersteller consummer Szenario genannt -, so dass als Arbeit zu einem bestimmten Zeitpunkt notwendig ist, es auf dem task_groupPPL task_group Zeitplan arbeiten und säubern angesammelten Ressourcen

Concurrency::task_group taskGroup; 

tempalte <typename Functor> 
void queue_work(Functor& fn) 
{ 
    taskGroup.run([&fn](){ 
     fn(); 
    }); 
} 

task_group erfordert ausgeführt werden soll (vor Beenden der App) Dieser ruft die Methode wait() auf, um Ressourcen freizugeben. Ich benutze task_group, weil ich auch Unterstützung für die Löschung benötige, aber die Notwendigkeit, wait() aufzurufen, kompliziert das Design. Praktisch scheint es, dass ich einen zusätzlichen Thread verwenden müsste, von dem ich wait() von Zeit zu Zeit auf die Taskgruppe aufrufe (weiß nicht, ob es auch legal ist, nach dem Aufruf von wait() einmal oder nach der Task neue Aufgaben zu planen) Warten Sie() wiederholt).

Wie würden Sie es mit ppl von Microsoft tun?

EDIT MSDN-Dokumentation besagt, dass legal ist Wartezeit zu nennen() mehrere Male. http://msdn.microsoft.com/en-us/library/dd470481.aspx „auf einem task_group Objekt Warte Aufruf setzt es in einen sauberen Zustand, in dem sie wiederverwendet werden können Dies schließt den Fall, wo die task_group Objekt wurde abgebrochen. "

Das Einzige, was noch wäre, wenn man

einen anderen Ansatz könnte

Antwort

0

zu Meine Lösung war schließlich eine spezielle Aufgabe von CurrentScheduler erstellt verwenden :: ScheduleTask() aus, wo ich task_group.wait() aufrufen, von Zeit zu Zeit, um aufgelaufene Concurrency-Scheduler-Ressourcen zu bereinigen.

Wenn die Anwendung beenden will, muss ich dieser Aufgabe jedoch signalisieren, dass sie selbst enden muss (um sauber zu säubern)