ご指導お願いします。
WIN XP、Visual Statio2005VC++を使用しています。
現在、タイマー処理についてプログラムしています。
内容はカメラを使用して撮影ボタンを押下後、0.5s待ってから撮影を開始させて
0.3s間撮影し、1s待つ(撮影中断)という動作を6回繰り返すというものです。
調べてみましたが、数秒間停止というサンプルはあるのですが、数秒間動作させるとい
うサンプルが見つかりませんでした。
一応、
void CXXXDlg::OnRecordSaveHD()
{
int timeCount = 0;
timeCount = GetTickCount();
Sleep(500);
m_Execute_Record //撮影
正直言うとここまでしか分りません。
0.3s間だけ撮影の方法を教えてください。
できたら、6回繰り返しの方法も教えていただけるとありがたいです。
よろしくお願いします。
単純にSetTimerで出来るような気はしますが…
タイマの精度の話は別として...
「n秒間動作させる」 -> 「起動してn秒後に停止させる」
と考えを変えればいいのでは。
n秒の計測は、みるさんの書いているとおり、
> 単純にSetTimerで出来るような気はしますが…
という方法があります。
みるさん、maruさん
返信ありがとうございます。
考えてみました。
void CXXXDlg::OnRecordSaveHD()
{
int timeCount = 0;
int a = 0;
timeCount = GetTickCount();
Sleep(500); //0.5秒待ち
while(a==6){
m_Execute_Record = TRUE; //撮影
::SetTimer(hwnd,nIDEvent,300,NULL) //0.3秒後に撮影停止
m_Execute_Record = FALSE; //撮影停止
sleep(1000); //1秒待ち
a = a+1;
}
これでカメラを使用して撮影ボタンを押下後、0.5s待ってから撮影を開始させて
0.3s間撮影し、1s待つ(撮影中断)という動作を6回繰り返すというコードに
なりますか?
SetTimerの説明は読まれましたか?
int a = 0;
while(a==6){
:
:
a = a+1;
}
…動きますか?
maruさん、悠さん
返信ありがとうございます。
maruさん
SetTimerの説明は読みました。使い方が違いますか?
悠さん
コンパイルは通りますが、意図した動作はしませんでした。
Windowsは、for文・while文等で100mSよりも多く待ってはいけません。
Sleep関数を使用した場合も、100mSよりも多い場合はウインドウを持たない
ワーカスレッドに限るみたいです。
# 100mSはヘルプにはでて来ません。あくまでも僕の経験上の目安です。
# ウィンドウには100mSルールというものもあるみたいです。
但し、SetTimer,WaitForSingleObjet等の関数を使用している場合は大丈夫です。
なぜなら、その関数を使用した場合、その時間内ウインドウはそのスレッドを
無視します。
# DOS,UNIXでソフトを組んでいるとよく陥りやすいミスですね。
# 僕もDOS派でしたから苦労しました。
ITOさん
レスありがとうございます。
WaitForSingleObjetについて調べてみましたが詳しく載っていませんでした。
具体的なコーディングをご教授いただけると幸いです。
WaitForSingleObje「c」tで調べなおすこと!
> SetTimerの説明は読みました。使い方が違いますか?
SetTimerの説明を読んだ上で、自分のコードに全く違和感を感じていないとしたら、
Windowsプログラミングのイベントドリブンの仕組みを全く分かっていないようですね。
もう少し勉強してからWindowsプログラミングについて勉強してからプログラミングする
ことをお勧めします。
> コンパイルは通りますが、意図した動作はしませんでした。
それ以前にC言語の構文についても理解が不足しているようです。
この程度の知識では、目的とする動作を行なうプログラムを作成する事は困難です。
質問以前にC言語について勉強することをお勧めします。
まっつんさんとマイクさんが同一人物だとして、
ハンドルをコロコロ変えないようにした方がいいです。
読んでいる側が混乱します。
確か0.1秒ルールと言ったと思います。
Web上を調べればどこかに載っていたはず。
>SetTimerの説明は読みました。使い方が違いますか?
間違ってます。
多分、SetTimerの使用方法が理解出来ていません。
特に書いていないので想像ですが、
MFCを使っているとして
SetTimerに渡しているhwndって何処からもって来ているの? とか
ウインドウメッセージに関してちゃんと理解してますか? とか。
多分、Windowsの基本的な動作の仕組みとかの知識が足りない為だと
思います。その辺の勉強を一度されたほうがよろしいと思います。
一般的には「猫でもわかるプログラミング」のHPで勉強するパターンが
多いかなと思います。書籍でもこのシリーズは出ているので
見た事が無いなら一度読んでみては?
あーさんフォロー有難うございます。
WaitForSingleObjectですね(^^;
皆様
レスありがとうございます。
PATIOさん
>SetTimerに渡しているhwndって何処からもって来ているの?
GetSafeHwnd()です。
確かに勉強不足で申し訳ないです。
ご迷惑お掛けしますが、もう少しだけお付き合いください。
>ITOさん 2008/04/02(水) 09:48:00
>SetTimer,WaitForSingleObjet等の関数を使用している場合は大丈夫です
ちょっとこれだと誤解するかと…。
二種類の方法がごちゃまぜですし、後者はウィンドウを持つスレッドで使えない事
を見落としそうです。WaitFor…とSleepは待機のみに使う場合はほぼ同じ性質
で、問題無いわけでは有りません。
そもそも時間の長さに関わらず、ループで時間経過を待つようなプログラムは基
本的に避けるべきだと思いますがどうでしょう。
>まっつん さん
基本的なことが判っていないまま無理に進めるってのは良く無い気もしますが…
最初にC/C++についての理解も必要ですが
・イベントドリブン
・コールバック
この二つの意味と目的を理解しないと目的の動作は多分記述できません。
また、
・マルチスレッド
・ワーカスレッド
についても学んだ方がいいでしょう。
今出てきている範囲では問題になっていませんが、多分確実にこの問題にもブチ
当たるので。
ちなみに、スレッドの概念を理解すればSetTimer以外の選択肢も出てきます。
これらの言葉のさす概念を説明するには掲示板は余り向きませんし、洗練され
た説明も得難いので、自分で調べてみてください。
単語で調べれば多分沢山解説サイトが出てくるかと思います。