C#でC++のDLLを使用。DLL内でタイマー – プログラミング – Home

C#でC++のDLLを使用。DLL内で...
 
通知
すべてクリア

[解決済] C#でC++のDLLを使用。DLL内でタイマー


sagawa
 sagawa
(@sagawa)
ゲスト
結合: 16年前
投稿: 2
Topic starter  

初めて、このような場で質問させて頂きます。
至らない点が多々あるかと思いますが、よろしくお願いします。

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


引用未解決
トピックタグ
C#
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> DLLの為、TIMERPROCを使用しております。

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


返信引用
sagawa
 sagawa
(@sagawa)
ゲスト
結合: 16年前
投稿: 2
Topic starter  

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秒毎に
行われると思っていたのですが・・・

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


返信引用
麩
 麩
(@麩)
ゲスト
結合: 17年前
投稿: 95
 

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

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

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


返信引用
匿名
 匿名
(@匿名)
ゲスト
結合: 1秒前
投稿: 0
 

麩 様

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました