マイクロ秒で精度が出るタイマーってご存知ではないでしょうか?
ご存知ならご教授おねがいします。

・環境
OS:XP
使用言語:C、C++
その他:API32使用

よろしくお願いします。

A 回答 (3件)

>実は業務で連続的に16bitのデータを送る通信システムを作成しているのですが、その送信するデータとデータの間のインターバル的な時間をマイクロ秒単位で管理したいのです。


>守秘義務が絡むのであまり詳しくお話できなくて申し訳ありません。。。

インターバルタイムが最低限の時間(オーバーを許容)なら問題ないと思いますが、そのインターバルタイムを死守しないとマズイならWindowsOSでは無理ですので、別のOSで特にリアルタイム性がメインのリアルタイムオペレーティングシステム(RTOS)を捜すべきだと思います。
http://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%A2% …

インターバルタイムのオーバーが許容されても、QueryPerformanceCounterとPerformanceCounterは最近のCPUのターボ・ブーストなどのためで不正確になっています。
ターボ・ブーストとは。
http://www.pasonisan.com/customnavi/cpu_corei/10 …
最近のCPUの場合はこのターボ・ブーストの動作状況次第でQueryPerformanceCounterの値が実際の経過時間とズレてしまうのです。
なので、ブーストしないCPUなどの選択も考えないといけないでしょう。

QueryPerformanceCounterを実時間計測には使えない
http://d.hatena.ne.jp/shiku_otomiya/20100218/p1

あるいは、タイマカウントーを外部のマイコンに任せるとか通信自体を外部のマイコンにさせるとかすれば正確な動作は期待できます。
    • good
    • 0
この回答へのお礼

ご返事ありがとうございます。

どうやらWindowsOS単体では実装は難しそうですね。。。
ある程度のオーバーは許容範囲なので現状のままで行きたいと思います。
それでも厳しくなりましたら教えていただいたURLを参考に、機材、環境レベルでアプローチしてみたいと思います。

ありがとうございました。

お礼日時:2011/04/20 17:29

Win32のQueryPerformanceCounterをつかうしかないかな?


http://support.microsoft.com/default.aspx?scid=k …
    • good
    • 0
この回答へのお礼

ご返事ありがとうございます。

URLを参考に自分でも調べてみようと思います。

ありがとうございました。

お礼日時:2011/04/20 11:23

たとえタイマーがマイクロ秒単位の精度が出たとしてもマルチタスクOSであるXPが勝手に一定時間ごとにタスクを切り替えるので意味ないと思いますが?


標準的なWindowsにはOSの制約から使い物になるマイクロ秒単位のタイマーは無いと思います。

PerformanceCounterを使っても昨今の動的にクロックをブーストするCPUやマルチコアCPUのお陰でまともに計測できませんし。

なぜ必要なのかを、まず説明してもらうと答えが得られやすいと思います。
    • good
    • 1
この回答へのお礼

ご返事ありがとうございます。

実は業務で連続的に16bitのデータを送る通信システムを作成しているのですが、その送信するデータとデータの間のインターバル的な時間をマイクロ秒単位で管理したいのです。
守秘義務が絡むのであまり詳しくお話できなくて申し訳ありません。。。

お礼日時:2011/04/20 11:21

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qマイクロ秒をはかる

Linuxではそういう関数があるようなのですが
Windowsでマイクロ秒を測定することは無理なのでしょうか?
(ミリ秒のはかり方は調べたら出てきました。)


よろしくお願いします。

Aベストアンサー

QueryPerformanceCounter でがんばる。

但し、かなりハード寄りの知識が要求され、制限もあり、
Windows はリアルタイム性を保証しないので、たいていの場合計測誤差で終わる。
このクラスになると、計測することでかかる負荷でも…。

Windows ではできないものと考えて、要件の方を再検討するのがお勧めです。
ちなみに用途はなんでしょうか?
ユーザインターフェイスなら人間には体感できず無駄ですし、
機器とのインターフェイスなら Windows アプリには保証ができず、
専用の RTOS やドライバなどを検討すべきです。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QC# インスタンスの破棄

C#でインスタンスの破棄を明示的に行いたいのですが、
実際の開発現場では、どのように行っているのでしょうか?

自分で調べると「ガベージコレクタ」が暗黙的に行っているようですが明示的には行わないのが普通なのでしょうか?
もしくは、「Dispose」を使用して明示的に行うのが普通なのでしょうか?

実際に開発されている方からすると簡単な事かもしれませんが教えて頂けると助かります。

以上ですが、よろしくお願いいたします。

Aベストアンサー

結論から言うと、どちらでも良いです。
できれば生成から破棄まで考えて開発できると良いですね。

ガベージコレクションが実行されることで自動開放されますから、
一切.close()や.dispose()を使わなかったとしてもプログラムが
不正終了してしまう事はほとんどありません。

実際の開発では使わなくなったものを使わなくなった時点で
明示的に破棄することが多いです。正確には明示的に破棄するもの、
明示的に破棄しないもの、の2種類に分類しています。

