C#でC++のDLLを使用。DLL内でタイマー

[戻る]
sagawa 2008/07/03(木) 20:28:06
初めて、このような場で質問させて頂きます。
至らない点が多々あるかと思いますが、よろしくお願いします。

現在、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ではログは出力されています。

Ban 2008/07/03(木) 23:27:22
> DLLの為、TIMERPROCを使用しております。

念のため確認しますが、TIMERPROCであろうと、メッセージループがないと
タイマが動かないわけですが、そこはOKですか。
<MSDN>
したがって、WM_TIMER メッセージを処理する代わりに TimerProc 関数を使う場合も、
呼び出し側スレッド内でメッセージをディスパッチ(転送)する必要があります。
</MSDN>

sagawa 2008/07/04(金) 11:16:35
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秒毎に
行われると思っていたのですが・・・

全く的外れな事をしているのでしょうか?
よろしくお願い致します。

2008/07/05(土) 04:04:02
----------SetTimer(MSDN)----------
タイマーメッセージを処理するには、ウィンドウプロシージャに WM_TIMER メッセー
ジ処理ルーチンを記述するか、または、TimerProc コールバック関数を用意しま
す。
TimerProc コールバック関数を利用する場合も、呼び出し側スレッドでメッセー
ジをディスパッチ (転送) する必要があります。これは、デフォルトウィンドウプロ
シージャがコールバック関数を呼び出すからです。
----------SetTimer(MSDN)----------

恐らく、HogeHogeを呼び出したスレッドにはメッセージループが無かったか、
HogeHogeを呼び出した後に一瞬で終了したのでは無いでしょうか。
呼び出し側プロセスを変更できないのならば、自前でスレッドを作る必要があり
そうです。

方法1、SetTimerした後メッセージループだけ行うスレッドを自分で作る。
方法2、Sleep等で休止するスレッドを自分で作り、SetTimerは使わない。
辺りでしょうか。

sagawa 2008/07/06(日) 10:05:06
[[解決]]
麩 様

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

>恐らく、HogeHogeを呼び出したスレッドにはメッセージループが無かったか、
>HogeHogeを呼び出した後に一瞬で終了したのでは無いでしょうか。

ご指摘の通り、C#のGUI側にはメッセージループがなかったようです。
GUI側で対応するか、DLL側で対応するかは、現在検討中ですが
問題が解決致しましたので、これで閉めさせて頂きます。

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

古いスレッドには追加発言できません。