- 締切済み
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' : 定義されていない識別子です。 とエラーがでます。何が問題なんでしょうか。よろしくお願いします。
- nyohori
- お礼率100% (1/1)
- C・C++・C#
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- kmb01
- ベストアンサー率45% (63/138)
MSDN http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_MFC_CWinThread.asp 必要条件 ヘッダー : afxwin.h とあります。 #include <afxwin.h> が必要なのでは。
関連するQ&A
- マルチスレッドのスレッド数を増やしたい
<プログラム環境> 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#
- VisualStudio6.0(C++)にてコンパイルが通らない(He
VisualStudio6.0(C++)にてコンパイルが通らない(HelpMe)。 既存のPGに関数を追加して処理を増やそうとしたら、コンパイルで"定義されていない識別子です"とエラーになってしまいます。PGはこんな感じになります。 //-- UINT DoAllThread( LPVOID dammy); //-- void CHopeView::OnDoall(){ AfxBeginThread(DoAllThread,&tm); } //-- UINT DoAllThread( LPVOID dammy) { OnSeilf(); OnGailf(); OnKeilf();//今回この一行を追加したらコンパイルが通らなくなりました。 return 0; }; //-- void OnKeilf() { //--まだ何も処理を書いていない } エラー内容は error C2065: 'OnKrtlf' : 定義されていない識別子です。 error C2373: 'OnKrtlf' : 再定義されています。異なる型修飾子です。 になります。 宜しくお願いします。
- ベストアンサー
- C・C++・C#
- スレッド内のCString使用
VC++を始めて約3ヶ月で、現在、シリアル通信プログラムを作成しています。 通信用のウインドウを生成し、その時に受信用のスレッドを生成しているのですが、その受信スレッド内でCString変数を使う(何か挿入)と、終了時に「Detected memory leaks!」が発生します。 起動中の動作は今のところ問題ないようですが、終了時といえど、エラーが発生するという事は、何かまずい処理としていると思われますので質問させて頂きました。 これは、と思われる方は助言をお願いします。 環境 Visual C++6.0 Windows XP Pro SP3 Create時 m_hRxThread = ::AfxBeginThread(RxThreadFunc, (LPVOID)this); スレッドの宣言 static UINT RxThreadFunc(LPVOID p); 受信スレッド UINT CRsNetWnd::RxThreadFunc(LPVOID p) { CString strRecvData; char szRxDat[1024]; char szRecvData[1024]; ・ ・ ・ ・ pWnd->m_bRxThreadEndFlag = FALSE; PurgeComm(pWnd->m_hComm, PURGE_RXCLEAR); while(pWnd->m_bRxThreadEndFlag == FALSE) { --- 省略 --- if((szRxDat[0] == 0x02) && (bReadError == FALSE)) { ZeroMemory(szRecvData, sizeof(szRecvData)); CopyMemory(szRecvData, &szRxDat[1], (dwWrite - 2)); // STX、ETX以外を抜き出す strRecvData = szRecvData; // ここをコメントにすると、エラーは発生しない! --- 省略 --- } } PurgeComm(pWnd->m_hComm, PURGE_RXCLEAR); TRACE0( "受信スレッド終了\n" ); ::AfxEndThread(0); return 0; } 以上、よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C#2005のスレッド
本スレッドとサブスレッドがあり、 サブそレッドが終了するまで本スレッドで待機する形をとっていますが、 (メソッドを実行後のreturn終了待ちなので) サブスレッドが終了するまでフォームが固まってしまいます。 でもサブスレッドでDoEventを起こすとエラーとなります。 さらにサブスレッド2で while(true) {Application.DoEvents();} を実行すればフォームは固まりませんが、 パフォーマンスが50%くらいになってしまいます。 サブスレッドで実行しつつ、 低パフォーマンスで、 フォームが動かせるようにするには どのような組み方をしたらいいのでしょうか?
- ベストアンサー
- その他(プログラミング・開発)
- 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); } }
- ベストアンサー
- その他(プログラミング・開発)
- マルチスレッドについて
VC++を使用しています。 マルチスレッドの引数の使用法について教えてください。 int A; int B; AfxBeginThread((AFX_THREADPROC) ::WaitThread, (LPVOID)this); UINT WaitThread( LPVOID pParam ) { if(A == 0) { … } if(A == 1) { … } if(B == 0) { … } if(B == 1) { … } } のようなプログラムを作ろうとしています。 引数の受け渡し方法教えてください。 お願いします。
- ベストアンサー
- C・C++・C#
- [VC++] AfxBeginThreadで生成したスレッドの監視方法について
お世話になります。 VC++でスレッドプログラムを作っています。 AfxBeginThreadでワーカースレッドを作成し、その中でダイアログを表示する プログラムです。 問題は、ワーカースレッドがある処理状態に至ったことを メインスレッドで検知したいのですが、それがうまく いかないということです。 コードの概略をしめします。 <メインスレッド側> void CTestApp::OnTest() { CTestDlg dlg; dlg.IsContinue = FALSE; pThread = AfxBeginThread(TestDlg::Thread, (void*)&dlg); while (!dlg.IsContinue) { // <----問題:このループ処理を抜けれない! Sleep(0); } } <ワーカースレッド側> UINT TestDlg::Thread(LPVOID pParam){ TestDlg* pDlg = (TestDlg*)pParam; pDlg->Create(TestDlg::IDD); pDlg->ShowWindow(SW_SHOW); pDlg->IsContinue = TRUE; //<--ここでフラグを変更しているのに。 while(pDlg->IsContinue) { MSG msg; if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } pDlg->DestroyWindow(); return 0; } ---- メインスレッドのSleep(0)で待つのを AfxGetApp()->PumpMessage()に変更すると ループを抜けるようなのですが、どうも納得できません。 上記のプログラムで問題、もしくはプロジェクトの 設定等に不備がある可能性がありましたら 御教授いただけたら幸いです。 よろしくおねがいいたします。
- ベストアンサー
- その他(プログラミング・開発)
- [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でタイムアウトの使い方がよく分からない…、 もっとスマートな方法があれば教えていただきたいです。)
- 締切済み
- C・C++・C#
- 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で作らないといけない??) すいませんが、どなたかご教授おねがいいたします。
- ベストアンサー
- C・C++・C#
お礼
本当でした・・・ ありがとうございます!