タイマー関数とマルチスレッドについて

このQ&Aのポイント
  • マルチスレッドプログラミングにおいて、タイマー関数とマルチスレッドの同期についての質問です。
  • VC++.NETでC言語を利用し、win32 APIを用いてマルチスレッドプログラミングを行っています。
  • スレッドを_beginthreadex関数で2つ生成し、イベント同期を利用して同期を行っています。質問内容は、スレッド2が待機状態のときにタイマーが動作しているかどうかです。
回答を見る
  • ベストアンサー

タイマー関数とマルチスレッドについて

こんばんわ。 マルチスレッドプログラミングを行なっています。 コンパイラはVC++.NETでC言語を利用しwin32 apiを用いています。 スレッドを_beginthreadex関数でスレッドを2つ生成し、WaitForSingleObject,SetEvent,ResetEvent関数によるイベント同期を利用し、2スレッドの同期をはかっています。 [質問内容] 以下のように、スレッド2でWaitForSingleObject関数にてスレッド2を待機状態にし、スレッド1のSetEvent関数にて待機しているスレッド2を再開させる方法をとっています。 例えば、タイマーをスタート後に待機状態になり、スレッド2が再開後タイマーストップするとした場合、スレッド2が待機状態のときもタイマーを動き続けているのでしょうか? ・スレッド1 SetEvent(hEvent[0]); ・スレッド2 SUSPEND_INTERVAL=20 if(Num%THREAD_SUSPEND_INTERVAL==0){ timestart=timeGetTime();←タイマースタート WaitForSingleObject(hEvent[0],INFINITE); ResetEvent(hEvent[0]); timestop=timeGetTime();←タイマーストップ } よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mssine
  • ベストアンサー率24% (38/156)
回答No.1

a=timeGetTime(); Sleep(2000); b=timeGetTime(); printf("b-a=%d\n",b-a); でも動いているので、大丈夫です。

bird0214
質問者

お礼

返信ありがとうございます。 待機していても、タイマー自体は動いているのですね。

