Потоки

  • Автор темы SkunkLover
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

SkunkLover

Гость
#1
Такая вещь: работает сервер, к нему подключаются клиенты, и на каждый подключенный клиент создается свой поток (_beginthread, с CreateThread чтото никак структуру не могу передать :) ). Вопрос состоит в том, как передать в поток сообщение для клиента и забрать ответ (или есть иной метод, без создания потоков?)? Очень большая просьба обьяснить, а не просто сказать что юзать, ибо целую ночь бестолку экспериментировал с мсдном :)
 
04.09.2006
2 566
2
Минск
#2
<!--QuoteBegin-SkunkLover+30:04:2007, 03:41 -->
<span class="vbquote">(SkunkLover @ 30:04:2007, 03:41 )</span><!--QuoteEBegin-->с CreateThread чтото никак структуру не могу передать
[snapback]63956" rel="nofollow" target="_blank[/snapback]​
[/quote]
Можно передать указатель на структуру через 4-й параметр LPVOID lpParameter функции CreateThread
 

grigsoft

Well-Known Member
15.11.2005
735
0
#3
А поток-то что делает в обычном состоянии? Обычно в таких случаях поток мониторит очередь, в которую кладутся все управляющие сообщения - как от сервера (из общего потока принимающего сообщения из сети), так и от собственной программы.
 
M

Mozzart

Гость
#4
Если Вы создавали свой класс от CSocket или CAsyncSocket, то я бы разделял на потоке в функции OnRecive и в качестве параметра передавал указатель на класс гнезда.
Типо что-то такое(могу скинуть весь пример на мыло если надо)
Код:
void CServerSocket::OnReceive(int nErrorCode) 
{
AfxBeginThread(MessegeProcessing,this);

CSocket::OnReceive(nErrorCode);
}


UINT CServerSocket::MessegeProcessing(LPVOID pParam)
{
CSocket* m_consocket=(CSocket*)pParam;
CSingleLock m_singlock(&m_mutex);
HWND hWndMain=m_pDlg->GetSafeHwnd();
if (!m_singlock.IsLocked())
{
m_singlock.Lock();

TCHAR buff[4096];
int nRead;
nRead = m_consocket->Receive(buff, 4096); 
CString m_str;
switch (nRead)
{
case 0:
m_consocket->Close();
break;

case SOCKET_ERROR:
if (GetLastError() != WSAEWOULDBLOCK) 
{
AfxMessageBox ("Ошибка в принятии сообщения");
m_consocket->Close();
}
break;

default:
buff[nRead] = 0; 
CString szTemp(buff);
int m_comand;
CString m_Data;

m_comand=StrToInt(szTemp.Left(5));
m_Data=szTemp.Right(szTemp.GetLength()-6);
switch(m_comand)
{
case ID_SHOW:
::SendMessage(hWndMain, WMU_SHOWPEPORTDATA,
reinterpret_cast<WPARAM>(&m_Data), reinterpret_cast<LPARAM>(m_consocket));
break;
case ID_REVIEW:	
::SendMessage(hWndMain, WMU_REVIEW,
reinterpret_cast<WPARAM>(&m_Data), reinterpret_cast<LPARAM>(m_consocket));
break;
case ID_EXECUTEQUERY:
::SendMessage(hWndMain, WMU_EXECUTEQUERY,
reinterpret_cast<WPARAM>(&m_Data), reinterpret_cast<LPARAM>(m_consocket));			
break;
default:
break;
}

m_singlock.Unlock();
}
}
return 0;
}
 
Статус
Закрыто для дальнейших ответов.