powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача значения в поток
8 сообщений из 8, страница 1 из 1
Передача значения в поток
    #34552016
M.A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Пытаюсь создать поток и передать в него значение. Не получается.
Создание потока:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
…
if ((hSocket =  socket(AF_INET, SOCK_STREAM, 0 ))== INVALID_SOCKET)
{
	pmyclassvfp->DoCmd(_bstr_t("WsMessage('INVALID_SOCKET')"));
	return;
}
myaddr.sin_addr.s_addr  =  htonl(INADDR_ANY);
myaddr.sin_family       =  AF_INET; 
myaddr.sin_port         =  htons(tcpport);

if(bind(hSocket,(PSOCKADDR) &myaddr, sizeof(myaddr))== SOCKET_ERROR)
{
 pmyclassvfp->DoCmd(_bstr_t("WsMessage('bind error')"));
 return;
}
…
HANDLE hThr= CreateThread(NULL, 0 ,(LPTHREAD_START_ROUTINE)hSocket,(LPVOID) hSocket , 0 ,&uThrID);

В поточной функциии:

Код: plaintext
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.
void  ListenS(void* pParams)
{
CoInitialize( 0 );
WSAEVENT hlistEvent;
WSANETWORKEVENTS wsaConnectEvents;
SOCKET hS = (SOCKET) pParams; //sH; <- ? 
SOCKET  sAccept;
SOCKADDR_IN csa;
int lenaddr  = sizeof(csa);
unsigned long uThrIDLoc;

SetEvent (hTStart);
hlistEvent = WSACreateEvent();
WSAEventSelect(hS, hlistEvent, FD_ACCEPT);
ApplicationPtr IApp;  
CoGetInterfaceAndReleaseStream(pStream, IID_Application,  (void**) &IApp);  

while (TRUE)
{
	if(listen(hS, 5 )!= 0 )
	{
	 IApp->DoCmd(_bstr_t("WsMessage('Error listen')"));
	 break;
	}

….
}
И все. Получаю 'Error listen'. Однако если передать hSocket через глобальную переменную все ОК, работает как надо.

В чем может быть дело ?
...
Рейтинг: 0 / 0
Передача значения в поток
    #34552381
Serge Volkoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
M.A.
HANDLE hThr= CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)hSocket ,(LPVOID) hSocket ,0,&uThrID);

В чем может быть дело ?

Это опечатка? Или у Вас так в программе?
...
Рейтинг: 0 / 0
Передача значения в поток
    #34552724
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и не используй CreateThread. Юзай _beginthreadex
...
Рейтинг: 0 / 0
Передача значения в поток
    #34552759
Serge Volkoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tracerи не используй CreateThread. Юзай _beginthreadex
Чересчур категорично.
Видно же, что код сугубо для Windows. А вызовы родного API без оберток эффективнее.
Кроме того, у CreateThread параметры типизированы. Хотя и это, судя по листингу, не помогло :-)
...
Рейтинг: 0 / 0
Передача значения в поток
    #34553072
Baikaly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А какое значение возврощает
Код: plaintext
listen(hS, 5 )
?
...
Рейтинг: 0 / 0
Передача значения в поток
    #34553076
Baikaly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. я имел введу так
Код: plaintext
1.
2.
3.
4.
5.
6.
if(listen(hS, 5 )!= 0 )
{
       int a = WSAGetLastError(void);
       IApp->DoCmd(_bstr_t("WsMessage('Error listen')"));
       break;
}
Какой код ошибки будет в переменной a?
...
Рейтинг: 0 / 0
Передача значения в поток
    #34553236
M.A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторM.A.

HANDLE hThr= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)hSocket,(LPVOID) hSocket ,0,&uThrID);

В чем может быть дело ?


Это опечатка? Или у Вас так в программе?
да, опечатка.

авторif(listen(hS,5)!=0)
{
int a = WSAGetLastError(void);
IApp->DoCmd(_bstr_t("WsMessage('Error listen')"));
break;
}


нет не покатит. У этого интерфейса свои ошибки. Даже если ошибка что-то значит - это ничего не значит.
Блин, ну его нафиг, нихира не происходит. Буду клиентов цеплять запирая в критическую секцию.
...
Рейтинг: 0 / 0
Передача значения в поток
    #34570940
Dmitry V. Liseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi!

Serge Volkoff
Tracer
и не используй CreateThread. Юзай _beginthreadex
Чересчур категорично.
Видно же, что код сугубо для Windows. А вызовы родного API без оберток эффективнее.
Оно конечно эффективнее, вот только глючить будет в неожиданных местах :-), ибо _beginthreadex
кроме создания потока еще и корректно инициализирует рантаймовую библиотеку.
MSDNWarning If you are going to call C run-time routines from a program built with LIBCMT.LIB, you must start your threads
with the _beginthread function. Do not use the Win32 functions ExitThread and CreateThread. Using SuspendThread can lead to a
deadlock when more than one thread is blocked waiting for the suspended thread to complete its access to a C run-time data
structure.
Ну и линковать соответственно надо не с LIBC, а с LIBCMT.
____________________________
С уважением, Лисеев Дмитрий.
http://private.peterlink.ru/dimik/
PGP key fingerprint: 09 28 74 28 6C 39 62 29 2E CB 95 03 4F 04 33 73

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача значения в поток
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]