関連するQ&A

  • timeBeginPeriodとtimeEndPeriod関数について

    こんにちは。 timeBeginPeriodとtimeEndPeriod関数を用いることで、timeGetTime関数の精度を向上させることができると言うことで、使用してみたいと思っています。timeGetTime関数の精度はデフォルトで5msですが、timeBeginPeriod(1)とすることで精度を1msにできると記載されていたためです。 しかし、timeBeginPeriodおよびEndPeriod関数をどこに宣言すればよいか分かりません。 以下のような記述の仕方でよいのでしょうか?1msに設定しています。 timeBeginPeriod(1); //タイマースタート start=timeGetTime(); //タイマーストップ end=timeGetTime() timeEndPeriod(1); よろしくお願い致します。

  • こんなタイマー探してます

    こんなタイマー探しています。 最初に100時間と設定し、スタートを押すと100時間からどんどん減っていきます。 途中、ストップを押すととまり、またスタートを押すと再開できる。 こういったフリーソフト(ネットでダウンロード可)を探しています。

  • DSlite用 ゲームタイマーについて

    DS lite用 ヘルスコントローラー ゲームタイマー についてお尋ねします。 どういう商品なのかは調べてわかったのですが、 以下の事が詳しくわかりません。 ご存知の方 教えてください! タイマーをかけて、1時間が経過したら強制シャットダウンの設定をしたいのですが・・ 例えば・・タイマーをスタートさせて、30分経った所で一度ゲームの電源を切ります。 何時間後かにゲームを再開させた場合、タイマーもそれに連動して、 ゲームをストップさせたらタイマーも一時停止、再開させたらタイマーも再開・・となるのでしょうか?

  • マルチスレッドプログラミングについて

    マルチスレッドプログラミングについていくつか教えて下さい。 マルチスレッドの基礎がまだ分かってないので初心者でも分かり易いようにお願いします。 1:イベントオブジェクトについて教えて下さい。 「イベントオブジェクト」の概念がよく分かりません。 ○シグナル状態と非シグナル状態とはどういう状態なのでしょうか? ○自動リセットの場合ではどのタイミングで切り替わっているのでしょうか?(下記のソースの場合) ○手動リセットの場合ではどのタイミングで切り替えればよいのでしょうか?(下記のソースの場合) 2:CloseHandle() と ExitThread() について教えて下さい。 ○この2つの関数の役割の違いについて教えて下さい。 「スレッドハンドルを閉じる=スレッドを終了」ではないのでしょうか? また、これらの関数実行時にシグナル状態は気にする必要はありますか?(シグナル状態にしなくてよいのか?) 下記のソースは簡略化のためかなり省略されています。 DWORD WINAPI ThreadProc( DWORD i ) { while( true ) { DWORD r = WaitForMultipleObjects( 2, hEvent, FALSE, INFINITE ); if( r == WAIT_OBJECT_0 ) { // 処理1 } else if( r == WAIT_OBJECT_0 ) { // 処理2 } else { ExitThread( TRUE ); // スレッド終了 } } } void MainProc() { // 自動リセットのイベントオブジェクト作成 for( int i=0; i<2; i++ ) { hEvent[i] = CreateEvent( NULL, FALSE, FALSE, NULL ); } // スレッドを作成 hThread = CreateThread( NULL, 0, ThreadProc, NULL, 0, &dwThreadID ); }

  • スレッドについて

    スレッドについて勉強中なのですが、簡単なスレッド作り、 スレッドの処理が終わってからメインの処理を行わせたくて 以下のようなプログラムを書いてみました。 そこで、WaitForSingleObjectを使ってスレッドが終了するのを 待ちたいのですが、WaitForSingleObjectではまってしまうようで sprintfのメッセージ(スレッドが止まってしまっている)が 表示されません。 WRITE関数の処理が終われば、、WaitForSingleObjectで処理が 戻ってくると考えているのですが…。 スレッドについてと、間違いについて教えてもらえないでしょうか? 宜しくお願いします。 main { if(!stop) {   File = CreateFile(...); g_hThead = CreateThread(NULL,0,WRITE,(LPVOID)NULL,0,NULL); g_stop = false; }else { g_stop = true; ::WaitForSingleObject(g_hThead, INFINITE); CloseHandle(File); CloseHandle(hThead ); } } void WRITE() { while(!g_stop) { WriteFile(...); } ...処理を行う sprintf("スレッドを終了します。") }

  • メインスレッドのPostMessageとマルチスレッドでの処理

    お世話になります、fujicafeと申します。 現在Visual Studio 2005にてVC++のプログラムの作成をしており、 お聞きしたいことがありまして、こちらにて投稿させていただきました。 質問したい内容はPostMessageによる非同期呼び出しによるメインスレッド関数の処理と、別スレッドからのメインスレッド関数呼び出しによる処理の違いについてです。 現在、メインスレッドにマルチメディアタイマーを使って、ある時間間隔毎にメインスレッドの関数を呼び出しています。その関数の呼び出しにはPostMessageを使用しています。 その関数の呼び出しをAfxBeginThreadを使用して、メインスレッドから別スレッドを作成し、その別スレッド内にてメインスレッドのオブジェクトを作成して、実行したいメインスレッドの関数を呼び出すと、もともとのPostMessageを使用して関数を呼び出すのとでは処理としてどのような違いがあるのでしょうか? スレッドを別にするということで、メインスレッド側に負荷をかけないといったことが違うのでしょうか? だいぶ検討はずれの質問かとは思いますが、ご教授よろしくお願いいたします。

  • CPU資源をなるべく消費しないでイベントを待機する

    こんにちは。 VC++2008Exressを使用して、以下のようなプログラムを作成したいと思います。 初心者で、どうやって作成すれば良いのか悩んでおります。 参考になるものなどありましたら、ご教授ください。 Windowsアプリケーション Win32API メッセージループ内でWaitForSingleObjectなどのイベントを待機する関数を使用して イベントを待つようにしたいのですが メッセージループ内でメッセージも待機できイベントも待機できるような方法はないでしょうか? 今のところ、実現はしておりませんが検討しているのは メッセージ待機用のスレッドを作成して、GetMessageで待機して メッセージがきたら、SetEvent関数でメインのメッセージループ内の WaitForSingleObjectを返す。 また、別のメッセージ以外のイベントを監視するスレッドを作成して WaitForSingleObjectで監視してイベントが来たら、さきと同じイベントを SetEvent関数を使用しメインのメッセージループ内のWaitForSingleObjectを返す。 という感じでメッセージとイベントをメッセージループ内で監視するようにするしか 分かりません。 その他、簡単な関数で実現可能なものなどありませんでしょうか? WaitForMultiObjectsとか、MsgWaitForMultiObjectsやら調べてみましたが、いまいち使い方が。。。。 また、スレッドは監視イベントが来るたびに終了させた方がよいのでしょうか? それでは、またスレッド作成を繰り返すので効率悪い気がします。 無限ループで監視させた方が良いのではと思いますが、CPU資源的には・・・。 というようなことで悩んでおります。 どうか、ご教授ください。よろしくお願いします。

  • WaitForSinbleObjectについて

    こんにちは。 現在VC++6.0でスレッドを用いたプログラムを行っています。 GUIでSTARTボタンを押すと、ワーカースレッドが起動し特定量の処理を開始します。(例えば100件のファイルコピーなど) 100件の処理が完了したらワーカースレッドは終了する。 GUIでSTOPボタンを押したときにフラグを立てて、ワーカースレッド内でそのフラグが立っていたら処理を抜けてスレッドを終了させることもできるようにしたいと考えています。 このワーカースレッドの終了のことで疑問があります。 STOPボタンを押してフラグを立てたあとにWaitForSingleObjectでスレッドの終了を待とうと思っていますが、このSTOPボタンを押したタイミングと、100件のファイルコピーが終わりワーカースレッドが自分で終了するタイミングとがかぶってしまった場合、WaitForSingleObjectで待ちに入った時点で、すでにスレッドが終了してしまっている場合が起こりうるのではないかと考えているのですが、実際にどうなのでしょうか? WaitForSingleObject実行時にすでにスレッドが破棄されていた場合、WaitForSingleObjectはどういう値を返すのでしょうか? 事前にスレッド(スレッドのハンドル)が生きているかどうかを調べる方法はあるのでしょうか? ご存知の方教えてください。 わかりづらい説明で申し訳ありません。

  • WindowAPI スレッドのステータスの取得

    WindowAPI スレッドのステータスの取得 SleepやWaitForSingleObject/WaitForMultipleObjectsの関数を呼び出し スレッドをsleep状態にしたとします(スレッドA)。 その他のスレッドからスレッドAがSleep状態か どうかを確認することはできるでしょうか?

  • WaitForMultipleObjects関数の待機状態から抜けるにはどうすればいいのですか。

    初心者です。XPとVC++ 6.0で開発しています。 シリアル通信プログラムを作成しておりますが、クロスケーブルでPC同士をつないで、片方はハイパーターミナル(以下H)を立ち上げて、もう片方は、作成しているプログラム(以下P)を走らせて通信しようとしています。Pから、Hへの送信はできるのですが、Hを走らせているPCのキーボードをたたいても、Pで受信ができません。WaitForMultipleObjects関数のところで待機状態になったままです。DEBUGの進め方についてアドバイスをいただけますでしょうか。 Pを実行した際には、GetLastError関数がERROR_IO_PENDINGを返しており、IOからのデータ待機状態に入っています。(※P,H共に、COM1,9600bps,8bit,NONEに設定しています。)ご教示お願いいたします。 // PURPOSE: This is the starting point for the Read Thread. DWORD WINAPI StartReadThreadProc(LPVOID lpvParam) { char szInputBuffer[INPUTBUFFERSIZE]; DWORD nNumberOfBytesRead; HANDLE HandlesToWaitFor[3]; DWORD dwHandleSignaled; DWORD fdwEvtMask; OVERLAPPED overlappedRead = {0, 0, 0, 0, NULL}; OVERLAPPED overlappedCommEvent = {0, 0, 0, 0, NULL}; overlappedRead.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL); overlappedCommEvent.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL); // We will be waiting on these objects. このイベントが立つまでRX動作は待機状態になる。 HandlesToWaitFor[0] = g_hCloseEvent1; HandlesToWaitFor[1] = overlappedCommEvent.hEvent; HandlesToWaitFor[2] = overlappedRead.hEvent; // Keep looping until we break out. while (TRUE) { // Wait until some event occurs (data to read; error; stopping). dwHandleSignaled = WaitForMultipleObjects(3,HandlesToWaitFor, FALSE, INFINITE); switch(dwHandleSignaled) { case WAIT_OBJECT_0: // Signal to end the thread. { // Time to exit. } case WAIT_OBJECT_0 + 1: // CommEvent signaled. { // Handle the CommEvent. // Start waiting for the next CommEvent. break; } case WAIT_OBJECT_0 + 2: // Read Event signaled. { // Get the new data! break; } case WAIT_FAILED: // Wait failed. Shouldn't happen. { goto EndReadThread; } default: // This case should never occur. { OutputDebugString("Unexpected Wait return value"); goto EndReadThread; } } // End of switch(dwHandleSignaled). } // End of while(TRUE) loop. // Time to clean up Read Thread. EndReadThread: OutputDebugString("Read thread shutting down\n"); PurgeComm(g_hCommFile1, PURGE_RXABORT | PURGE_RXCLEAR); CloseHandle(overlappedRead.hEvent); CloseHandle(overlappedCommEvent.hEvent); g_dwReadThreadID1 = 0; CloseHandle(g_hReadThread1); g_hReadThread1 = 0; return 0; }

専門家に質問してみよう