• 締切済み

CWnd::OnTimerのスレッドの取得

itohhの回答

  • itohh
  • ベストアンサー率45% (210/459)
回答No.1

こんにちは。itohhといいます。 ちょっと、質問の意味がわからないのですが。 (1)について。 SetTimer関数で設定された秒数の経過後にOnTimerイベントが呼び出されるというのでは いけないのでしょうか? (2)について。 それは、「仕様です。」ではダメ? newで作成したオブジェクトの戻り値はオブジェクトのアドレス(ハンドル)ですよね? それと、同様だと思うのですが... (3)について。 中身を見るってどういう事を意味しているのでしょうか? OnTimerイベントのときの処理を書きたい、という意味でしょうか? それならば、クラスウイザードでOnTimerイベントを追加してください。 ソースファイルにOnTimer関数のテンプレートが出来るはずですから、処理を追加 してください。 (注)スレッドには2種類有ります、ワーカースレッドとユーザインターフェース    スレッドです。    ユーザインターフェーススレッドでないと、OnTimerイベントは拾えません。    ワーカースレッドで行いたい場合は、独自のメッセージポンプを実装    しなければいけません。

COPY_ROBOT4
質問者

お礼

いろいろ細かくご教授ありがとうございました。 1つ1つの質問を丁寧に教えていただけたのですが、勉強する時間が長すぎて、不採用になってしまいました。 でも、これから自分なりにゆっくり勉強していきます。 また、その時はよろしくお願いします。 VCを触って早3ヶ月も経つのにわからないことだらけでやになります。愚痴を言ってしまいました。 本当にありがとうございました。

