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

Правильная организация бесконечного цикла на стороне клиента в WinApi

17.09.2018, 16:38. Показов 1765. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый, собственно код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void SendReciveDta(HWND hListRD)
{
 
        char *sendbuf = "1";
 
        iResult = send(s, sendbuf, (int)strlen(sendbuf), 0);
 
        int recvbuflen = DEFAULT_BUFLEN;
 
        iResult = recv(s, recvbuf, recvbuflen, 0);
        if (iResult > 0)
        {
            SendDlgItemMessage(hListRD, ID_LIST3, LB_ADDSTRING, 0, (LPARAM)"Data recive OK");
        }
        else
        {
            SendDlgItemMessage(hListRD, ID_LIST3, LB_ADDSTRING, 0, (LPARAM)"Error no recive data");
        }
Организовано TCP соединение между сервером и клиентом. Обмен происходит последовательно (или синхронно, как правильнее сказать не знаю) и устроен следующим образом:
1) Сервер слушает клиента и при получении "1" высылает ему набор данных
2) Клиент соответственно отсылает серверу "1", получает набор данных, я получаю информацию, раскидываю её по программе и остаюсь довольным

Проблема. Сейчас это устроено по кнопке. Т.е. данная процедура контролируется оператором, но я хочу сделать обмен информацией между клиентом и сервером без участия человека. Вроде бы всё просто - достаточно организовать бесконечный цикл, например while (TRUE), однако в таком случае программа "зависает на данном участке".

Вопрос. Как решить данную задачу? Уходить в асинхронное соединение? Хочу отметить, в обмене данных работают лишь 2 устройства. Применение комбинированных решений в виде бесконечного цикла и пауз не помогло. Ибо в любом случае, WinApi должен дойти до следующего участка кода, где должен сообщить оператору необходимую информацию, например SendDlgItemMessage(hListRD, ID_LIST3, LB_ADDSTRING, 0, (LPARAM)"Data recive OK");. Не через goto же мне скакать по всей программе, верно?

Спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.09.2018, 16:38
Ответы с готовыми решениями:

Организация бесконечного цикла посредством оператора while
Всем доброго времени суток. Обращаюсь к вам с небольшой просьбой разобраться с проблемой, с которой я столкнулся при изучении могучего...

Организация бесконечного цикла с минимальной загрузкой UI потока
Файл MainActivity.java имеет следующую структуру class MainActivity extends Activity { .... mt = new MyTask(); // создается и...

Валидация на стороне клиента
Ребята, здравствуйте! Произвожу валидцию на стороне клиента. Нашел в интернете код: jQuery.fn.ForceNumericOnly = function() { ...

6
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
17.09.2018, 17:54
kosmonavt40rus, сделать обмен в отдельном бесконечном треде...
0
1 / 1 / 0
Регистрация: 22.12.2015
Сообщений: 26
18.09.2018, 14:31  [ТС]
liv, я так понимаю вы говорите о Thread? Дело в том, что для меня это как для ботаника альфа центавра..

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

C++
1
2
thread.test(SendReciveDta);
test.join();
И этот кусок кода будет работать так сказать параллельно со всей программой?
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
18.09.2018, 15:18
Лучший ответ Сообщение было отмечено kosmonavt40rus как решение

Решение

kosmonavt40rus, Примерно так, но надо все правильно сделать...
Изучите теорию.
В чем преимущество данного подхода? Основной поток общается с пользователем и делает разную другую работу, кроме, собственно, обмена. Который будет в отдельном потоке и будет жить своей жизнью.
Чтобы поток не висел постоянно на обмене, можно вставить в определенный момент Sleep() для задержки с отдаванием процессорного времени. Либо при помощи механизма событий.
В двух словах не расскажешь. Копайте в данном направлении...
1
1 / 1 / 0
Регистрация: 22.12.2015
Сообщений: 26
18.09.2018, 15:21  [ТС]
liv, Я всё понял, спасибо. Единственный вопрос..а могу ли я решить данную проблему при помощи таймера(SetTimer)?
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
18.09.2018, 15:37
kosmonavt40rus, в принципе, можно, чтобы задавать интервалы времени для обмена.
Но! Из-за того, что таймер работает в том же треде, то наверняка будут проблемы с реакцией.
Особенно, при наличии некачественной связи.
Я бы не советовал так делать. Треды - именно тот механизм, который необходим в данном случае.
1
1 / 1 / 0
Регистрация: 22.12.2015
Сообщений: 26
18.09.2018, 16:01  [ТС]
liv, Большое спасибо за ответы!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.09.2018, 16:01
Помогаю со студенческими работами здесь

Валидация на стороне клиента
Подскажите, пожалуйста, как правильно оформить валидацию на стороне клиента. У меня есть суммарная валидация (validation...

Парсинг на стороне клиента
Возможно ли спарсить значение на странице на стороне клиента (к примеру через JS)?? просто фишка в том, что к примеру на социалках до и...

3d графика на стороне клиента
Здравствуйте. Я новичок в клиент-серверных технологиях, поэтому прошу совета, какие технологии мне стоит использовать для написания...

БД, которая работает на стороне клиента
Мне надо, чтобы пользователь зашел на сайт, посетил несколько страниц. После отключения сети интернет, страницы которые посетил...

HTTP-запрос на стороне клиента
На данный момент есть сайт, посылающий HTTP-запрос через php, т.е. Запрос посылается со стороны сервера. А как можно сделать, чтобы этот...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru