SetTimerとの比較も兼ねてtimeSetEvent関連を調べていたのですが
CALLBACKの外部で
timeSetEventの戻り値を保存しておき、必要な時にそのIDを基に
timeKillEventするサンプルは簡単に見つかったのですが
timeKillEventは内部で使ってもいいのでしょうか?
なるべく端折って書くとたとえば
timeBeginPeriod( 8 );
timeSetEvent( 40, 8, TimerProc, 0, TIME_PERIODIC );
とでもした場合に
timeSetEventの重ねがけをしない(するならもうちょっと変更)
という前提で
void CALLBACK TimerProc( UINT ID, UINT, DWORD User, DWORD , DWORD ){
static int d(11);
if ( !--d ){
timeKillEvent(ID);
timeEndPeriod(8);
}
}
的なことをしても問題ないのでしょうか?
(出力やtimeGetTimeなどの関数を付加して実験してみた結果だけだと、問題なく動いているように見えるのですが、実はすぐには分からないような問題が内部的に発生してる可能性はありますか?)
No.1ベストアンサー
- 回答日時:
多分大丈夫でしょう。
timeSetEventのコールバックについての情報ではありませんが、同じマルチメディア系のMidiOutProcコールバック関数について
> アプリケーションでは、EnterCriticalSection、LeaveCriticalSection、
> midiOutLongMsg、midiOutShortMsg, OutputDebugString、PostMessage、
> PostThreadMessage、SetEvent、timeGetSystemTime、timeGetTime、
> timeKillEvent および timeSetEvent を除き、コールバック関数内から
> システム定義関数を呼び出さないようにします。ほかのウェーブ関数を
> 呼び出すと、デッドロックの原因となります。
という解説があります。(MSDN)
逆にいうと記載のtimeKillEvent等は大丈夫ということでしょう。
ただしtimeKillEventを実行したら二度とこのコールバック関数が呼ばれないということは保証できないようです。既にイベントがキューイングされている可能性があるのでそれについては対処しましょう。
お、ほんとだ
MidiOutProcの解説にそういう文章がありますね♪
ありがとうございます!
別の実験で
上記のように使い捨て的な判定するのではなくしておいて
別個に配列にIDを確保しておくようにして、timeSetEventをたくさん連続で呼んだり
timeSetEvent→timeKillEvent→timeSetEvent→timeKillEvent
といったことも試してみて問題はないようなので
(ただ、連続で呼ぶほうはなぜか同じコールバック関数に対して一定の回数以上はできない・・・?というような現象が出ましたが、そんなに何回も呼ぶような設計はそもそもCPUへの影響とかタイミングのとりやすさも含めてあまりやらないで済むほうがいいと思うので)
おそらく、むしろ単発で好きな時に走らせて、用がすんだらすぐに止めるようにしつつ、何度でも呼べることを前提にした設計の方が汎用性があっていいかもしれませんね。
(てかそういうことならスレッドのほうが意味的にあってるかもしれませんw)
作戦はいろいろ考えられますが、いずれにせよありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Windows 10 (続き2)2つのウィンドウ選択時の表示について 3 2023/08/21 22:41
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- Excel(エクセル) ユーザー関数の自動計算(excel2003) 1 2023/02/06 06:46
- その他(ビジネススキル・経営ノウハウ) 在庫管理のこの問題が分かりません。どなたか解説お願いします 2 2022/04/18 18:35
- 数学 在庫管理のこの問題が分かりません。どなたか解説お願いします 4 2022/04/18 22:19
- 数学 在庫管理のこの問題が分かりません。どなたか解説お願いします 2 2022/04/18 22:21
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Access(アクセス) ACSESS初心者です マンション管理をACCESSで出来ないかとチャレンジしています。 リレーショ 3 2022/10/08 11:45
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイルで以下のような...
-
だれがとけるの?
-
C言語 1から20までの逆数の和を...
-
C#,vb.netで業務用アプリ開発と...
-
大量のデータを読み込んで表示...
-
win10で、正確な待ち時間の作り方
-
スタックフレームの消滅
-
c言語
-
VisualStudioでC++クラスを追加...
-
PC画面を録画するプログラムでd...
-
ディスプレイの解像度とマウス...
-
Windows Formアプリからコンソ...
-
Cのdoubleの浮動小数点表示につ...
-
UnityInputSystemによるtouch入...
-
応用情報技術者試験の令和元年...
-
インクリメント演算子のみを用...
-
c言語
-
VisualStudio2022でC言語プログ...
-
写真のプログラムは、1からnま...
-
プログラミング c言語
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
(再質問)エクセルのマクロボ...
-
collection型を引数にしたファ...
-
mとnを入力 mからnまでを加算し...
-
シェルソートのフローチャート...
-
JavaScriptでチャート図を書き...
-
timeSetEventに対するtimeKillE...
-
Excel VBA プログラムを止める...
-
複雑なフローチャート
-
if else文のフローチャート
-
指定した数まで1を出力するフロ...
-
プログラミング
-
アコーディオンメニューにする...
-
汎用機のJCLの入門書ありま...
-
コンソール画面のクリアの方法
-
新しいパソコンのネット設定な...
-
iText セル内での自動改行について
-
ヘッダファイルimage.hとは?
-
Progateの入力画面で使えるショ...
-
cframeworkについて
-
Googleコンソールでサイトマッ...
おすすめ情報