初めて、このような場で質問させて頂きます。
至らない点が多々あるかと思いますが、よろしくお願いします。
現在、C++で機器を制御するDLL(仕様にてMFCは不可)を作成しております。
作成した、DLLのテストの為、自分でMFC&SDKにて2つGUIを作成しました。
その結果タイマーは正常に動きました。
その後、本物のGUI(C#)から動かしたところ、タイマーが動きませんでした。
DLLの為、TIMERPROCを使用しております。
理由がわかりません。
ご教授よろしくお願いします。
開発環境:WinXP pro SP2、 .NET2003
// タイマー開始
gTimerID = SetTimer(NULL, NULL, 1000, TimerProc);
// 実処理
VOID CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
// 各処理
}
C#から起動した場合、SetTimerの戻り値は0ではなくちゃんと値が入ってました。
TimerProcに入ってすぐ、ログを出力するコードを記述してあるのですが、ログは
出力されませんでした。MFCで作成したGUIではログは出力されています。
> DLLの為、TIMERPROCを使用しております。
念のため確認しますが、TIMERPROCであろうと、メッセージループがないと
タイマが動かないわけですが、そこはOKですか。
<MSDN>
したがって、WM_TIMER メッセージを処理する代わりに TimerProc 関数を使う場合も、
呼び出し側スレッド内でメッセージをディスパッチ(転送)する必要があります。
</MSDN>
Ban 様
ご返答ありがとうございます。
自分は、ど素人なもので、ご指摘の内容はとくに意識しておりませんでした。
(MSDNのヘルプは見ていたのですが)
// DLL
void WINAPI HogeHoge( void ) {
gTimerID = SetTimer(NULL, NULL, 1000, TimerProc);
}
自分で作成したGUI(MFC)から上記のHogeHogeを一度コールするだけで、
1秒ごとにTimerProc内の処理が行われていたのですが、C#の方ではダメでした。
C#の方は、exeのみの提供である為、ソースは分かりません。
(もちろんHogeHogeはコールされていますが。)
C#からもHogeHogeを一度コールすれば、同じようにTimerProc内の処理が1秒毎に
行われると思っていたのですが・・・
全く的外れな事をしているのでしょうか?
よろしくお願い致します。
----------SetTimer(MSDN)----------
タイマーメッセージを処理するには、ウィンドウプロシージャに WM_TIMER メッセー
ジ処理ルーチンを記述するか、または、TimerProc コールバック関数を用意しま
す。
TimerProc コールバック関数を利用する場合も、呼び出し側スレッドでメッセー
ジをディスパッチ (転送) する必要があります。これは、デフォルトウィンドウプロ
シージャがコールバック関数を呼び出すからです。
----------SetTimer(MSDN)----------
恐らく、HogeHogeを呼び出したスレッドにはメッセージループが無かったか、
HogeHogeを呼び出した後に一瞬で終了したのでは無いでしょうか。
呼び出し側プロセスを変更できないのならば、自前でスレッドを作る必要があり
そうです。
方法1、SetTimerした後メッセージループだけ行うスレッドを自分で作る。
方法2、Sleep等で休止するスレッドを自分で作り、SetTimerは使わない。
辺りでしょうか。
麩 様
ご回答ありがとうございました。
>恐らく、HogeHogeを呼び出したスレッドにはメッセージループが無かったか、
>HogeHogeを呼び出した後に一瞬で終了したのでは無いでしょうか。
ご指摘の通り、C#のGUI側にはメッセージループがなかったようです。
GUI側で対応するか、DLL側で対応するかは、現在検討中ですが
問題が解決致しましたので、これで閉めさせて頂きます。
皆様ありがとうございました。