web-dev-qa-db-ja.com

Win 32のC ++でプログラムをどのようにスリープさせるのですか?

Win 32上のC++でプログラムをどのように「一時停止」し、どのライブラリを含める必要がありますか?

19
Chris_45
#include <windows.h>

Sleep(number of milliseconds);

または、別のプログラムを待機している間にプログラムを一時停止したい場合は、 WaitForSingleObject を使用します。

26
IVlad

ブーストを使用している場合は、thread::sleep 関数:

#include <boost/thread/thread.hpp>
boost::system_time time = boost::get_system_time();
time += boost::posix_time::seconds(1);
boost::thread::sleep(time); 

それ以外の場合は、win32 apiを使用する必要があります。

#include <windows.h>
Sleep(1000);

そして、どうやら、C++ 0xには次のものが含まれています。

#include <thread>
std::this_thread::sleep_for(chrono::seconds(1));
8
John Gietzen

C++ 11では、これを標準ライブラリ機能で行うことができます。

#include <chrono>
#include <thread>
std::this_thread::sleep_for(std::chrono::milliseconds(x));
4
Yochai Timmer

「一時停止」している間もプログラムを応答させたい場合は、タイマーイベントを使用する必要があります。

1
Tronic

上記のコードは、Code :: Blocks 12.11およびVisual Studio 2012でテストされていることに注意してください。
Windows 7の場合。

プログラムを強制的に停止または待機するには、いくつかのオプションがあります:


  • sleep(unsigned int)

値はミリ秒単位の正の整数でなければなりません。つまり、プログラムを2秒間待機させる場合は、2000と入力します。

次に例を示します。

#include <iostream>     //for using cout
#include <stdlib.h>     //for using the function sleep

using namespace std;    //for using cout

int main(void)         
{
   cout << "test" << endl;
   sleep(5000);         //make the programme waiting for 5 secondes
   cout << "test" << endl;
   sleep(2000);         // wait for 2 secondes before closing

   return 0;
}

時間がかかりすぎる場合は、パラメータが秒単位であることを意味します。だからそれをそのように変更してください:

sleep(5);

エラーメッセージまたはスリープの使用に関する問題が発生した場合は、特にCode :: Bloksで_sleepまたはSleepに置き換えてみてください。
それでも問題が解決しない場合は、コードの開始時にこのライブラリを1つ追加してみてください。

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <dos.h>
#include <windows.h>

  • system( "PAUSE")

Windowsコンソールアプリケーションの単純な「Hello World」プログラムは、何かが表示される前に終了する可能性があります。 system( "Pause")を使用できる場合。

#include <iostream>    

using namespace std;   

int main(void)         
{
    cout << "Hello world!" << endl;

    system("PAUSE");

    return 0;
}

「エラー: 'システム'はこのスコープで宣言されていません」というメッセージが表示された場合は、コードの先頭に次の行を追加してください。

#include <cstdlib>

  • cin.ignore()

Cin.ignore()を使用して同じ結果を得ることができます:

#include <iostream>     

using namespace std;    

int main(void)         
{
    cout << "Hello world!" << endl;

    cin.ignore();

    return 0;
}

  • cin.get()

例:

#include <iostream>     

using namespace std;    

int main(void)         
{
    cout << "Hello world!" << endl;

    cin.get();

    return 0;
}

  • getch()

ライブラリconio.hを追加することを忘れないでください:

#include <iostream>     
#include <conio.h>    //for using the function getch()

using namespace std;    

int main(void)
{

    cout << "Hello world!" << endl;

    getch();

    return 0;
}

Getchの代わりに_getch()を使用するように指示するメッセージを表示できます

1
borderless

使用しているフレームワークによって提供されていない場合は、GUIでスリープ関数を使用しないでください。これにより、データへの参照の問題が発生する可能性があります(特にメインスレッドではないスレッドで)。これにより、GUIがフリーズする可能性があります。短時間の睡眠の問題だけでなく、必要な場合はwaitmutexesを使用してください。

0
yan bellavance

それはあなたが書いているプログラムのタイプに依存します。

コンソールアプリはスリープを呼び出すだけです。 GUIアプリはおそらくnotを実行します。これは、すべてのメニューとウィジェットが反応しなくなり、この期間中にアプリが再描画されないためです。代わりに、有効期限が切れたときにコールバックを使用してタイマーを設定するなどの操作を行う必要があります。

0
T.E.D.