2011-11-06 2 views
1

개체에 스레드를 만들려고하지만 '&' : illegal operation on bound member function expression. 오류가 발생했습니다. 멤버 함수를 정적으로 만들어야한다는 것을 알았지 만 오류가 발생하면CreateThread 멤버 함수를 사용하여 문제가

left of '.dac_ping' must have class/struct/union 말을하는 것은 내가 노력하고 무엇 :

class Dac 
    { 
    private: 
     network_com com; 
     HANDLE ping_thread; 
     DWORD dping_thread; 

     static DWORD WINAPI ping_loop(void* param) 
      { 
      while (com.dac_ping() == 0) 
       Sleep(900); 

      return 1; //since this is an infinite loop, if the loop breaks, it has failed 
      } 


    public: 
     Dac() 
      { 
      } 

     ~Dac() 
      { 
      } 

     void find_dac() 
      { 
      com.find_dac(); 
      com.print_dac_info(); 
      } 


     void connect_and_keep_alive() 
      { 
      if (com.dac_connect() == 0) 
       ping_thread = CreateThread (NULL , 0, ping_loop, NULL, 0, &dping_thread); 
      } 

    }; 

답변

4

static 기능은 특정 인스턴스에 바인딩되지 않습니다 this 포인터가없고 "멤버 변수"가 없습니다. this 포인터를 함수의 인수로 전달한 다음 Dac*에 캐스팅하고 여기에서 멤버 변수에 액세스하십시오.

그래서 당신은

ping_thread = CreateThread (NULL , 0, ping_loop, (LPVOID)this, 0, &dping_thread); 

을하고 변경할 수 있습니다 귀하의 ping_loop이에 :

static DWORD WINAPI ping_loop(void* param) 
{ 
    Dac* dac = (Dac*)param; 
    while (dac->com.dac_ping() == 0) 
     Sleep(900); 

    return 1; //since this is an infinite loop, if the loop breaks, it has failed 
} 
관련 문제