2009-04-22 9 views
8

Ich habe einen Boost-Thread erstellt mit: boost :: thread thrd (& connectionThread); wo connectionThread eine einfache Void-Funktion ist. Dies funktioniert gut, aber wenn ich versuche, es für ein paar Sekunden, zum Beispiel warten zu machen mit:C++ Einen Boost-Thread 1 Sekunde warten lassen

boost::xtime xt; 

boost::xtime_get(&xt, boost::TIME_UTC); 

xt.sec += 1; 

boost::thread::sleep(xt); // Sleep for 1 second 

Das Programm stürzt an der xtime_get Linie. Selbst wenn man manuell versucht, xt.sec einzustellen, funktioniert es nicht. Ich habe mehrere andere Methoden ausprobiert, aber ich kann es scheinbar nicht funktionieren lassen. Gibt es etwas, was ich falsch mache? Gibt es einen einfacheren Weg, um mein Ziel zu erreichen?

+2

Mehr informat Ion benötigt - dies stürzt auf der Xtime_get-Linie? Wenn ja, wie stürzt es ab, wenn Sie das xt manuell einstellen (oder verhält es sich einfach nicht wie gewünscht)? –

+0

Wie funktioniert es nicht, wenn Sie versuchen, xt.sec manuell einzustellen? xt.sec = 1 ist wahrscheinlich eine unglaublich kurze Zeit, da ich denke, dass sec mindestens in Millisekunden ist. Wenn ja, würden Sie für eine Millisekunde schlafen. – Skurmedel

+3

http://www.boost.org/doc/libs/1_38_0/doc/html/thread/time.html#thread.time.system_time sieht es auch so aus, als ob die aktuellste Version der Bibliothek nun Komponenten von boost verwendet :: date_time, um die Dauer anzugeben. – Skurmedel

Antwort

0

Mit diesem Code (nicht zu wissen, zum Beispiel, wo Sie es setzen), alles was ich sagen kann ist, dass die xtime_get Methode gibt den Typ der Maßnahme zurück. Das heißt, müssen Sie sicher sein, zum Beispiel, dass die folgende Assertion gilt:

int res = boost::xtime_get(&xt, boost::TIME_UTC); 
assert(res == boost::TIME_UTC); 

Es kann, dass in Ihrem System geschieht dies nicht der Fall ist.

Wenn ich jedoch den Code erneut betrachte, kommt es mir in den Sinn, dass der Absturz nicht unbedingt mit diesem Anruf in Verbindung steht, sondern mit anderen Dingen, die Sie in Ihrer Anwendung tun. Auch hier kommt es darauf an, wo Sie diesen Code verwenden. Ist es innerhalb der operator() Ihres Threads?

2

boost::xtime_get() sieht wie eine der wenigen Boost-APIs aus, die nicht in einer Kopfzeile implementiert ist, also könnte dies etwas wie nicht korrekt kompiliert die Boost-Bibliothek sein. Dies ist wahrscheinlich ähnlich wie bei Anrufkonventionen oder etwas anderes. Ich weiß nicht von Anfang an, welche Schritte Sie brauchen, um die Bibliothek neu zu erstellen - alles, was ich je in Boost verwendet habe, waren Sachen, die nur die Header benötigen.

Es kann hilfreich sein, wenn Sie nur in die xtime_get() Routine zurückverfolgen, selbst wenn es auf Assembly-Ebene ist. Die xtime Struktur ist sehr, sehr einfach und xtime_get() tut wirklich nichts mehr, als eine plattformspezifische API aufzurufen, um die Zahlen in die xtime Struktur zu stecken.

26

Gibt es einen einfacheren Weg

Vielleicht etwas in dieser Richtung:

boost::this_thread::sleep(boost::posix_time::seconds(1)); 

boost::thread::sleep(boost::posix_time::seconds(1)); 

+1

Ihre zweite Möglichkeit (was ich zuerst versucht haben) nicht funktioniert ... die erste ist in Ordnung – MiniScalope

Verwandte Themen