2011-03-20 3 views
1

J'ai eu une erreur de lien lorsque j'ai essayé d'accéder à un vecteur en dehors de mon thread. Ma conception est la suivante: lorsque je reçois un message d'un client, je souhaite que le massage ou les données soient dans ma file d'attente de données pour une opération ultérieure. Mais je ne peux pas les faire travailler. Voici mes codes:Problème: Accès au vecteur dans un thread

fichier .cpp:

// Inside the recv thread 
start: 
    err = recvfrom(RecvSocket, lpData->RecvBuf, BufLen, 0, (SOCKADDR *)&lpData->SenderAddr, &SenderAddrSize); 
    //lpData is used to access Recv Structure which stores the attributes of the server and client. 

    switch(lpData->port) 
    { 
     case 6516: 
     { 
      BuffStack1.push_back(lpData->RecvBuf); 
      break; 
     } 

     case 6517: 
     { 
      break; 
     } 

     case 6518: 
     { 
      break; 
     } 
    } 

goto start; 

.h:

class CUdpSocket 
{ 
public: 
    CUdpSocket(void); 
    ~CUdpSocket(void); 
    void ServerRecv(int port); 
    void ClientSend(const char *ip, int port, const char *buff); 
    unsigned static __stdcall ServerRecvThread(void *arguments); 
    unsigned static __stdcall ClientSendThread(void *arguments); 
    CString static Itoa(int data); 
    void Mix(); 

private: 
    RecvStruct *pRecvData; 
    SendStruct *pSendData; 
    vector<HANDLE>threadStl; 
    static vector<char*>BuffStack1; // Here is my stack vector 
    static vector<char*>BuffStack2; 
    static vector<char*>BuffStack3; 
    HANDLE hThread; 
    unsigned threadID; 
    static BufferData *ptrBufferData; 
}; 

Je suis un peu confus si je dois mettre statique ou non. Et quand je mets statique, l'erreur sera:

error LNK2001: unresolved external symbol "private: static class std::vector<char *,class std::allocator<char *> > CUdpSocket::BuffStack1" ([email protected]@@[email protected][email protected]@[email protected]@@[email protected]@A) 

Et si je ne l'ai pas mis déclaration statique, l'erreur dit:

error C2228: left of '.push_back' must have class/struct/union 

S'il vous plaît aider.

Merci.

Répondre

3

Je pense que le problème est qu'en C++, l'utilisation de static membres de données dans une classe est un processus en deux étapes. Tout d'abord, vous devez déclarer la variable static, indiquant qu'il a un nom et un type, puis vous devez définir la variable static pour lui donner l'espace de stockage dans l'une des unités de traduction. Je suppose que vous avez fait ce premier pas mais pas le second.

Pour définir une variable static, mettre une définition comme celui-ci dans le fichier .cpp:

vector<char*> CUdpSocket::BuffStack1; 

Notez que vous ne pas répétez le mot-clé static ici. Au lieu de cela, vous donnez simplement le type et le nom complet du membre de données static. Si vous souhaitez utiliser un constructeur autre que celui par défaut pour le membre de données static, vous pouvez le faire ici également.

Espérons que cela aide!

PS. Veuillez ne pas utiliser d'étiquettes et goto s pour implémenter votre boucle ... utilisez plutôt une boucle while(true)! :-)

EDIT: Si vous devez accéder à ces vector depuis le thread, assurez-vous que la synchronisation est appropriée. Il n'est pas sûr de lire et d'écrire un vector à partir de plusieurs threads sans s'assurer qu'au maximum un thread peut le modifier à la fois.

+0

Je ne peux pas les faire fonctionner. Pourriez-vous s'il vous plaît me montrer comment? –

+0

Pouvez-vous être plus précis? Quelle erreur obtenez vous? Qu'est-ce qui ne fonctionne pas en particulier? – templatetypedef

+0

Peu importe. Je l'ai déjà compris. Merci pour ton aide. –