関連するQ&A

  • win32 スレッドのハンドルついて

    windowsのスレッドについての質問です。 今、手元にある書籍のスレッドを作る節にCreateThread()関数を使ってスレッドを作るサンプルプログラムが載っています。 その中では CloseHandle()関数が一切呼ばれていません。 しかも、そのサンプルではいくつもスレッドを作り、そのスレッドはプログラム中でいくつも終了するようなものです。CloseHandle()は呼び出さなくても問題ないのでしょうか? しかし、ネットで調べてみるとCloseHandle()を呼び出さなくてはいけないということが書かれていました。 http://www.daccho-it.com/program/WinApi/thread.htm ↑ 参考にしたサイト そこでいくつか質問です。 プロセスが終了するときにスレッドのハンドルは自動的に閉じられるという認識で大丈夫でしょうか? CreateThread()、_beginthreadex関数はCloseHandle()を呼び出す必要があるで大丈夫でしょうか? となると、CreateThread()の戻り値は必ず変数に保存しておく必要があるということですか? 書籍のサンプルではCreateThread()の戻り値はどこにも保存していませんでした、保存しない場合ハンドルが作られないってことはさすがにないですよね? よろしくお願いします。

  • スレッド内でのマルチスレッドの作成[WINDOWSプログラミング]

    いつもお世話になっております。 現在WINDOWSプログラムでゲームを最中なのですが、スレッド内でスレッドを作成できなくて困っています。 キャラを動かすスレッドで以下の関数を使い、スレッドを作成しようとしたのですが、 CreateThread(NULL, 0, ATK, (LPVOID)&x, 0, &dwID); 以下のようなエラーメッセージが出てしまいます。 'ATK':定義されていない識別子です '関数' : 間接参照のレベルが 'LPTHREAD_START_ROUTINE' と 'int' で異なっています。 'CreateThread' : の型が 3 の仮引数および実引数と異なります。 わかる方いましたらどうがご指導お願いします。 初歩的なミスでしたらすみません。

  • 既存プロセスからプロセスのプライマリースレッドIDの取得方法

    いつもお世話になってます。 プロセスに関することで分からないことがあるため、どなたか御教授して下さい。 只今、VC++で開発を行っているのですが、CreateProcess関数を使用して開始したプロセスの情報が、引数で指定したPROCESS_INFORMATIONにプライマリースレッドのハンドルやIDが設定されるのは知っているのですが、現在動作中のプロセスからそのプロセスのプライマリースレッドのIDを取得することは可能でしょうか? 具体的には、動作中のプロセスIDを指定するとそのプロセスのプライマリースレッドに対してPostThreadMessageで任意のメッセージが送れるという仕様です。 対象のプロセスがウィンドウを持っていれば、EnumWindows関数を使用してウィンドウに対してPostMessageができるというのは分かったのですが、今回対象のプロセスがウィンドウを持たない為、上記のようにスレッドに対してメッセージを送るようになっています。 CreateProcess呼び出し時にはスレッドIDが取得できることから、プロセスID、または、プロセスハンドルからスレッドIDが取得できるのではないかなと考えられるんですが。。。。

  • メインスレッドのPostMessageとマルチスレッドでの処理

    お世話になります、fujicafeと申します。 現在Visual Studio 2005にてVC++のプログラムの作成をしており、 お聞きしたいことがありまして、こちらにて投稿させていただきました。 質問したい内容はPostMessageによる非同期呼び出しによるメインスレッド関数の処理と、別スレッドからのメインスレッド関数呼び出しによる処理の違いについてです。 現在、メインスレッドにマルチメディアタイマーを使って、ある時間間隔毎にメインスレッドの関数を呼び出しています。その関数の呼び出しにはPostMessageを使用しています。 その関数の呼び出しをAfxBeginThreadを使用して、メインスレッドから別スレッドを作成し、その別スレッド内にてメインスレッドのオブジェクトを作成して、実行したいメインスレッドの関数を呼び出すと、もともとのPostMessageを使用して関数を呼び出すのとでは処理としてどのような違いがあるのでしょうか? スレッドを別にするということで、メインスレッド側に負荷をかけないといったことが違うのでしょうか? だいぶ検討はずれの質問かとは思いますが、ご教授よろしくお願いいたします。

  • windowsのプロセスIDやスレッドIDの使い道

    win32APIで取得したプロセスIDやスレッドIDの使い道について教えてください。 CreateProcessなどで取得したプロセスのハンドルやスレッドのハンドルはwin32APIで使う場面がありますが、プロセスIDやスレッドIDの使い道がわかりません。 どのような場面でプロセスIDやスレッドIDを使うのでしょうか?具体的にこんな事をするときに使うよなどあれば教えていただきたいです。 プロセスIDやスレッドIDを引数にとるAPI関数などがあれば教えていただきたいです。

  • スレッド処理内の変数の参照について

    大変困ってます。 今、親プロセスからスレッド内の変数に設定したいのですが方法がわかりません。 スレッドからの場合、普通行えばいいのでわかるのですが ・・・。 (詳細) メインプロセス(A) クリエートスレッド後のスレッド(B)  1.(A)で(B)をCreateThread  2.(A)の本処理で(B)の構造体にmemcpyの方法が    わかりません。  3.知っている方がいましたら教えていただけませんか。  4.読みずらい文章ですみません。宜しくお願いします。

  • スレッド処理内での終了結果を知りたい

    VC++6.0(SP5)を使って、コマンドプロンプトのような処理を作成しています。  1.CreateProcess()でMS-DOSプロンプトを起動  2.CreatePipe()で実行コマンドの読み取り/終了監視スレッド用ハンドル作成  3.CreateThread()で実行コマンドの読み取り/終了監視スレッド作成  4.WriteFile()、ReadFile()を使っています。 'Dir'コマンド等を実行した際、通常プロンプトに表示されるメッセージを 読み取れてエディットボックスに表示できるのですが、異常/正常に関わらず 終了した時を取得したいのですが・・・。  (詳細)  1.WriteFile()を使って'Dir'コマンド実行  2.実行コマンドの出力が完了←この時点でコマンドプロンプトを終了させたい   ※WriteFile()関数の実行終了ではなく、'Dir'コマンド実行終了を知りたい 何方かご教授お願いします。

  • スレッドの再開

    MFCでアプリケーションを開発しています。 メインのプログラムを走らせながら計算処理を行いたくて、本やネット等のサンプルプログラムを見ながら別スレッドを生成してみました。 OnInitDialog()でイベントとスレッドを生成し、スタートボタンのクリック押下をトリガーとして、計算処理(Run())を呼んでいます。 タイマー開始後は一定時間ごと(サンプルでは500msec)にスレッドを再開して計算処理を実行し、計算処理完了後はスレッドを一時停止状態にしたいと思っています。 (アプリケーション起動時にサスペンドモードで起動したスレッドをボタン押下でResumeThread(再開)し、あとはタイマーでイベントシグナルをセットして制御するつもりでした。) ですが、下記のコードで走らせると、初回のみ計算処理が呼び出され、その後はスレッドが再開されません(ThreadProc()がコールされない)。 理解不足から何か考え違いをしているのだと思うのですが、どこをなおすべきかわからず行き詰まっています。 どなたかご指摘頂けたらと思います。よろしくお願い致します。 ※実際に記述したコードの抜粋になりますので計算やリソースの解放処理等は省略しています。 OS:Win10 開発環境:VisualStudio2015 C++ ---------------------------------------------------------------- BOOL CMFCApplication1Dlg::OnInitDialog() { CDialog::OnInitDialog(); 中略 … m_hEvent = CreateEventA(NULL, FALSE, FALSE, "EVENT"); m_hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadProc, (LPVOID)this, CREATE_SUSPENDED, NULL); return TRUE; } void CMFCApplication1Dlg::OnTimer(UINT_PTR nIDEvent) { switch(nIDEvent) { case 1: { BOOL blRet = SetEvent(m_hEvent); } break; default: { } break; } CDialog::OnTimer(nIDEvent); } UINT CMFCApplication1Dlg::ThreadProc(LPVOID pParam) { CMFCApplication1Dlg* pDlg = dynamic_cast<CMFCApplication1Dlg*>(reinterpret_cast<CWnd*>(pParam)); if(pDlg) { pDlg->ThreadProcCall(); } return 0; } // LineProfileスレッド処理呼び出し. void CMFCApplication1Dlg::ThreadProcCall(void) { // イベントオブジェクト取得. HANDLE h = OpenEventA(EVENT_ALL_ACCESS, FALSE, "EVENT"); // シグナル状態になるまで待機. WaitForSingleObject(h, INFINITE); // 非シグナル状態に. ResetEvent(h); // 計算処理呼び出し. Run(); this->SendMessage(WM_USER_COMPLETE_PROC); } void CMFCApplication1Dlg::Run(void) { // 計算処理. } // LineProfileスレッド終了後処理. afx_msg LRESULT CMFCApplication1Dlg::OnCompleteProc(WPARAM wParam, LPARAM lParam) { // スレッド停止. DWORD dwRet = SuspendThread(m_hThread); return 0; } void CMFCApplication1Dlg::OnBnClickedBtnStart() { // スレッド再開. DWORD dwRet = ResumeThread(m_hThread); // 計算処理呼び出し用タイマー設定. m_nUpdatePaintTimer = SetTimer(1, 500, NULL); }

  • [MFC] CWnd::MessageBoxの警告アイコンイメージの取得方法

    CWndクラスのMessageBox関数で表示される メッセージボックス中の左上のアイコン (警告アイコン等)のイメージってアイコンデータとして 取得する方法ってありますか? いま、私がやりたいことというのは CWnd::MessageBoxで表示されるメッセージボックスに チェックボックスをつけてカスタマイズしたものを つくろうとしていまして、さらにアイコン等の外観も 標準の警告アイコンを使用したいと考えています。 アイコンにこだわらなければ、CWinApp::DoMessageBoxを アプリケーションクラスで実装してやれば良いだけなのかも しれませんが、どうしてもアイコンを標準のものを使用したいのです。 ご存知の方がいらっしゃいましたら、 教えていただけたら幸いです。

  • Cランタイムライブラリ

    まだWINDOWSプログラミングを始めて間もない初心者です。 宜しくお願い致します。 マルチスレッドの動作確認をする際に簡単なソースを作る過程で、1つ疑問が浮かびました。 CreateThreadについてMSDNのサイトを見ると、 ”C のランタイムライブラリに記録されている関数を使うスレッドは、CreateThread 関数と ExitThread 関数ではなく、C のランタイム関数である beginthread 関数と endthread 関数を使うべきです。この方法に従わないと、ExitThread 関数を呼び出したときにわずかなメモリリークが発生します。” とあるのですが、この関数はCのランタイムライブラリに属する、この関数はCのランタイムライブラリに属さない、というのは、例えばどこかのサイトを見れば分かるものなのでしょうか? あと、”わずか”、というのがどの程度を指しているのか良く分かりませんが、”わずかなメモリリークが発生”すると、具体的には何が起こるのでしょうか? どなたか分かる方ご教授下さい。