Потоки

Тема в разделе "MS Visual C++", создана пользователем SkunkLover, 30 апр 2007.

Статус темы:
Закрыта.
  1. SkunkLover

    SkunkLover Гость

    Такая вещь: работает сервер, к нему подключаются клиенты, и на каждый подключенный клиент создается свой поток (_beginthread, с CreateThread чтото никак структуру не могу передать :) ). Вопрос состоит в том, как передать в поток сообщение для клиента и забрать ответ (или есть иной метод, без создания потоков?)? Очень большая просьба обьяснить, а не просто сказать что юзать, ибо целую ночь бестолку экспериментировал с мсдном :)
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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
     
  3. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    А поток-то что делает в обычном состоянии? Обычно в таких случаях поток мониторит очередь, в которую кладутся все управляющие сообщения - как от сервера (из общего потока принимающего сообщения из сети), так и от собственной программы.
     
  4. Mozzart

    Mozzart Гость

    Если Вы создавали свой класс от CSocket или CAsyncSocket, то я бы разделял на потоке в функции OnRecive и в качестве параметра передавал указатель на класс гнезда.
    Типо что-то такое(могу скинуть весь пример на мыло если надо)
    Код (Text):
    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;
    }
     
Загрузка...
Похожие Темы - Потоки
  1. Mady
    Ответов:
    3
    Просмотров:
    1.476
  2. 203
    Ответов:
    4
    Просмотров:
    1.752
  3. Senset
    Ответов:
    0
    Просмотров:
    2.332
Статус темы:
Закрыта.

Поделиться этой страницей