2016-04-21 3 views
-2

Ich versuche, einen Winsock-Server zu machen, der viele Clients akzeptiert. Um zu machen, dass ich gesagt wurde, ein Vektor von threads.So zu verwenden, das ist, was ich bin Tring diesen Fehler zu tun, aber ich habe:Vektor der Themen

Error 3 error C2064: the term does not evaluate to a function with 0 arguments C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ include \ functional 1152 1 Server

Und mein Server-Code ist wie folgt:

using namespace std; 
    int __cdecl NewClient(SOCKET ListenSocket, SOCKET ClientSocket, char *recvbuf, int recvbuflen, int iSendResult, int iResult) 
    vector<thread> thred; 

    int __cdecl main(void) { 

      //things 
      SOCKET ListenSocket=INVALID_SOCKET; 
      SOCKET ClientSocket=INVALID_SOCKET; 
      char recvbuf[DEFAULT_BUFLEN]; 
      int recvbuflen = DEFAULT_BUFLEN; 
      int iSendResult=0; 
      int iResult; 
      thred.push_back(thread(NewClient,ListenSocket, ClientSocket, recvbuf, recvbuflen, iSendResult, iResult)); 
      thred[thred.size()-1].detach(); 
    } 

    int __cdecl NewClient(SOCKET ListenSocket, SOCKET ClientSocket, char *recvbuf, int recvbuflen, int iSendResult, int iResult){ 
    //things 
    } 

Ich denke, der Fehler ist, wo ich versuche, den Pushback des neuen Threads zu machen. Wird der Pushback so verwendet oder was kann ich tun?

Jede Hilfe wird geschätzt. Danke im Voraus.

+0

cppreference.com sagt "std :: thread ist nicht CopyConstructible oder CopyAssignable, obwohl es MoveConstructible und MoveAssignable ist." –

Antwort

2

Is the pushback used like this?Or what can I do?

cppreference.com sagt "std :: thread nicht CopyConstructible oder CopyAssignable ist, obwohl es MoveConstructible und MoveAssignable ist."

Bedenken Sie:

std::vector <std::thread*> thred; 

und damit verbundene Anpassungen.

Verwenden Sie auch einen intelligenten Zeiger.

+0

10 Vielen Dank für Ihre Antwort, ich basierte meinen Code auf das erste Beispiel: [link] (https://www.justswaresolutions.co.uk/threading/managing_threads_with_a_vector.html), also ist dies nicht möglich? Und mit 'std :: vector thred; 'Was wären die Anpassungen? – 19mike95

+0

Dieser Artikel sagt, es sollte funktionieren, aber meine jüngste Erfahrung habe ich nicht herausgefunden, wie. Außerdem gibt es Gründe dafür und ich bevorzuge einen Zeiger. In meinem letzten Versuch habe ich den Vektor "thread *" verwendet. Andere Anpassungen wären die Verwendung von thred [i] -> join() anstelle von thred [i] .join() (d. H. Dereferenzierung des Zeigers). Und mit root pointer löschte mein dtor explizit jedes Vektorelement mit back(), pop_back() und delete. Ich denke, ein Thread hat wenig anderes, was man davon aufrufen muss, also ist ein Zeiger wirklich kein Problem. Viel Glück. –

+0

Nur erinnert, siehe "void push_back (T && Wert);" (2) (seit C++ 11). Ich habe es noch nicht ausprobiert. –