2016-07-23 28 views
-1

Lassen Sie es ein One-Thread-Programm, das eine große functionLarge() aufruft, die vor der nächsten Codeline in den Aufrufer main Funktion beenden muss. Angenommen, die Funktion ist gut aufgeteilt und dauert nur lange.
In dieser answer.wait() wird vorgeschlagen, und ich frage mich, ob es besser ist als:Warten Sie, bis die Funktion beendet ist, bevor Sie das Hauptprogramm (ein Thread) fortsetzen

bool done = false; 
    // returning true at the end, modifies bigObject by refrence 
    done = functionLarge(bigObject); 
    while(!done) { usleep(1000); } 

    //...can now continue 

Gibt es bessere Ansätze, ohne bool die Rückkehr?

+0

Stoppen Sie einfach 'bool' zu verwenden und lassen Sie das Programm in der normalen Ausführungsreihenfolge laufen? – MikeCAT

+0

Ihr Ansatz ist schlecht, weil der Wert von 'dont' nicht auf magische Weise nach zugewiesen ändern, so wird die Schleife entweder 0 oder unendlich mal genommen werden. – MikeCAT

+0

Sie geben die while nicht ein, bis "functionLarge" fertig ist. – Dacav

Antwort

1

Sie vermasseln dies massiv, weil das ist, wie es funktioniert.

Wie Sie gesagt haben, ist es single-threaded. Die Kontrolle wird an functionLarge übergeben und wird erst zurückgegeben, wenn diese Funktion abgeschlossen ist.

Sie brauchen nichts zu tun. Keine Notwendigkeit für jegliche bool s oder while Schleifen. Mit einem einzigen Thread, was genau macht das "Warten"?

int main() 
{ 
    doThis(); 
    nowDoThis(); 
} 
+0

Die Aufgabe wird durch 'functionLarge' und in der nächsten Zeile hinzugefügt, um einen [interaktiven Markierungsserver] modifiziert (http://docs.ros.org/jade/api/interactive_markers/html/classinteractive__markers_1_1InteractiveMarkerServer.html#a7b688e99eeb8cdcc3f8d03c49ec5ef70). Ohne das Konstrukt bin ich nicht in der Lage, den Marker zu visualisieren, und ich habe ihn ausfindig gemacht, dass das Objekt hinzugefügt wird, bevor es durch 'functinLarge' vorbereitet wird. Auch ein einfaches 'usleep (1000)' funktioniert, also nehme ich das Timing an. Es kann direkt den Unterschied in [Rviz] (http://wiki.ros.org/rviz/Tutorials/Markers%3A%20Basic%20Shapes#Running_the_Code) – ItsmeJulian

+0

Visualize ... oh ich glaube, ich habe es, war der Fehler weiter up: Der Server ist ein dynamisch zugewiesenes Objekt und offensichtlich nicht vollständig initialisiert, wenn ich das 'bigObject' übergebe. – ItsmeJulian

+0

Keine Ahnung, wovon du sprichst. –