例えばファイルを読み書きするストリーム系のオブジェクトや
データベースとのコネクションなどです。これは開発会社や
開発チーム、案件によって若干違っていて、徹底するところや
適当なところもあります。個人的には徹底したい派ですが。。。

ガベージコレクションが発生するとプログラムの実行動作が
遅くなり、また瞬間的に大きな負担がかかることがあります。
そのため全てをガベージコレクタに任せるのではなく、
明示的に開放できるもの、メモリを大量に消費するものは
その都度、適切に開放していくことで処理効率が良くなります。

プログラミング関連の調べ物で、サンプルソース等を見ることが
あるかと思います。この時サンプルで明示的に開放していたら、
それは明示的に開放したほうが良いもの、と思いましょう。
これだけでもステップアップになりますね。

結論から言うと、どちらでも良いです。
できれば生成から破棄まで考えて開発できると良いですね。

ガベージコレクションが実行されることで自動開放されますから、
一切.close()や.dispose()を使わなかったとしてもプログラムが
不正終了してしまう事はほとんどありません。

実際の開発では使わなくなったものを使わなくなった時点で
明示的に破棄することが多いです。正確には明示的に破棄するもの、
明示的に破棄しないもの、の2種類に分類しています。

例えばファイルを読み書きするストリーム...続きを読む

QVisual C#でストップウォッチ機能を使うには

Windowsフォームアプリでストップウォッチの機能を使いたいのですが

( 1 ) 表示の機能として、デジタル数字が0.1秒単位で進んでいく様子をLabel等に表示させるには?

( 2 ) 内部の機能として、Button等でスタート、ストップ、リセットを行うには?


( 2 )については、StopwatchクラスのStopとStartメソッドを用いるというのまでは突き止めましたがここまでは正しいでしょうか。Buttonクリックイベントハンドラとインスタンス化とメソッド使用方法自体は最低限わかります。

Visual C# 2012を使っています。
ほぼ初心者レベルなので最低限の用語しか理解できないですが、宜しくお願いします。

Aベストアンサー

>「タイマーなりスレッドなり」というのはどういう事でしょう?

まず、実験として
ボタンを1個配置して、そこに
Label1.Text = sw.ElapsedMilliseconds.toString() + " ミリ秒";
を記述して実行

追加したボタンを押すたびに
値が変わる事を確認

逆に言えば、ボタンを押さなきゃ変わらない事を確認したって事なので、
定期的に実行されるイベントに
Label.Text = sw.ElapsedMilliseconds.toString() + " ミリ秒";
を記述すれば良い

で、定期的に実行されるイベントを持つのが
「タイマーなりスレッドなり」と言う事

>タイマーというとTimerコントローラの事ですか?
Timer コントロールの事


>また
>LabelのTextに時間を代入する文はどの位置で何のイベントハンドラーで記入すればいいでしょうか?
がまさに ↓ これ
Label1.Text = sw.ElapsedMilliseconds.toString() + " ミリ秒";

Label1.Text
↑ラベル1のテキストプロパティ に

= sw.ElapsedMilliseconds
↑ストップウォッチの、経過時間(ミリ秒)を


.toString() + " ミリ秒";
↑文字列に変換して、後ろに" ミリ秒"とつけてセットする


この後ろにリフレッシュ関数を付けるほうが良いかも
Label1.Text = sw.ElapsedMilliseconds.toString() + " ミリ秒";
Label1.Refresh();//← Label1 再描画指示

>「タイマーなりスレッドなり」というのはどういう事でしょう?

まず、実験として
ボタンを1個配置して、そこに
Label1.Text = sw.ElapsedMilliseconds.toString() + " ミリ秒";
を記述して実行

追加したボタンを押すたびに
値が変わる事を確認

逆に言えば、ボタンを押さなきゃ変わらない事を確認したって事なので、
定期的に実行されるイベントに
Label.Text = sw.ElapsedMilliseconds.toString() + " ミリ秒";
を記述すれば良い

で、定期的に実行されるイベントを持つのが
「タイマーなりスレッドなり」と...続きを読む

QをVisualStudioでつかえるようにする

<unistd.h>をVisualStudioでつかえるようにしたいのですが、問題なくコンパイルできるようにするにはどうしたらいいでしょうか?

CygwinというやつをインストールしてやってみたのですがやはりVisualStudioだけでコンパイルしてやりたいのですが。。。。

Aベストアンサー

おそらく<unistd.h>をフルスペックで利用したいわけではないと思います。その中の一部の関数を使いたいだけなら<io.h>などで代用できるはずですから、ヘルプで調べてみることをお勧めします。

ソースを修正せずに、コンパイル&実行ができるようにすることは諦めた方がよいと思います。

移植のことを考えるなら、<unistd.h>とか<windows.h>のような環境に特化したヘッダや、そこで宣言される型や関数などを直接使うのではなく、適切にラッピングしてから使う方が後々楽です。今回は仕方ないでしょうが、今後はそうしましょう。

QGetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・

お世話になっています。

