thread

hi, I am trying to use multithreading for fuction which is identified in the class, but I confront to this error:
error C2664: '_beginthread' : cannot convert parameter 1 from 'void (__thiscall Eprime::* )(void *)' to 'void (__cdecl *)(void *)'
1> There is no context in which this conversion is possible

here is source of my class:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include "StdAfx.h"
#include "test.h"
#define WIN32_LEAN_AND_MEAN
 
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <process.h>
#include <windows.h>
 
 
// link with Ws2_32.lib
//#pragma comment(lib, "Ws2_32.lib")
 
#define DEFAULT_PORT "27015"
#define DEFAULT_BUFFER_LENGTH    512

test::test(void)
{
}

test::~test(void)
{
}
void  test::TCPServer(void  *param)
{
WSADATA wsaData;
 
    // Initialize Winsock
    int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if(iResult != 0)
    {
        printf("WSAStartup failed: %d\n", iResult);
        //return 1;
    }
 
    struct addrinfo    *result = NULL,
                    hints;
 
    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;        // Internet address family is unspecified so that either an IPv6 or IPv4 address can be returned
    hints.ai_socktype = SOCK_STREAM;    // Requests the socket type to be a stream socket for the TCP protocol
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;
 
    // Resolve the local address and port to be used by the server
    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (iResult != 0)
    {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        //return 1;
    }
 
    SOCKET ListenSocket = INVALID_SOCKET;
 
    // Create a SOCKET for the server to listen for client connections
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
 
    if (ListenSocket == INVALID_SOCKET)
    {
        printf("Error at socket(): %d\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        //return 1;
    }
 
    // Setup the TCP listening socket
    iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
 
    if (iResult == SOCKET_ERROR)
    {
        printf("bind failed: %d", WSAGetLastError());
        freeaddrinfo(result);
        closesocket(ListenSocket);
        WSACleanup();
        //return 1;
    }
 
    freeaddrinfo(result);
 
    // To listen on a socket
    if ( listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
    {
        printf("listen failed: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
       // return 1;
    }
 
    SOCKET ClientSocket;
 
    ClientSocket = INVALID_SOCKET;
 
    // Accept a client socket
    ClientSocket = accept(ListenSocket, NULL, NULL);
 
    if (ClientSocket == INVALID_SOCKET)
    {
        printf("accept failed: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
       // return 1;
    }
    
    char recvbuf[DEFAULT_BUFFER_LENGTH];
    int iSendResult;
 
    // reveice until the client shutdown the connection
    do {
        iResult = recv(ClientSocket, recvbuf, DEFAULT_BUFFER_LENGTH, 0);
        if (iResult > 0)
        {
            char msg[DEFAULT_BUFFER_LENGTH];
            memset(&msg, 0, sizeof(msg));
            strncpy(msg, recvbuf, iResult);
 
            printf("Received: %s\n", msg);
 
            iSendResult = send(ClientSocket, recvbuf, iResult, 0);
 
            if (iSendResult == SOCKET_ERROR)
            {
                printf("send failed: %d\n", WSAGetLastError());
                closesocket(ClientSocket);
                WSACleanup();
              //  return 1;
            }
 
            printf("Bytes sent: %ld\n", iSendResult);
        }
        else if (iResult == 0)
            printf("Connection closed\n");
        else
        {
            printf("recv failed: %d\n", WSAGetLastError());
            closesocket(ClientSocket);
            WSACleanup();
            //return 1;
        }
    } while (iResult > 0);
 
    // Free the resouces
    closesocket(ListenSocket);
    WSACleanup();
	//test *pTCPServer = (test *) param; 
	//return 0;

}

void test::starttask(void)  
{  
_beginthread(&test::TCPServer,0,null);  
} 

here is header of my class:
1
2
3
4
5
6
7
8
9
10
#pragma once

class test
{
public:
	test(void);
	~test(void);
	void  TCPServer(void *param);
	void test::StartTask(void) ;
};


thanks in advance,
Mina
Last edited on
The error indicates that you're attempting to call a function that expects a pointer to non-member function (likely _beginthread) and passing a pointer to a non-static member function (&test::TCPServer); this is not possible.

Either use a static/non-member function, or switch to a more flexible library such as the standard C++ threads or boost.
Topic archived. No new replies allowed.