プロが教えるわが家の防犯対策術!

<プログラム環境>
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*/ ;
}
のようなスレッドを追加したいのですが全然出来ません。
宜しければご指摘お願い致します。

A 回答 (12件中11~12件)

>「静的な中で呼び出しがおかしい」のようなエラーが出ます。


> static UINT ThreadFunc1( LPVOID pParam );
> static UINT ThreadFunc2( LPVOID pParam );
上記は静的な関数なので、この中で呼び出す物も、
それと同じ実行範囲出なければ行けません。
呼び出そうとするクラスのメソッドも静的にする必要があります。

> MessageBox()をコーディングするとエラーがでます。
どんな?
    • good
    • 0
この回答へのお礼

aris-wiz様、有難うございます。
エラーは「静的でないメンバ関数の中で呼び出しが正しくありません。」
でした。
MessageBox()を静的にすることができるのでしょか?

お礼日時:2008/11/06 14:07

<.h>


class CMyDlg : public CDialog{
public:
  static UINT ThreadFunc1( LPVOID pParam );
  static UINT ThreadFunc2( LPVOID pParam );
  // これは不要
  // void Thread(); // スレッドの処理
protected:
  CWinThread* m_pThread1;//スレッドのアドレス
  CWinThread* m_pThread2;//スレッドのアドレス
};

<.cpp>
void CMyDlg::OnButton(){
  m_pThread1 = AfxBeginThread( ThreadFunc1, this );
  m_pThread2 = AfxBeginThread( ThreadFunc2, this );
  // これも不要
  // for(;;) /*無限ループ処理1*/ ;
  // メッセージポンプを止めてしまうのは得策ではありません
}

UINT CMyDlg::ThreadFunc1( LPVOID pParam ){
  // このような使い方をしない
  //((CMyDlg*)pParam)->Thread();
  for ( ;; ) {
    // 何かの処理
  }
  return 0;
}

UINT CMyDlg::ThreadFunc2( LPVOID pParam ){
  // このような使い方をしない
  //((CMyDlg*)pParam)->Thread();
  for ( ;; ) {
    // 何かの処理
  }
  return 0;
}

別のスレッドから CMyDlgへ何らかのアクションを起こすなら
PostMessageやSendMessageでやり取りしましょう
やり取りするメッセージはRegisterWindowMessageなどで作成します
これを CMyDlgのメッセージマップで振り分けるようにしましょう
    • good
    • 0
この回答へのお礼

redfox63様、有難う御座います。
PostMessage、SendMessage、RegisterWindowMessageのリファレンスは調べたのですが、今ひとつ理解できませんでしたが、教えていただいた通りにコーディングして、実行できました。
しかし、2つ問題が発生しました。
<問題1>
void CMyDlg::Thread(){
  for(;;) /*無限ループ処理2*/ ;
}
このメンバ関数内で他のメンバ関数を呼び出していたのですが、
「静的な中で呼び出しがおかしい」のようなエラーが出ます。
また、ダイアログで宣言したエディットボックスのメンバ変数(CString)を使用することにも同様のエラーがでます。

<問題2>
MessageBox()をコーディングするとエラーがでます。

上記2点の問題によって、スレッド内の計算結果や、エラー発生時の警告等を文字列(CString)で表示する手段が分からなくなりました。教えていただいた手法ではスレッド内で文字列を表示することは出来ないのでしょうか?
宜しければご指摘の程お願いいたいます。

お礼日時:2008/11/06 01:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!