- ベストアンサー
Sleep命令で指定した待機時間が一致しない
プログラムを実行しているとSleep命令で指定した時間と、実際に待機する時間が食い違うケースが発生しています。例えば、 DWORD a = timeGetTime(); Sleep(16); DWORD b = timeGetTime() - a; のようなコードを作成した場合、bの値は31となり、予定の2倍近くウェイト処理を行っています。この原因はOSにあるのでしょうか、それともプログラムにあるのでしょうか。 なお、開発環境はWindows Vista Ultimate、Visutal C++ 2005 SP1です。
- みんなの回答 (2)
- 専門家の回答
関連するQ&A
- Macの自動スリープ
はじめまして。 自動スリープのことについて教えてください。 OS10.3.?にアップデートした頃から環境設定・省エネ設定で、スリープまでの待機時間を設定したにも関わらずモニターのみスリープして本体は起動したままで、スリープしません。 アップルメニューからの命令は実行されるのですが? 今現在はOS10.4.?ですがパンサーの頃からこの問題は引きずっています、どうすれば良いのか何方かご存じありませんか。 使用環境 Power Mac G4MDD( M9309J/A) CPU1.25デュアル メモリー1GB HD80GB
- 締切済み
- Mac
- PHPのSleepについて
PHPでTwitterでメンションされたら自動返信するプログラムを書いて、Lolipopのcronにて1分間隔で実行されるようにしています。 しかし、どうしても1分間隔だと返信までに時間がかかってしまう場合があり、もう少し間隔を狭くしたいと考えております。 そこで、PHPのSleep関数を使用して 、関数呼び出し→20秒待機→関数呼び出しというプログラムにしました。 (ちなみにLolipopはPHPの処理時間が30秒までに制限されています) ここで疑問なのですが、Sleepの状態でもサーバー側に高い負荷がかかってしまうものなのでしょうか。 このプログラムでも問題ないのか、もしくはやめておいた方がよいのか教えていただけたら幸いです。
- 締切済み
- PHP
- アドレス指定方式での、命令語が参照する番地
16進数で”C13B0206”という32ビットの命令語があります。 <命令語の仕様> 0~7ビット:命令指示部 8~10ビット:レジスタ 11~15ビット:アドレス修飾部 16~31ビット:番地 <アドレス修飾と参照番地の関係> 00 0固定 直接アドレス (11,12の値が00、13~15の値が0固定のとき、直接アドレス。) 01 0固定 間接アドレス 10 インデックスレジスタ インデックスレジスタ+番地の値 11 インデックスレジスタ インデックスレジスタ+番地が示す内容の値 <主記憶、レジスタの状態> ●主記憶に格納されている値(16進数) 番地(16進数)が 202,203,204,205,206,208,209,20A...の順に、それぞれの格納値は、 203,204,205,206,208,209,20A,20B...。 ●インデックスレジスタに格納されている値(16進数) インデックスレジスタ番号(16進数)が1,2,3,4,5… の順に、それぞれの格納値は、 0,1,2,3,4…。 (1) アドレス修飾部のインデックスレジスタ番号。 命令語の”C13B0206”で、アドレス修飾部にあたるのが”3B”。00111011(2進数)。8~10ビットの001がレジスタになるから、3。 (2)命令の番地部の番地の値(16進数) 命令の番地部の番地の値。命令部では、”0206”。ちょうど16進数なので、206。 (3) 命令が最終的に参照する番地。 上の、<主記憶、レジスタの状態>より、11~15ビットが”1011”。 インデックス番号が11(2進数)なので、3(16進数)。インデックスレジスタ番号が3のとき、格納されているのは2。番地の値である206と3を合わせ、209。 最終的に参照される番地は209。 (1)(2)(3)、自分の解き方が正しいのかどうか自信がありません。どなたか補足、訂正などありましたら、よろしくお願いいたします。
- ベストアンサー
- その他([技術者向] コンピューター)
- Active Perlでsleepを使う。
OS:Windows XP Home Edition インタプリタ:Active Perl(v5.8.8 built for MSWin32-x86-multi-thread) 簡単なスクリプトを作っていたのですが、 sleepについて質問があります。 #!/usr/bin/perl $a = 3; $b = 4; if($a > $b){ print "aが大きい"; } else{ print "bが大きい"; sleep(20); } このようなプログラムを書いたとき、 「bが大きい」が20秒遅れて表示されるのは 正しいですか? 私は「bが大きい」が表示されてから、20秒待つように 思えるのですが、実際の動きは「bが大きい」が20秒遅れて 表示されます。
- ベストアンサー
- Perl
- timeGetTimeについて
宜しくお願いします。 http://www.tsg.ne.jp/sept/prg/memo/timegettime.asp 上記のサイトを参照してtimeGetTimeを利用して実行時間の計測をしています。 このサイトにはmmsystem.hをインクルード,winmm.libとリンクしデータ型はDWORD型とあります。 しかし,そうしなくともwindows.hをインクルードしdouble型でtimeGettime();を読み込んでも値を読み込んでくれます。そしておそらく正確な数値のようなのですが,これでも大丈夫なのでしょうか。また,なぜこれでもできるのでしょうか。 御指南ください。使っているコンパイラはBCCでC言語で組んでいます。
- 締切済み
- C・C++・C#
- sleep関数について
sleep関数について検索したところ、「現在のスレッドの処理を一定時間停止します」と出てきました。 では実際に下記のプログラムでsleepは何をしているのですか? (プログラムはネットで検索したときに出てきたものです) #include #include int main(int argc, char *argv[]) { motor_a_speed(MAX_SPEED); motor_a_dir(fwd); sleep(4); motor_a_dir(rev); sleep(4000); motor_a_dir(brake); return 0; } motor_a_speed(),motor_a_dir()の意味はわかります。 スピードや方向を指定した後に処理を一定時間停止・・・とはどういうことなのでしょうか。 わかる方教えてください。
- ベストアンサー
- C・C++・C#
- マルチスレッドプログラム
いつもお世話になっております。 今回はマルチスレッドプログラムについてお聞きしたいです。 マルチコアCPUを使ってたとえば下記のようなことをしたいときに for (int i = 0; i < 1000000; i++) { sum += i; } このまま計算するよりもいくつかスレッドを作って、計算量を分散させてから最後に足してやるほうが早いと思いまして、 現在Core2Quadが手元にありましたのでスレッドを4つ作って スレッド1で0から250000まで スレッド2で250001から500000まで スレッド3と4も同様にして実際にやってみたのですが スレッドなしの状態よりも倍くらい時間がかかってしまうようになってしまいました。 計算結果は同じになり、CPU使用率もシングル時が25%、マルチ時が100%になっているので意図したようにはできていると思います。 GetProcessAffinityMaskを使って、各スレッドにひとつづつコアを割り当てても同様でした。 実際に時間が4分の1に近くなると思っていたのですが2倍かかってしまったので不思議です。 どなたか上記のことを思惑通りに動かせそうな方法をご存知の方はご教授願います。 プログラムは全部は無理ですが重要そうなところは下記のとおりです。 スレッド作成部分 { DWORD dwStart = ::timeGetTime(); _thread_handle[0] = (HANDLE)::_beginthreadex(NULL, 0, thread_first, NULL, CREATE_SUSPENDED, &_thread_first_id); _thread_handle[1] = (HANDLE)::_beginthreadex(NULL, 0, thread_second, NULL, CREATE_SUSPENDED, &_thread_second_id); _thread_handle[2] = (HANDLE)::_beginthreadex(NULL, 0, thread_third, NULL, CREATE_SUSPENDED, &_thread_third_id); _thread_handle[3] = (HANDLE)::_beginthreadex(NULL, 0, thread_forth, NULL, CREATE_SUSPENDED, &_thread_forth_id); for (int num = 0; num < 4; num++) { ::ResumeThread(_thread_handle[num]); } ::WaitForMultipleObjects(4, _thread_handle, TRUE, INFINITE); for (num = 0; num < 4; num++) { ::CloseHandle(_thread_handle[num]); } DWORD dwEnd = ::timeGetTime(); } 各スレッド部分 { HANDLE hCurrent = ::GetCurrentProcess(); DWORD pamask, samask, patmp = 0; int nRet = ::SetProcessAffinityMask(hCurrent, 0x0001); ::GetProcessAffinityMask(hCurrent, &pamask, &samask); DWORD dwStart = ::timeGetTime(); _result1 = 0; for (int multi = 0; multi < _multi; multi++) { for (DWORD i = 0; i < 100000/4; i++) { _result1 += i; } } DWORD dwEnd = ::timeGetTime(); time1 = dwEnd - dwStart; ::_endthread(); return 0; } 開発環境は WindowsXP SP3 VisualStudio6.0 ATL/WTLです。
- 締切済み
- C・C++・C#
- ハイパースレッディングの命令の読み込み
ハイパースレッディングは空き時間を活用して、2つのCPUがあるように見せる技術である。 CPUの動作として 1.命令の取り出し 2.命令の解釈(デコード) 3.命令の実行 がある。 ハイパースレッディングは命令の取り出しをどうしているのか。 例えば、2つのジョブA,BがハイパースレッディングのCPU上で動作しているとき 命令語長をsとする。 1回目の命令の取り出しはAのa番地から行い、2番目の命令の取り出しはBのb番地から、 3回目の命令の取り出しはAのa+s番地から行い、4番目の命令の取り出しはBのb+s番地から、 5回目の命令の取り出しはAのa+2s番地から行い、6番目の命令の取り出しはBのb+2s番地から、 と交互に取り出すのでしょうか。 それとも、「命令の取り出し口」が2つあるのでしょうか。 わかっている方がおりましたら、教えて下さい。
- ベストアンサー
- その他(パソコン)
お礼
timeBeginPeriodをプログラムに編入したところ、Sleepの待機時間が正確になりました。MSDNのSleep()の項目では一切言及されていなかったので、MrBanさんの回答がなければ解決することはできなかったでしょう。ありがとうございます。