Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2010, 21:21   #1
mike_tihomirov
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 58
По умолчанию Передача метода класса в CreateThread

Учу многопоточность и вот столкнулся с вопросом передачи метода
класса в CreateThread.
Пояснения вопроса в коде.


Код:
#define MyPort 7500
#define sHELLO "Hello Socket\r\n"
#define PRINTUSERS if(nClients) printf("%d user on-line\n", nClients); else printf("No User on line\n");

class MYSERV
{
public:
	MYSERV();
public:
	void Run();
private:
	DWORD WINAPI TalkToClient(LPVOID pParam);
private:
	SOCKET sServer, sClientListen;
	HOSTENT MyHostent, *pMyHostent;
	sockaddr_in serv, ClientAddr;
	int ClientAddrSize, nClients;
	DWORD thID;
	HANDLE CT;
} MyServ, *pMyServ;
//-------------------------
MYSERV::MYSERV(){}
//------------------------------------------
void MYSERV::Run()
{
	WSADATA wsd;
	WSAStartup(MAKEWORD(2, 2), &wsd);
	//-------------------------------
	serv.sin_family = AF_INET;
	serv.sin_port = htons(MyPort);
	serv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	//-------------------------------
	ClientAddrSize = sizeof(ClientAddr);
	//-------------------------------
	sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	//-------------------------------
	bind(sServer, (sockaddr*) &serv, sizeof(serv));
	//-------------------------------
	listen(sServer, 5);
	//-------------------------------
	printf("Ozidanie podkluzenii...\n");
	//-------------------------------
	nClients = 0;
	while(sClientListen = accept(sServer, (sockaddr*) &ClientAddr, &ClientAddrSize))
	{
		nClients++;

		pMyHostent = gethostbyaddr((char*) &ClientAddr.sin_addr.S_un.S_addr, 4, AF_INET);

		printf("+%s [%s] new connect!\n",
			(pMyHostent) ? pMyHostent->h_name : "", inet_ntoa(ClientAddr.sin_addr));

		PRINTUSERS

//По моей задумке, здесь для каждого нового клиента вызывается функция TalkToClient в новом потоке, но как это сделать?(опыта маловато знаетели)
ибо на просто TalkToClient ессно выдает: error C3867: 'MYSERV::TalkToClient': function call missing argument list; use '&MYSERV::TalkToClient' to create a pointer to member

		CT = CreateThread(NULL, NULL, TalkToClient, (LPVOID)0, NULL, &thID);
		CloseHandle(CT);
	}
}
//------------------------------------------
DWORD WINAPI MYSERV::TalkToClient(LPVOID pParam)
{
	char buff[20 * 1024];
	
	send(sClientListen, sHELLO, sizeof(sHELLO), 0);

	int bytes_recv = recv(sClientListen, &buff[0], sizeof(buff), 0);

	while(bytes_recv != SOCKET_ERROR)
		send(sClientListen, &buff[0], bytes_recv, 0);
	//----------------------------------
	nClients--;
	printf("-disconnect\n"); 
	PRINTUSERS

	closesocket(sClientListen);
	return 0;
}
//------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
	MYSERV myServ;
             myServ.Run();
	return 0;
}
Заранее спасибо
Не бывает глупых вопросов.
Глупец тот, кто не спрашивает.
mike_tihomirov вне форума Ответить с цитированием
Старый 17.07.2010, 01:53   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

должна быть процедура передана, а не метод класса(метод класса модно передать через процедуру переходник)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.07.2010, 12:37   #3
mike_tihomirov
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 58
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
должна быть процедура передана, а не метод класса(метод класса модно передать через процедуру переходник)
1)Что такое процедура-переходник?
И кодом можно пояснить.
Заранее спасибо.
Я понимаетели не волшебник, а только учусь.
Не бывает глупых вопросов.
Глупец тот, кто не спрашивает.
mike_tihomirov вне форума Ответить с цитированием
Старый 17.07.2010, 14:13   #4
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

может так?
Код:
//По моей задумке, здесь для каждого нового клиента вызывается функция TalkToClient в новом потоке, но как это сделать?(опыта маловато знаетели)
//ибо на просто TalkToClient ессно выдает: error C3867: 'MYSERV::TalkToClient': function call missing argument list; use '&MYSERV::TalkToClient' to create a pointer to member
		{
			LPTHREAD_START_ROUTINE p;
		__asm
		{
			lea eax,MYSERV::TalkToClient
				mov p,eax
		}

		CT = CreateThread(NULL, NULL, p, (LPVOID)0, NULL, &thID);
		CloseHandle(CT);
		}
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает обращение к Chart1 из метода класса Дима я Общие вопросы Delphi 8 01.04.2010 21:06
Почему из метода класса нельзя обратиться к компоненту на форме? Дима я Общие вопросы Delphi 2 28.03.2010 13:21
Адрес метода класса? VintProg Общие вопросы Delphi 6 27.09.2009 13:10
mootools: вызов метода класса в цикле each toXx JavaScript, Ajax 1 18.03.2009 19:20
Передача метода класса в качестве параметра в другой метод Dmytry87 Общие вопросы C/C++ 0 12.11.2008 15:28