2009-04-22 17 views
8

ブーストスレッドを作成しました: boost :: thread thrd(& connectionThread);ここで、connectionThreadは単純なvoid関数です。C++ブーストスレッドを1秒間待機させる

boost::xtime xt; 

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

xt.sec += 1; 

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

プログラムはxtime_getラインでクラッシュ:私はそれを使用して、たとえば、数秒待つ作るしようとすると、これは、しかし、正常に動作します。手動でxt.secを設定しようとしても、動作しません。私はいくつかの方法を試しましたが、動作させることができません。私が間違っていることはありますか?私の目標を達成するためのより簡単な方法はありますか?

+2

詳細informatイオンが必要です - これはxtime_get行でクラッシュしますか?もしそうなら、手動でxtを設定するとクラッシュするのですか? –

+0

手動でxt.secを設定しようとすると、どのように動作しませんか? xt.sec = 1はおそらく非常に短い時間ですが、秒は少なくともミリ秒であると思います。もしそうなら、あなたは1ミリ秒間眠ります。 – Skurmedel

+3

http://www.boost.org/doc/libs/1_38_0/doc/html/thread/time.html#thread.time.system_timeライブラリの最新バージョンがboost ::のコンポーネントを使用しているように見えますdate_time - 期間を指定します。 – Skurmedel

答えて

0

このコードでは(たとえば、どこに置いたかわからない)、xtime_getメソッドが返されるメジャーのタイプを返すとしか言いようがありません。それは以下のアサートが保持するたとえば、あなたが確認する必要があり、次のとおりです。

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

あなたのシステムでこれがそうでないことが起こり得ます。

しかし、コードをもう一度見てみると、クラッシュが特にこの呼び出しに関連しているとは限りませんが、アプリケーションで他のことをしていることが考えられます。ここでも、このコードを使用している場所によって異なります。あなたのスレッドのoperator()の中にありますか?

2

boost::xtime_get()は、ヘッダーに実装されていない数少ないBoost APIのように見えるので、Boostライブラリが正しくコンパイルされていない可能性があります。これはおそらく、ミスマッチな呼び出し規約や何かを持つsomelikeです。ライブラリを再構築するためにどのようなステップを経なければならないかもしれないか、頭の上からわかりません。私が今までBoostで使ってきたのは、ヘッダだけを必要とするものでした。

アセンブリレベルであってもxtime_get()ルーチンをトレースするだけの方が役に立ちます。 xtime構造体は非常に基本的で、xtime_get()は、xtime構造体にプラグインするための番号を取得するためにプラットフォーム固有のAPIを呼び出す以外に何もしません。

26

簡単な方法

たぶん

があり、これらの線に沿って何か:

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

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

+1

あなたの第2の方法(私が最初に試したこと)は何ですか? – MiniScalope

関連する問題