• ベストアンサー

【MFC】ユーザインタフェーススレッドのInitInstanceの呼ばれるタイミングについて

現在、MFCのスレッドについて学習をしている者です。 タイトルの件なのですが、CWinThread の派生クラス内の InitInstanceが呼ばれるタイミングはいつなのでしょうか? AfxBeginThreadで生成した時すぐでしょうか? ご教示宜しく御願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.1

AfxBeginThreadで生成した時すぐであっていますが、引数でCREATE_SUSPENDEDを指定をしていない時限定になります。 引数でCREATE_SUSPENDEDを指定した場合は、その後ResumeThreadを呼び出した時になります。 また、AfxBeginThreadの代わりにCreateThreadを使った場合も同様の動作になります。

関連するQ&A

  • スレッドでWM_TIMERを受け取れない

    スレッドの中でタイマー処理を行いたいのですが、WM_TIMERが受け取れません。 というか、メッセージマップ内でON_WM_TIMER()と記述すると、型が違うとエラーが出てしまいます。 どなたか、スレッド内でタイマー処理を行うすべを教えて下さい。よろしくお願いします。 CWinThreadを派生したクラス内での処理です。

  • マルチスレッドのスレッド数を増やしたい

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <質問概略> CWinThread*を使って無限ループのスレッドを作ったのですが、 無限ループのスレッドをもう一つ作り、同時に実行しようとするとアクセスバイオレーションのエラーでます。 複数スレッドの作り方を教えていただけますと幸いです。 <質問詳細> 現状の正常に実行できるソースの必要最小限を書きます。 <.h> class CMyDlg : public CDialog{ public:   static UINT ThreadFunc( LPVOID pParam );   void Thread(); // スレッドの処理 protected:   CWinThread* m_pThread;//スレッドのアドレス }; <.cpp> void CMyDlg::OnButton(){   m_pThread = AfxBeginThread( ThreadFunc, this );   for(;;) /*無限ループ処理1*/ ; } UINT CMyDlg::ThreadFunc( LPVOID pParam ){   ((CMyDlg*)pParam)->Thread();   return 0; } void CMyDlg::Thread(){   for(;;) /*無限ループ処理2*/ ; } これに、 void CMyDlg::Thread2(){   for(;;) /*無限ループ処理3*/ ; } のようなスレッドを追加したいのですが全然出来ません。 宜しければご指摘お願い致します。

  • MFCマルチスレッドについて

    MFCマルチスレッドについて COMやIOボードからの入力に応じて動作するアプリを作っています。 AfxBeginThreadにてそれぞれワーカスレッドを作成しCOMやIOから入力があれば AfxBeginThreadを呼んでいるクラスにあるメンバ関数を実行しようとしています。 AfxBeginThreadにて*thisを送り、制御関数内で、mycls->OnButton***()というような 感じで現在は作っています。(OnButton***になっているのはデバッグ用にボタンで あらかじめ作成している関数のためです。) このときに、mycls->OnButton***()は親スレッドで動いていると考えていいのですか? あくまで親スレッドのクラスのメンバ関数を制御関数が動いている子スレッドで実行 しているだけなのでしょうか? 実は、ログ表示のため制御関数の中(受信データを表示)と、mycls->OnButton***()の中 (作業結果を表示)に同じエディットコントロールへの表示部分があります。 表示部分の処理は、いったんCStringで読み込んできて最大文字数チェックを行い、 再度文字数を調節して書き直しということをやっているため、一応クリティカル セクションにはしているのですが、実際どう動いているか分からないため、やり忘れ ていることや、やってはいけないことをやってそうです。 すいませんがご教授願います。

  • VC++ スレッドからDoModalへ

    いまさらですがVC++6.0でつまづいています MFCです AdlgクラスのダイアログのOnButtonA() からXXXスレッドを起動し そのXXXスレッドではcountを+1しつづけます。 そして別のダイアログ DDD10をDoModalで起動しそのDDD10 内のTextBoxの値にcount値を反映させて表示しようとしました 下記ソース内のAfxMessageBox(tmp);ではcount値は 更新されますが DDD10ダイアログ内のテキストボックス の値が変更されません m_gui_xfr_totalはDDD10のテキストボックスにつけた メンバー名です どなたかアドバイスをお願いします void ADlg::OnButtonA() { DDD10 dlg10 ; CWinThread *pThread = AfxBeginThread(XXX_thread_entry,(LPVOID *)this); dlg10.DoModal() ; } void XXX_Thread(){ CString tmp; unsigned int count=0; DDD10 dlg10; while(1){ count++; tmp.Format("%d",count); dlg10.m_gui_xfr_total.Format(tmp); AfxMessageBox(tmp); Sleep(1000); } }

  • スレッド処理からダイアログを表示するには?

    Windows XPとVC++ 6.0で 時間のかかる大量の計算をするプログラムを作っています。 計算部分はスレッド処理にして 進捗ダイアログ(CDialogにCProgressCtrlを貼り付けたもの) を表示します。 ・CWinAppのInitInstanceで計算処理開始(AfxBeginThread) ・計算処理内で進捗ダイアログをCreate ・計算の進み具合によって進捗ダイアログのプログレスバーを更新 上記の流れではうまくいっていたのですが 以下のように変更したところ、進捗ダイアログをCreateするところで プログラムが応答なしになってしまうようになりました。 ・メインダイアログ(モーダル) ・メインダイアログのAボタンクリックでダイアログAを開く(モーダル) ・ダイアログAの実行ボタンクリックで計算処理開始(AfxBeginThread) ・計算処理内で進捗ダイアログをCreate ・計算の進み具合によって進捗ダイアログのプログレスバーを更新 MFC Wizardでダイアログベースで作成、MFCの共有DLLを使用しています。 モーダルダイアログ→スレッド→CDialog.Createに 制限があったりするのでしょうか。 どうかご教授ください。

  • スレッド制御に関して

    C言語の初心者です。 現在、スレッドの勉強をしております。 最近、pthreadをなんとなく理解しつつありますが、 下記の2点に関して試行錯誤しております。 (1)スレッドを周期的に起動したい (2)時間によって起動したい (1)は、例えば30秒毎にスレッドを起動させたい等といった、周期スレッドの生成方法です。今考えているのは、スレッドを生成後、スレッド生成元で30秒間sleepして、2回目のスレッドを起動…。といったイメージを考えております。 (2)に関しても同様で、例えば12時00分00秒にスレッドを生成したいというパターンで、スレッド生成元にて、時間を取得して、その時間が12時00分00秒であればスレッド生成を行うといったイメージを考えております。 上記2案とも初心者なりに考えた案なのですが、他によい案はありませんでしょうか? ご教授頂けますようよろしくお願いいたします。

  • [MFC]AfxBeginTreadでのスレッド強制終了の方法について

    WinInetで多数のクライアントとHTTP通信を行うプログラムを作成しています。 やりたい事は閉じたネットワークの中で 生きているホストを調べるということです。 HTTP_GETの可否で判断させるつもりですがpingでも構いません。 (DHCPサーバーのリース情報などは参照できない状態環境) 逐次処理で一台ずつタイムアウトは待ってられないので ホストの台数分だけスレッドを作成します(クラスCなら256台分)。 <!-- コード --> UINT MyThreadProc(LPVOID pParam) {  CMyHost* hostData = (CMyHost*)pParam;  hostData->Get();  return 0; } void CMyDlg::OnStart() {  CMyHost hostData[hostNum];  CWinThread* pThread[HostNum];  // 台数分スレッド起動  for (int i=0;i<(int)HostNum;i++) {   hostData[i].ipAddr = NetworkAddress + (DWORD)i;   pThread[i] = ::AfxBeginThread(MyThreadProc, &hostData[i]);  }  // 何秒か待つ  HANDLE timer = CreateWaitableTimer(NULL, FALSE, NULL);  WaitForSingleObject(timer, 10000);  // returnしてないスレッドがあっても全スレッド強制終了  /* 強制終了の仕方が分からない */ <!-- コードここまで --> 強制終了させるためには各スレッドにメッセージを投げて スレッド側でそれを判定するなどでしょうか? でも通信の終わってないスレッドは通信処理の最中なのだから どうやってメッセージを受け取ればいいのか想像つかないです。 (そもそもCInternerSessionでタイムアウトの使い方がよく分からない…、 もっとスマートな方法があれば教えていただきたいです。)

  • mfc ソケット通信プログラム

    現在vc++2005mfcでソケット通信プログラムを作っています。 受信をスレッドにもっていくとsockcoreでAssertion Failedになってしまって困っています。 内容は、ネット上にあったサンプルソフトを引用して、 void dlg::ONBnClickedWait() { CSocket sock,conSock, : : sock.Create(port); sock.Listen(1); sock..Accept(coSock); conSock.Receive(buf,1024); というような感じになっています。(かなりコードを省略しています。) これは動くのですが、ここで受信をスレッドに持って行きたく、sock,conSockの宣言 をヘッダー(仮にDlg.h)に持っていき、ONBnClickedWaitからReceiveを削除、 AfxBeginthread( Rthread, (LPVOID)this );という感じでスレッドを生成しました。 で、スレッド内で、 UINT Rthread(LPVOID p) { CDlg* Parclass = (CDlg*)p : Parclass->conSock.Receive(buf,1024); : を呼んだ時点で、エラーとなってしまいます。 クラスの考え方が根本的に間違っているのでしょうか?(NEWで作らないといけない??) すいませんが、どなたかご教授おねがいいたします。

  • Androidのマルチスレッド処理の開始タイミング

    組み込みボード上にAndroidOSをのせ、 その上でRS232C通信制御するプログラムを作成しております。 RS232C通信制御についてはThreadクラスを派生させたクラスを 作成し、マルチスレッド処理として、アプリ起動中に、常に動作させたい と考えています。 このとき、RS232C通信制御するスレッドを 開始するタイミング、終了するタイミングはメインアクティビティのどの タイミングで行うのが1番よいのでしょうか? 現状は以下で考えています。 public class MainActivity extends Activity { ComCtrl m_ComCtrl ; // RS232C通信制御スレッド protected void onCreate(Bundle savedInstanceState) { m_ComCtrl = new ComCtrl( null ) ; // スレッド生成 m_ComCtrl.start() ; // スレッド開始 } protected void onDestroy() { m_ComCtrl.halt() ; // スレッド終了(スレッドメインループを終了させる独自メソッド) } }

    • ベストアンサー
    • Java
  • 【VC++6.0(MFC)】スレッドの呼び出し方について

    いつも大変お世話になっております。 VC++初心者です。 現在、下記のサイトでマルチスレッドを勉強していますが、 そのスレッドの呼び出し方が分かりません。 具体的にどのように書けば宜しいのでしょうか。 http://www.takebay.net/~daigo-ao/paddlewiki.pl/title_4350505FA5B9A5ECA5C3A5C9A4CEBBC8A4A4CAFD5F4D4643C8C7.html mainではないですが、別のクラスから呼び出そうと思い、 以下のように書きましたが、駄目でした。 CHoge aaa; aaa.RunThread(); お手数ですが、よろしくお願い致します。