Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 07.12.2014
Сообщений: 18

MFC чат, потоки

08.12.2014, 01:47. Показов 2261. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Пишу чат: визуальный клиент на MFC, консольный сервер просто на плюсах. Сервер способен принять и отправить обратно сокет, клиент может успешно подключиться к серверу и отправить сокет - введенное сообщение.
Проблема состоит в реализации непрерывного приема сокетов клиентом. Очевидно, нужно создавать поток, чтобы во время выполнения цикла приема программа не игнорировала все остальное.
С сервером и потоками на обычных плюсах проблем не было(по примеру из книги), с MFC очень долго пытаюсь разобраться, и все без толку. Какие варианты не пробую(void, DWORD WINAPI, библиотека потоков), компилятор выдает ошибки...
Прошу помочь, не теорией(благо за 3 часа начиталась предостаточно), а именно на этом конкретном примере реализовать поток. Ну или показать способ обойти потоки.

Функция, которая при нажатии на кнопку соединяется с сервером. После соединения с сервером нужно перейти в поток циклического приема сокетов

C++
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
void CMBChatDlg::OnBnClickedButton1() //connect
{   
    CButton* Enter = (CButton*)GetDlgItem(CONNECT);// otslejivat najatie
    char buff[1024];
    //----------------------winsok start---------------//
    if (WSAStartup(0x202, (WSADATA *)&buff[0]))
    {
        write_new_message(CString("[System]: WSAStart error"));
        return;
    }
    //----------------sozdanie soketa--------------//
    my_sock = socket(AF_INET, SOCK_STREAM, 0);
    if (my_sock < 0)
    {
        write_new_message(CString("[System]: Socket error"));
        return;
    }
    //---------------ustanovka soedineniya----------//
    sockaddr_in dest_addr;
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(PORT);
    HOSTENT *hst;
 
    if (inet_addr(SERVERADDR) != INADDR_NONE)//string v ip
        dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);
    else
    {       
        if (hst = gethostbyname(SERVERADDR)) //tak nado
            ((unsigned long *)&dest_addr.sin_addr)[0] =
            ((unsigned long **)hst->h_addr_list)[0][0];
        else
        {
            write_new_message(CString("[System]: Invalid server address"));//error
            closesocket(my_sock);
            WSACleanup();
            return;
        }
    }
 
    if (connect(my_sock, (sockaddr *)&dest_addr, sizeof(dest_addr)))
    {
        write_new_message(CString("[System]: Connection error"));
        return ;
    }
    //-----------ubiraetsya knopka, opoveshyaetsya o podklu4enii-----------//
        CWnd* pWnd = GetDlgItem(CONNECT);
        pWnd->ShowWindow(SW_HIDE);
        write_new_message(CString("[System]: Connected succesfully"));
        Connected = true;
    //----------------------priem soketov--------------------------------//
        //vizvat' potok ?????
        
}
Сама функция цикла
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void CMBChatDlg::Waiting_For_Message(PVOID pParam)
{
    bool *local = (bool*)pParam;
    char buff[1024];
    for (;; Sleep(75))
    {
        int nsize;
        nsize = recv(my_sock, &buff[0], sizeof(buff) - 1, 0);
        if (nsize != SOCKET_ERROR)
        {
            buff[nsize] = 0;
            write_new_message(CString(buff));
        }
        if (!Connected) return;
    }
}
сокет my_socket глобальный

исходники целиком прилагаются
Вложения
Тип файла: rar Help.rar (234.9 Кб, 22 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.12.2014, 01:47
Ответы с готовыми решениями:

Потоки в MFC
Пожалуйста помогите, только начал разбитраться в потоках... Мне нужно сделать так, чтобы создались два потока, а потом сначала отработал...

VC++ 6.0 MFC: потоки и сообщения
плиз киньте пару ссылок на описание с примерами работы потоков а главное как между ними передавать данные - я читал что через...

MFC, потоки, не видит функции
Прошу прощения, может и нубский вопрос, но сроки поджимают, нет времени разбираться подробно в MFC. Есть код: ...

1
1 / 1 / 0
Регистрация: 07.12.2014
Сообщений: 18
08.12.2014, 14:50  [ТС]
Поднимаю тему
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.12.2014, 14:50
Помогаю со студенческими работами здесь

Прием данных COM порта через потоки. (MFC)
Такая проблемка. Нашел книгу, Магда Ю.С. - Программирование последовательных интерфейсов. прочитал, разобрался. Нужно считывать данные...

Потоки MFC "Недостаточно памяти"
Здравствуйте. Пытаюсь создать поток в MFC, но при запуске вылазит сообщение с текстом &quot;Недостаточно памяти&quot;. ВОт кусок кода: ...

MFC, потоки
Здравствуйте ! Вопрос касается MFC, потоков, а точнее остановки их выполнения с продолжением после n времени. Т.е. создали поток...

Что такое потоки ввода, потоки вывода?
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..! вот допустим...

Чат или видео чат
Создал тему здесь, т.к. ближайшего раздела не вижу. Хотелось бы понять как установить видеочат, типа бонгакамс, если есть бесплатная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru