【コンパイルエラーが出ます】AfxBeginThreadで起動したいワーカースレッド関数、その引数

[戻る]
ele 2002/07/11(木) 20:39:12
開発環境:Win2000 VC++6.0SP5 MFC

初めまして。早速ですがお手上げ状態なのでご教授ください。
ダイアログベースで、ワーカースレッドを立ち上げようとしています。

<RThread.h>--------------------------------
struct stRThreadInfo {   //WorkerThreadに渡したい引数
  :
  :
};

UINT WatchPort(LPVOID);  //起動したいグローバル関数

<CDebDlg.h>--------------------------------
Class CDebDlg : public CDialog
{
public :
  :
  :
CWinThread*      m_pThread;  //戻り値、引数をそれぞれ宣言
stRThreadInfo    m_stRThreadInfo;
  :
  :
};

<CDebDlg.cpp>--------------------------------
#include "RThread.h"     //それぞれのヘッダーファイルをインクルード
#include "CDebDlg.h"

//ある関数内で
m_pThread = AfxBeginThread((AFX_THREADPROC)WatchPort, (LPVOID)&m_stRThreadInfo, 
0, 0, 0, NULL);

----------------------------------------------

これで二つのエラーが出てしまいます。
ひとつは、「error C2440: 'type cast' : '' から 'unsigned int (__cdecl *)(void 
*)' に変換することはできません。(新しい動作 ; ヘルプを参照)
        スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。」で、
もうひとつは「error C2501: 'stRThreadInfo' : 識別名を宣言するのに、型が指定されてい
ません。」

MSDNライブラリのサンプルを参照し、同じように作ってみたのですが・・・。
いろいろあがいてみましたが、もう自分ではどうしようもありません。
なんとかしたいのです、よろしくお願いします。

トオリスガリ 2002/07/11(木) 20:54:37
>ひとつは、「error C2440: 'type cast' : '' から 'unsigned int (__cdecl *)(void 
>*)' に変換することはできません。(新しい動作 ; ヘルプを参照)
>        スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。」
で、
>もうひとつは「error C2501: 'stRThreadInfo' : 識別名を宣言するのに、型が指定されて>ません。」

どのファイルの何行目?
#といっても行番号を書かれてもわからないので、下のように書いてください
#  stRThreadInfo    m_stRThreadInfo;   <-ここで2番目のエラーがでます。

2番目のエラーは
#include "CDebDlg.h" のみで #include "RThread.h" のない.cppならば出るでしょう。
#include "RThread.h" は CDebDlg.h に書いたほうが楽です。

>UINT WatchPort(LPVOID);
UINT WatchPort(LPVOID lpData); lpDataの部分は省略可能でしたっけ?

ele 2002/07/11(木) 21:14:22
早速のコメントありがとうございます。

> どのファイルの何行目?
> #といっても行番号を書かれてもわからないので、下のように書いてください
> #  stRThreadInfo    m_stRThreadInfo;   <-ここで2番目のエラーがでます。

すみません。以下を参照ください。

<RThread.h>--------------------------------
struct stRThreadInfo {   //WorkerThreadに渡したい引数
  :
  :
};

UINT WatchPort(LPVOID);  //起動したいグローバル関数

<RThread.cpp>------------------------------
#include "RThread.h"
#include "CDebDlg.h"

UINT WatchPort(LPVOID pParam)
{
  return 0;
}
<CDebDlg.h>--------------------------------
Class CDebDlg : public CDialog
{
public :
  :
  :
CWinThread*      m_pThread;  //戻り値、引数をそれぞれ宣言
stRThreadInfo    m_stRThreadInfo; <-- 2番目:RThread.cppをコンパイル中、この行で
                     エラーが出ます
  :
  :
};

<CDebDlg.cpp>--------------------------------
#include "RThread.h"     //それぞれのヘッダーファイルをインクルード
#include "CDebDlg.h"

//ある関数内で
m_pThread = AfxBeginThread((AFX_THREADPROC)WatchPort, (LPVOID)&m_stRThreadInfo, 
0, 0, 0, NULL);           <-- 1番目:ここの「WatchPort」のキャストが
                      失敗しているようです

----------------------------------------------

> 2番目のエラーは
> #include "CDebDlg.h" のみで #include "RThread.h" のない.cppならば出るでしょう。
> #include "RThread.h" は CDebDlg.h に書いたほうが楽です。

おっしゃる通りにしてみましたが、
そうしますと今度は"CDeb.cpp"をコンパイル中に、同じ行で別のエラーが出てしまいます。
「error C2011: 'stRThreadInfo' : 'struct' で示される型としてすでに定義されていま
す。」というエラーです。

> UINT WatchPort(LPVOID lpData); lpDataの部分は省略可能でしたっけ?

渡したい引数がなければ、省略可能のようです。


よろしくお願いします。

ele 2002/07/11(木) 21:58:36
一部解決です。
1番目のエラーですが、他のエラーを潰していくうちに消えてしまいました。
???という感じですが・・・。
元々スレッドを立てていなかったものを改良しているので、
(つい先程まで同じ名前の関数がCDebDlgクラス内とグローバルに存在していました)
コンパイラが困惑していたのかもしれません。

# そんなので質問するなって感じですよね、すみません・・・。

つい先程、同名の関数を削除してちょっとすっきりしたのですが、
2番目のエラーは今も尚、出続けています。


引き続きコメントお待ちしております。
どうか助けて下さい。

すも 2002/07/12(金) 08:30:40
CDebDlg.hないでRThread.hをインクルードしていないから
ではないでしょうか?

トオリスガリ 2002/07/12(金) 10:07:58
.hに2重インクルード回避のおまじないは書いてますか?

#ifndef _HOGE_H_   // _HOGE_H_の部分はヘッダーごとに変える
#define _HOGE_H_

#endif // end of _HOGE_H_

ele 2002/07/12(金) 11:34:34
[[解決]]
コメントありがとうございます。
おかげ様で解決致しましたので、ご報告します。
下の通りに追加してみました。

<RThread.h>--------------------------------
#ifndef _HOGE_H_         <-- 追加
#define _HOGE_H_ 1       <-- 追加
struct stRThreadInfo {   //WorkerThreadに渡したい引数
  :
  :
};
#endif  //end of _HOGE_H_<-- 追加

UINT WatchPort(LPVOID);  //起動したいグローバル関数
-------------------------------------------

これで2重インクルードが回避できました。
MFCではなくCでした…初歩的な問題ですみませんでした。

コメントを下さったトオリスガリさん、すもさん、本当にありがとうございました。


# もう少し気持ちに余裕を持ってやりたいと思います。ご迷惑をおかけしました。

古いスレッドには追加発言できません。