- ベストアンサー
マルチスレッド
birの回答
MFCのAfxBeginThread()のソースを見るとエラー時はNULLを返してるので、 エラーチェック方法としては NULL判定で良いと思います。 メモリ関連の例外もスローしてるみたいですが、詳しくはソースを見たほうが 早いと思います。
関連するQ&A
- MFCマルチスレッドについて
MFCマルチスレッドについて COMやIOボードからの入力に応じて動作するアプリを作っています。 AfxBeginThreadにてそれぞれワーカスレッドを作成しCOMやIOから入力があれば AfxBeginThreadを呼んでいるクラスにあるメンバ関数を実行しようとしています。 AfxBeginThreadにて*thisを送り、制御関数内で、mycls->OnButton***()というような 感じで現在は作っています。(OnButton***になっているのはデバッグ用にボタンで あらかじめ作成している関数のためです。) このときに、mycls->OnButton***()は親スレッドで動いていると考えていいのですか? あくまで親スレッドのクラスのメンバ関数を制御関数が動いている子スレッドで実行 しているだけなのでしょうか? 実は、ログ表示のため制御関数の中(受信データを表示)と、mycls->OnButton***()の中 (作業結果を表示)に同じエディットコントロールへの表示部分があります。 表示部分の処理は、いったんCStringで読み込んできて最大文字数チェックを行い、 再度文字数を調節して書き直しということをやっているため、一応クリティカル セクションにはしているのですが、実際どう動いているか分からないため、やり忘れ ていることや、やってはいけないことをやってそうです。 すいませんがご教授願います。
- ベストアンサー
- C・C++・C#
- マルチスレッドのスレッド数を増やしたい
<プログラム環境> 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*/ ; } のようなスレッドを追加したいのですが全然出来ません。 宜しければご指摘お願い致します。
- 締切済み
- C・C++・C#
- c++でスレッド処理
vc++6.0でスレッドを使ったアプリケーションを作っています。 AfxBeginThreadを使って UINT Action::reactiveMotionTh( LPVOID pvParam) { Action *rm = (Action *)pvParam; ・ ・ ・ return 0; } CWinThread* ch = AfxBeginThread(reactiveMotionTh, (LPVOID)this); と書いたのですが、実行しようとすると、 error C2065: 'AfxBeginThread' : 定義されていない識別子です。 とエラーがでます。何が問題なんでしょうか。よろしくお願いします。
- 締切済み
- C・C++・C#
- VC++スレッドの正しい終了のさせかた
VC++6.0にてAfxBeginThreadで m_bAutoDelete = TRUEにてスレッドをおこしております。 この終了時に制御関数のwhileループを脱する様にし、 正常にスレッドを終了させているつもりです。 この後、再度(アプリは継続して起動したまま) AfxBeginThreadにて全く同じ処理で再開すると、 なぜか、前のスレッドが未だ動作しているかのごとく 制御関数内のTRACEが2重に出力されます。 再度、停止し、またスレッド起動すると、 今度は3重になったかの様な動作をします。 スレッドが正しく終了されていないのでは?と思った現象として、 1回起動時にアプリを終了させると正常終了しますが、 2回起動以上は必ずスレッドのメモリーリークが出ます。 メモリーリーク個所はAfxBeginThreadでした。 制御関数内で必要ないとは思いましたが、終了時に AfxEndThreadを使用しましたが現象は同じでした。 そこで質問です。 1)この現象は、スレッドが正常に終了されていない事に起因しているのでしょうか? 2)スレッドを正しく終了させるにはどうすればいいのでしょうか? 当方、制御関数がループを抜け、さらにm_bAutoDelete = TRUEであれば オブジェクトも自動的に破棄されると思っていたのですが。。。 以上、よろしくお願いします。
- ベストアンサー
- C・C++・C#
- メインスレッドのPostMessageとマルチスレッドでの処理
お世話になります、fujicafeと申します。 現在Visual Studio 2005にてVC++のプログラムの作成をしており、 お聞きしたいことがありまして、こちらにて投稿させていただきました。 質問したい内容はPostMessageによる非同期呼び出しによるメインスレッド関数の処理と、別スレッドからのメインスレッド関数呼び出しによる処理の違いについてです。 現在、メインスレッドにマルチメディアタイマーを使って、ある時間間隔毎にメインスレッドの関数を呼び出しています。その関数の呼び出しにはPostMessageを使用しています。 その関数の呼び出しをAfxBeginThreadを使用して、メインスレッドから別スレッドを作成し、その別スレッド内にてメインスレッドのオブジェクトを作成して、実行したいメインスレッドの関数を呼び出すと、もともとのPostMessageを使用して関数を呼び出すのとでは処理としてどのような違いがあるのでしょうか? スレッドを別にするということで、メインスレッド側に負荷をかけないといったことが違うのでしょうか? だいぶ検討はずれの質問かとは思いますが、ご教授よろしくお願いいたします。
- 締切済み
- C・C++・C#
- 閉じてしまったダイアログのエディットボックスへの書き込み禁止方法
VC++ 6.0 MFC ダイアログベースです。 メインダイアログ画面で、ボタンを押下した時に、別ダイアログ(子ダイアログ)が呼び出されて、 その子ダイアログ内では、ワーカースレッドを使用して処理を行い、 処理結果をエディットボックスに表示させています。 子ダイアログを閉じる時に、WaitForSingleObject を使って、スレッドを完全に終了させてからダイアログを閉じるように しているのですが、スレッドの処理が、エディットボックスに書き込む時に閉じてしまうと、 スレッドがそこで止まってしまいスレッドが終了しません。 このような場合どうしたら良いのでしょうか? ・閉じるボタンが押されたら、エディットボックスに書き込まないようにすれば良いと思い、 (フラグを立てて試したのですが、フラグチェック後に閉じるが押されることがあり失敗) // スレッドの開始 m_Thread = AfxBeginThread(ThreadFunc, this); // この時、子ダイアログを閉じてしまうと // INFINITEなので、ずっと止まってしまいます。 CString data = "処理結果"; case 0: m_M0edit.SetWindowText(data); break; case 1: m_M1edit.SetWindowText(data); break; case 2: m_M2edit.SetWindowText(data); break; ・ ・ ・ ・ // 子ダイアログを閉じる時に呼び出されます。 // スレッドでの処理が完全に終わるのを待ちます。 afx_msg void CSelecting_Dlg::OnClose() { DWORD dwRet dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE); EndDialog(0); } /***************/ 失敗談 /***************/ // スレッドの開始 m_Thread = AfxBeginThread(ThreadFunc, this); // この時、子ダイアログを閉じてしまうと // INFINITEなので、ずっと止まってしまいます。 CString data = "処理結果"; if (m_openFlag == 1){ //フラグを見て書き込みするかチェックする。 switch (t){ case 0: m_M0edit.SetWindowText(data); break; case 1: m_M1edit.SetWindowText(data); break; case 2: m_M2edit.SetWindowText(data); break; ・ ・ ・ ・ } } // 子ダイアログを閉じる時に呼び出されます。 // スレッドでの処理が完全に終わるのを待ちます。 afx_msg void CSelecting_Dlg::OnClose() { DWORD dwRet m_openFlag = false; //閉じるボタンが押されたら フラグを降ろす。 dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE); EndDialog(0); }
- ベストアンサー
- C・C++・C#
- CreateThreadのエラー
<プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <質問> 何も実行しないスレッドを作成するようにコーディングしたのですが、 「error C2440: 'type cast' : '' から 'unsigned long (__stdcall *)(void *)' に変換することはできません。」 というエラーが出ました。 これは、何が原因で、解決方法はありますか? <ソース> void CMyDlg::OnButton1() { HANDLE handle; DWORD id; handle = CreateThread(0,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&id); } void CMyDlg::ThreadFunc(void) { } <ヘッダ> void ThreadFunc(void); 宜しければご指摘お願い致します。
- ベストアンサー
- C・C++・C#
- マルチスレッドプログラムでメモリが増加
VS6.0 で マルチスレッドのDBアクセスプログラムを作成しています。 現在、スレッドを起動し、スレッド内でデータベースオブジェクトを宣言、オープン、クローズしているだけなのにメモリが増えつづけてしまっています。 宣言方法等、何か問題がありましたら指摘ください。 (ちなみにスレッドから起動されたスレッドです。) ◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎ void __cdecl XXXApp::XXXThread( void* arg ) { CDatabase m_DB; m_DB.OpenEx( 接続文字列, CDatabase::useCursorLib|CDatabase::noOdbcDialog ); if( m_DB.IsOpen() == TRUE ){ m_DB.Close(); } _endthread(); } ◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎ すいませんがアドバイスをお願いします。
- 締切済み
- C・C++・C#
- マルチスレッドについて
私はいまマルチスレッドの勉強をしているのですが、ビルドが通るのに実行結果がおかしい状況に陥っています。 ロード画面の処理なのですが、プライマリスレッドでロード画面を描画し、セカンダリスレッドでロード処理を行おうとしています。 問題は、ロードが途中で止まることとロード画面を描画できません。 多分下記の関数が悪いとは思うのですがどうか、ご助力おねがいします。 HRESULT GameMain::LoadScreen() { // スレッドの生成 static bool onlyonce_createthread = FALSE; if(onlyonce_createthread ==FALSE) { hTh = (HANDLE)_beginthreadex( NULL, 0, &loadthread, this, 0, (unsigned*)&thID ); onlyonce_createthread =TRUE; } // ローディング画面の描画 static bool loopflg = TRUE; while(loopflg) { int threadCondition = CheckThread( hTh ); switch(threadCondition) { case THREAD_RUNNING: if(graphloaded_flg ==TRUE) { EnterCriticalSection( &m_criticalSection ); float keep_item = (float)(load_item/MAX_LOAD_ITEM); LeaveCriticalSection( &m_criticalSection ); d2d_control->GaugeDraw(0, 0, keep_item); } break; case THREAD_EXIT: loopflg =FALSE; break; case THREAD_ERROR: return E_FAIL; break; } } float keep_item = (float)(load_item/MAX_LOAD_ITEM); d2d_control->GaugeDraw(0, 0, keep_item); return S_OK; }
- ベストアンサー
- C・C++・C#
お礼
ありがとうございました。 VC++は使い始めたばかりなので???ばっかりです。 勉強しなきゃ。