開発環境は、
OS:Windows10
IDE:Visual C++ 2022
MFCでダイアログベースプログラムを作成しています。
ソケット通信を利用して音声認識プログラムを作成しているのですが、サーバからの受信を無限ループで行っています。
ただ、無限ループの弊害でツールチップの表示が出来ないようになってしまいました。
そこで、無限ループの関数を別のスレッドで動かそうと以下のプログラムを書きました。
void Crecv3Dlg::OnClickedButton1()
{
hThread = (HANDLE)_beginthreadex(NULL, 0, &Func, &DoEvents, 0, &threadID);
}
すると、エラーになりました。
error C2276: '&': 仮想関数のアドレスを取ろうとしました。
調べると、staticを使うといいことがわかりました。
そこで、無限ループの関数とその中で使っている変数をstaticにしました。
しかし、まだエラーが残っています。
error C2352: 'CWnd::UpdateData': 非静的メンバー関数の呼び出しにはオブジェクトが必要です
UpdateDataなど、Visual C++でよく使う関数をstaticにする方法はありますか?
結局生成AIで調べたところ、
解決方法
正しいインスタンスで呼び出す: UpdateData メソッドは、通常ダイアログクラスやウィンドウクラスで使用されるので、そのクラスのインスタンスを通じて呼び出す必要があります。
例えば、CDialog クラスの場合:
cpp
コードをコピーする
CDialog dlg;
dlg.UpdateData(TRUE); // TRUEはダイアログからコントロールにデータを転送する
この手法を使うことで、コンパイルは通りました。
ただ今度は、リンクエラーが出ました。
1>recv3Dlg.obj : error LNK2019: 未解決の外部シンボル "public: static void __cdecl CWnd::UpdateWindow(void)" (?UpdateWindow@CWnd@@SAXXZ) が関数 "public: static void __cdecl Crecv3Dlg::DoEvents(void)" (?DoEvents@Crecv3Dlg@@SAXXZ) で参照されました
1>recv3Dlg.obj : error LNK2019: 未解決の外部シンボル "public: static int __cdecl CWnd::MessageBoxA(char const *,char const *,unsigned int)" (?MessageBoxA@CWnd@@SAHPEBD0I@Z) が関数 "public: void __cdecl Crecv3Dlg::OnClose(void)" (?OnClose@Crecv3Dlg@@QEAAXXZ) で参照されました
1>recv3Dlg.obj : error LNK2019: 未解決の外部シンボル "public: static int __cdecl CWnd::UpdateData(int)" (?UpdateData@CWnd@@SAHH@Z) が関数 "public: static void __cdecl Crecv3Dlg::DoEvents(void)" (?DoEvents@Crecv3Dlg@@SAXXZ) で参照されました
1>recv3Dlg.obj : error LNK2001: 外部シンボル "public: static int Crecv3Dlg::err" (?err@Crecv3Dlg@@2HA) は未解決です
1>recv3Dlg.obj : error LNK2001: 外部シンボル "public: static class CMyAsyncSocket Crecv3Dlg::cmas" (?cmas@Crecv3Dlg@@2VCMyAsyncSocket@@A) は未解決です
1>recv3Dlg.obj : error LNK2001: 外部シンボル "public: static int volatile Crecv3Dlg::gfStopFlag" (?gfStopFlag@Crecv3Dlg@@2HC) は未解決です
1>recv3Dlg.obj : error LNK2001: 外部シンボル "public: static char * Crecv3Dlg::buffer" (?buffer@Crecv3Dlg@@2PADA) は未解決です
1>recv3Dlg.obj : error LNK2001: 外部シンボル "public: static unsigned long Crecv3Dlg::d" (?d@Crecv3Dlg@@2KA) は未解決です
1>recv3Dlg.obj : error LNK2001: 外部シンボル "public: static void * Crecv3Dlg::lpMsgBuf" (?lpMsgBuf@Crecv3Dlg@@2PEAXEA) は未解決です
1>recv3Dlg.obj : error LNK2001: 外部シンボル "public: static struct tagMSG Crecv3Dlg::msg" (?msg@Crecv3Dlg@@2UtagMSG@@A) は未解決です
1>recv3Dlg.obj : error LNK2001: 外部シンボル "public: static class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > Crecv3Dlg::m_recv" (?m_recv@Crecv3Dlg@@2V?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A) は未解決です
エラーになっている変数はstaticにしたものばかりです。
解決方法を教えてください。