iniファイルを読込み、各変数に代入するC言語のDLLを作成したいのです。
このサイトの投稿や、MSDNなどにも載っていたのですが、
少し理解に苦しみます。

現在まで、理解した点がwindows.hのインクルードを
記述するところ辺りです。
iniファイルは下記のようなレイアウトです。

---<mst.ini>----------------------------
[user]
name=username
ID=userid
[pc]
pcname=FMV
----------------------------------------

#include<windows.h>は記述することまでは
分かりましたが、以下から進みません。。。

GetPrivateProfileString("")

初心者で申し訳ありませんが、お助け願います。

Aベストアンサー

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
                sizeof(strBuf),   // 上記のエリアのサイズ
                "mst.ini" );     // iniファイル名

解説:
iniファイル名をフルパスで指定しないとWindowsのディレクトリにあるものと判断されます。
Win9xなら「c:\windows」、WinNT系なら「c:\WinNT」。

[user]セクションのnameキーがないときは、デフォルト値で指定した値が設定させます。

復帰値「dwLen」は実際に設定した値(文字列)の長さが返されます。

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
             ...続きを読む

Qmsec単位のWait Timerが作れない!

引数で渡した値だけ待つ関数を作っているのですが、うまくいきません。

OS:WindowsXP Professional (SP1)
プラットホーム:Visual C++ Ver7
アプリケーション:コンソールタイプ

失敗例1:Sleep()関数を用いた。
結果:15msec以下の設定が出来なかった。
(1/64secの整数倍でないとズレが生じた)

失敗例2:Clock()関数を使って以下のルーチンを作成

void WaitTimer( clock_t wait )
{
register clock_t goal;
goal = clock() + wait;
while( goal > clock());
}
結果:失敗例1と同じ結果。

どうやら(スレッドか何かはわかりませんが)64Hz周期の何かがあるようです。
 
何方か10msec単位(±1msec)のWaitTimerを作ったことがある方、是非ノウハウを教えてください!

Aベストアンサー

既に2の方が回答されていますが

QueryPerformanceCounterとQueryPerformanceFrequencyが
最も高い時間精度を持つ測定用のAPIです。
(GetTickCount等に比べると1回の処理自体は重いです。)

http://homepage1.nifty.com/aok2/04oldpage/win01.html

あと少しでもパフォーマンスをよくするなら
inline展開してはどうでしょう。
inline void WaitTimer( DWORD wait )
{
(略)
}

QueryPerformanceCounter自体にも処理がかかるので
事前にそれらの処理にかかる時間を計算しておき
その値を差し引くとより厳密になるかもしれません。


http://www14.big.or.jp/~ken1/tech/tech19.html

参考URL:http://homepage1.nifty.com/aok2/04oldpage/win01.html,http://www14.big.or.jp/~ken1/tech/tech19.html

既に2の方が回答されていますが

QueryPerformanceCounterとQueryPerformanceFrequencyが
最も高い時間精度を持つ測定用のAPIです。
(GetTickCount等に比べると1回の処理自体は重いです。)

http://homepage1.nifty.com/aok2/04oldpage/win01.html

あと少しでもパフォーマンスをよくするなら
inline展開してはどうでしょう。
inline void WaitTimer( DWORD wait )
{
(略)
}

QueryPerformanceCounter自体にも処理がかかるので
事前にそれらの処理にかかる時間を計算しておき
その値を差し引くと...続きを読む

Qprintf で二進表示を行いたい。

すみません。教えていただきたいことがあります。
printf で普通のintの値をフォーマット指定子を使用して二進表示をしたかったのですが見当たりませんでした。
どうにかintの内容を二進で確認したいのですが、どのようにすれば良いですか?
宜しくお願いします。

Aベストアンサー

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if ( value & bit ){
  putchar('1');
 }
 else{
  putchar('0');
 }
}
printf( " です。\n" );

最後に:
・1バイトが 8 ビットの環境が前提です。→まぁ、普通は 8 ビットですが…。
・上記のサンプルを関数などにすれば使いやすくなります。→print_bin()など
・以上。おわり。

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if...続きを読む

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qstdint.hのint8_tとuint8_tについて

stdint.hのint8_tとuint8_tの
値のとりうる範囲は下記で合っていますでしょうか?

・int8_t
  -128~127

・uint8_t
  0~255

「int8_tは最上位ビットが符号ビットで使われ、
uint8_tは最上位から最下位ビットまで全てを、
値を表現するために使える。」
という考えです。

Aベストアンサー

正しいです。
int8_tはパディングビットが無く2の補数表現である8ビット幅の符号付き整数型のtypedefですから。
# ISO/IEC 9899:1999 7.18.1.1の第1段落


最小値,最大値は,マクロ
INT8_MIN, INT8_MAX, UINT8_MAX
というものがstdint.hのインクルードで定義されます。
# ISO/IEC 9899:1999 7.18.2.1

なので,limits.hのINT_MAXのようなマクロを使いたい場合,上記を使うことができます。
# 当然,INT16_MINやINT32_MAX,UINT64_MAXも,(対応する型があれば) 定義されます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報