トップページ > プログラム > 2016年08月18日 > 9gCEAov3

書き込み順位&時間帯一覧

10 位/149 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000000031000004



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net

書き込みレス一覧

スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net
5 :デフォルトの名無しさん[sage]:2016/08/18(木) 17:06:15.70 ID:9gCEAov3
いや言っている意味がよくわからんがこういう感じのじゃダメなの?
やりたいことがわからんからコールバック呼ばれたらKillTimerしちゃってるけど…
それともTimerProcAやTimerProcBでclass A や class B のメンバにアクセスしたいという感じ?

class A
{
private:
static void TimerProcA(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime){ KillTimer(NULL,idEvent); }
public:
A(){}
~A(){}
virtual void TimerCall(){ SetTimer(NULL,0,2000,(TIMERPROC)TimerProcA); }
};
class B : public A
private:
static void TimerProcB(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime){ KillTimer(NULL,idEvent); }
public:
A(){}
~A(){}
virtual void TimerCall(){ SetTimer(NULL,0,4000,(TIMERPROC)TimerProcB); }
};
スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net
7 :デフォルトの名無しさん[sage]:2016/08/18(木) 17:28:17.52 ID:9gCEAov3
あちゃー
クラスBのコンストラクタとデストラクタは脳内で変換しておいてください

それならstd::mapとか使って…
要点だけなのでエラー処理とかは無しだけど

std::map<UINT, void*> mp;
class A
{
public:
A(){}
~A(){}
static void TimerProc(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
KillTimer(NULL,idEvent); A *a=(A*) mp[idEvent]; mp.erase(idEvent); a->TimerCallbackEvent();
}
void TimerCall(){ UINT TimerId = SetTimer(NULL,0,2000,(TIMERPROC)TimerProc); mp[TimerId] = this; }
virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer A","TEST",MB_OK); }
};
class B : public A
{
public:
B(){}
~B(){}
virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer B","TEST",MB_OK); }
};
スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net
8 :デフォルトの名無しさん[sage]:2016/08/18(木) 17:37:35.78 ID:9gCEAov3
別にstd::mapである必要はないし独自のリストを作っても良い

TimerProc() と TimerCall() は基底クラスだけ書く
TimerCallbackEvent()は仮想関数で 派生クラス毎の機能 はここに書く

流れとしてはそれぞれのクラスでTimerCall() を呼び出すとタイマIDとインスタンスをセットで登録
時間経過でTimerProc()が呼ばれるけどその際に登録したタイマIDからインスタンスをゲット
あとはインスタンスの仮想関数 TimerCallbackEvent() を呼び出す
スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net
9 :デフォルトの名無しさん[sage]:2016/08/18(木) 18:02:11.11 ID:9gCEAov3
あと横着なやり方だと
SetTimerにウインドウハンドル指定すれば第二引数の UINT idTimer を有効に出来る
この idTimer にクラスのインスタンスを指定
コールバック関数 TimerProc では 第三引数の UINT idEvent, をクラスの型にキャストしてインスタンスを取得

class A
{
public:
A(){}
~A(){}
static void TimerProc(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) {
KillTimer(hwnd, idEvent); A *a=(A*) idEvent; a->TimerCallbackEvent();
}
void TimerCall(HWND hWnd){ SetTimer(hWnd,(UINT)this,2000,(TIMERPROC)TimerProc); }
virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer A","TEST",MB_OK); }
};

class B : public A
{
public:
B() : A(){}
~B(){}
virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer B","TEST",MB_OK); }
};


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。