Witam,
tworze program do komunikacji sieciowej, chcę przerzucić część odpowiedzialną za połączenie z serwerem, za które obecnie odpowiada Button Connect na nowy wątek. Projekt jest oczywiście z użyciem formatki. Chce żeby wyglądało mniej więcej tak. User naciska button Connect, w kodzie obsługi jest utworzenie nowego wątku, który zajmuje się połączeniem z serwerem i problem w tym, ze nie wiem jak to zrobić
Próbuje coś takiego :
System::Void ConServ(void * ptr) {
const char * hostName = "77.253.29.37";
const char * port = "1234";
char * str = "client -> ";
System::String ^s = gcnew String(str);
WRequiredVersion = MAKEWORD(2, 0);
if (WSAStartup(WRequiredVersion, &WData) != 0) {
this->logInfo->AppendText(s + "WSAStartup failed!\n");
} else {
this->logInfo->AppendText(s + "WSAStartup - OK\n");
}
//look up server's IP address
lpstServerEnt = gethostbyname(hostName);
if(! lpstServerEnt) {
this->logInfo->AppendText(s + "Can't get the sever's IP address\n");
}
//create socket
SSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
this->logInfo->AppendText(s + "Socket created\n");
//server info
memset(&stServerAddr, 0, sizeof(struct sockaddr));
stServerAddr.sin_family = AF_INET;
memcpy(&stServerAddr.sin_addr.s_addr, lpstServerEnt->h_addr, lpstServerEnt->h_length);
stServerAddr.sin_port = htons(atoi(port));
//connect to the server
nConnect = connect(SSocket, (struct sockaddr*)&stServerAddr, sizeof(struct sockaddr));
if (nConnect < 0) {
this->logInfo->AppendText(s + "Can't connect to the server\n");
} else {
connected = true;
this->logInfo->AppendText(s + "Connected\n");
}
// odbiera liczbę funkcji
nBytes = recv(SSocket, (char*)&liczbaFunkcji, sizeof(int), 0);
// tworzy dynamiczną tablice przechowującą dane o funkcjach
if (flag) {
FunList = new struct funkcja[liczbaFunkcji];
flag = false;
}
// odbiera informacje o funkcjach
nBytes = recv(SSocket, cbBuf, sizeof(cbBuf), 0);
char nazwa[20];
char opis[128];
for (int i=0; i<liczbaFunkcji; i++) {
FunList[i].id = (int)cbBuf[i*rozmiarStruct];
FunList[i].argNum = (int)cbBuf[4 + i*rozmiarStruct];
for(int j=0; j<sizeof(FunList[i].name); j++)
nazwa[j] = (char)cbBuf[8 + i*rozmiarStruct + j];
for(int j=0; j<sizeof(FunList[i].describe); j++)
opis[j] = (char)cbBuf[28 + i*rozmiarStruct + j];
FunList[i].name = nazwa;
FunList[i].describe = opis;
}
_endthread();
}
to jest funkcja, która będzie znajdować się w nowo utworzonym wątku
w obsłudze kliknięcia natomiast mam
_beginthread(&klient::Form1::ConServ, 0, (void*)0);
no i zwraca błąd
1>c:\projekty\sk - projekt\klient\klient\Form1.h(335) : error C3374: can't take address of 'klient::Form1::ConServ' unless creating delegate instance
może ktoś bawił się formatką z użyciem kilku wątków i jest w stanie mi pomóc bo ja nie wiem jak to zrobić, żeby funkcjonowało
w ramach wyjaśnień funkcję tą umieściłem też w nagłówku, w którym znaduje się cała obsługa formatki zaraz nad obsługą zdarzenia kliknięcia na button Connect. tak samo funkcja jest typu System::Void a nie zwyczajnie void, ponieważ bez tego nie mogę uzyskać dostępu do formatki, szczególnie chodzi mi tu o komponent RichTextBox na którym ma wyświetlać aktualny stan łączenia