none
VC++でのスレッド処理 RRS feed

  • 質問

  • シリアル通信のプログラムを作成してますが、受信イベントをスレッドにて処理しようと下記のようにスレッド生成をコーディングしてますが、コンパイラエラーになります。

      m_pThread = AfxBeginThread(ReadThread, 0, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);

    スレッド部分は

    UINT CSerialCommView::ReadThread(LPVOID)
    {
     HANDLE  hAndle;
     DWORD  dwEvent;

     while (!m_nGoOut)
     {
      m_Key.Lock();          // COMポートハンドルにアクセスする場合ロック
      hAndle = m_hComm;
      m_Key.Unlock();          // ロック解除

      WaitCommEvent(hAndle, &dwEvent, NULL);    // 受信イベントで待機
      if (dwEvent == EV_RXCHAR)
      {             // 受信イベントがEV_RCCHARならウィンドウメッセージをポストする
       ::PostMessageW(m_vhWnd, WM_READ_END, 0, 0);
      }
     }
     return 0;
    }

    としています。

    エラーは、

     error C3867: 'CSerialCommView::ReadThread': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&CSerialCommView::ReadThread' を使用してください

    です。

    対処方法をお教えください。

    2012年8月22日 10:34

回答

  • 関数ポインタとして渡すためには、静的なメンバー関数である必要があります。
    (クラスの定義で static キーワードを付与した関数であること)

    通常のメンバー関数を指定した場合にそのエラーが表示されますので、静的なメンバー関数に変更してください。
    m_vhWnd など、必要な情報は LPVOID とされている箇所を通して受け渡ししてください。

    • 回答としてマーク B_Wolf 2012年8月23日 10:31
    2012年8月22日 13:31
    モデレータ
  • C++ のメンバ関数は暗黙の第一引数 this を取るため、

    >UINT CSerialCommView::ReadThread(LPVOID)

    は AfxBeginThread の第一引数が要求する型を満たしていません。

    なので、「型が違う」系のエラーになります。

    >対処方法をお教えください。

    CSerialCommView::ReadThread() を static メンバにしてください。

    • 回答としてマーク B_Wolf 2012年8月23日 10:31
    2012年8月22日 13:36

すべての返信

  • 関数ポインタとして渡すためには、静的なメンバー関数である必要があります。
    (クラスの定義で static キーワードを付与した関数であること)

    通常のメンバー関数を指定した場合にそのエラーが表示されますので、静的なメンバー関数に変更してください。
    m_vhWnd など、必要な情報は LPVOID とされている箇所を通して受け渡ししてください。

    • 回答としてマーク B_Wolf 2012年8月23日 10:31
    2012年8月22日 13:31
    モデレータ
  • C++ のメンバ関数は暗黙の第一引数 this を取るため、

    >UINT CSerialCommView::ReadThread(LPVOID)

    は AfxBeginThread の第一引数が要求する型を満たしていません。

    なので、「型が違う」系のエラーになります。

    >対処方法をお教えください。

    CSerialCommView::ReadThread() を static メンバにしてください。

    • 回答としてマーク B_Wolf 2012年8月23日 10:31
    2012年8月22日 13:36
  • Azuleanさん、渋木宏明さんご回答ありがとうございます。

    おかげさまで、無事エラー無く、コンパイルできました。

    2012年8月23日 10:33