Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143

Закрыть UDP сервер в потоке

05.09.2016, 14:54. Показов 1510. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня! Никак не могу придумать, как правильно закрыть UDP сервер.
Задача собственно такая: на форме есть SpeedButton, при первом нажатии я запускаю поток и создаю UDP сервер, при втором, надо убить поток и закрыть сервер,
собственно, что я сам смог сделать:

ReadUDP.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall ReadUDP::Execute()
{
    FreeOnTerminate = true;
    objUDP.__create_udp();
    do
    {
        objUDP.__read_data();
        objUDP.__send_data();
    }
    while(!Terminated);
}
Unit1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TMainForm::SpeedButton3Click(TObject *Sender)
{
    ReadUDP *UDPThread = new ReadUDP(true);
    if (SpeedButton3->Down == true)
    {
        SpeedButton3->Caption = "Disconnect";
        UDPThread->FreeOnTerminate = true;
        UDPThread->Resume();
    }
    else
    {
        SpeedButton3->Caption = "Connect";
        UDPThread->Terminate();
    }
}
а вот в каком месте вставить закрытие UDP сервера я не знаю(

Добавлено через 3 часа 12 минут
#UDP
я так понимаю, что моя большая ошибка в том, что новый объект класса ReadUDP у меня создается при каждом нажатии на кнопку.
мне бы надо это объявление перенести в внутрь if, но тогда в секции else я не буду выдеть объект класса(
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.09.2016, 14:54
Ответы с готовыми решениями:

UDP клиент-сервер. Пакет
Доброго времени, ребят! Возникла проблема. В универе дали задание в довольно ИНФОРМАТИВНОМ виде... Цитирую: "- пакет - от 1...

UDP-сервер/клиент на Winsock
Доброго времени суток Есть UDP сервер и клиент, реализованные средствами winsock. Пока что все отрабатывается на одной машине, так что...

Не уходят UDP пакеты в потоке (winsock)
Добрый день. Кто подсказать может. Имеется код по отправке пакетов UDP. Без потока все работает нормально. Как только этот же код начинает...

13
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,150
Записей в блоге: 3
05.09.2016, 15:10
я бы вообще ReadUDP *UDPThread вынес бы глобально, а присваивал бы ему значение по кнопке.
0
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143
05.09.2016, 15:29  [ТС]
Цитата Сообщение от Dinkin Посмотреть сообщение
я бы вообще ReadUDP *UDPThread вынес бы глобально, а присваивал бы ему значение по кнопке.
это решит проблему с созданием нескольких объектов потока.

Остается только придумать, где вызвать в потоке метод objUDP.__closeudp();
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,150
Записей в блоге: 3
05.09.2016, 15:34
Цитата Сообщение от painless Посмотреть сообщение
это решит проблему с созданием нескольких объектов потока.
Скорее всего это не решит,а только усложнит, если Вы будите использовать несколько создаваемых потоков.
А закрытие сервера перед завершением потока...храните где нибудь ссылки на сервер, и закрываете его..в чем трудность то?
0
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143
05.09.2016, 15:37  [ТС]
получается интересная ситуация, т.е. если поток создан и данные приходят, я их вывожу на экран в richedit. Если отжать SpeedButton и выполнить Terminate(), то получается поток все еще крутиться в цикле
C++
1
2
3
4
5
6
    do
    {
        objUDP.__read_data();
        objUDP.__send_data();
    }
    while(!Terminated);
и если еще какие-то данные придут, то тогда поток таки завершится и можно после while выполнитьobjUDP.__closeudp(). Но как бы тогда выбраться из этого цикла сразу по нажатию на SpeedButton?
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,150
Записей в блоге: 3
05.09.2016, 15:41
Так вроде если сервер выключен, не важно придут или не придут данные..нечего не произойдет, если это не заложено в Вашей логике
0
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143
05.09.2016, 15:52  [ТС]
Dinkin, пока я писал предыдущее сообщение, Вы успели ответить, а я этого не увидел, но пока пытался отредактировать сообщение - прошли 5 минут выделенные на это

сейчас попробую объяснить что у меня идет не так, а идет ровным счетом всё
usd сервер я реализовал на winsocks
моя логика работы программы, я могу быть в чем-то не прав и могу переделать если что-то будет предложено:
создаем поток - в потоке создаем udp сервер и пока поток !Terminated читаем и если что-то прочитали, отсылаем обратно
в основном потоке(это же так называется? там где у меня вся форма и прочие обработки) у меня есть SpeedButton, при первом нажатии - создать потом, при втором - уничтожить. Так вот, при уничтожении мне надо как-то выйти из цикла while и закрыть сервер.
объект класса udpserver у меня создается в потоке и я не знаю как его закрыть(

т.е. на данный момент
C++
1
2
3
4
5
6
7
8
9
10
11
12
    
        ObjUdp.createUdp();
    do
    {
        ObjUdp.readData();
        temp_mes = ObjUdp.getMessage();
        Synchronize(&printRecData);
        ObjUdp.sendData();
    }
    while(!Terminated);
    Synchronize(&printTestMessage);
    ObjUdp.closeUdp();
и это сработает если я нажму на кнопку закрытия сервера, а после этого отправлю туда какую-то информацию, тогда из цикла do while выйдет программа и закроет сервер
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,150
Записей в блоге: 3
05.09.2016, 16:04
а если так попробовать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    void __fastcall ReadUDP::Execute()
{
     while(true)
    {
        ObjUdp.readData();
        temp_mes = ObjUdp.getMessage();
        Synchronize(&printRecData);
        ObjUdp.sendData();
    }
    
    ObjUdp.closeUdp();
    Terminate();
}
0
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143
05.09.2016, 16:08  [ТС]
Цитата Сообщение от Dinkin Посмотреть сообщение
while(true)
так это вечно выполняется, по вызову UdpThread->Terminate вообще не прерывается
но я пробовал while(!Terminated) тоже результатов не принесло
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,150
Записей в блоге: 3
05.09.2016, 16:13
А я просто не сразу понял что надо...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    void __fastcall ReadUDP::Execute()
{
     
    
        ObjUdp.readData();
        temp_mes = ObjUdp.getMessage();
        Synchronize(&printRecData);
        ObjUdp.sendData();
    
    if(Terminated) 
    {
    ObjUdp.closeUdp();
    }
 
    
}
0
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143
05.09.2016, 16:17  [ТС]
Цитата Сообщение от Dinkin Посмотреть сообщение
А я просто не сразу понял что надо...
а вот это выполнится только 1 раз
а надо чтоб выполнялось пока не будет нажата кнопка Stop по которой выполняется Terminate потока
поэтому я использовал цикл do{} while(!terminated), но почему поток продолжает висеть в цикле и я так подозреваю на строке ObjUdp.readData();
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,150
Записей в блоге: 3
05.09.2016, 16:24
а так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall ReadUDP::Execute()
{
 
        ObjUdp.readData();
        temp_mes = ObjUdp.getMessage();
        Synchronize(&printRecData);
        ObjUdp.sendData();
   
    for(;;)
      {
      if(Terminated) break;
      }
    
    
    ObjUdp.closeUdp();
    Terminate();
}
0
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143
05.09.2016, 16:28  [ТС]
так аналогичная ситуация, теперь функция read выполнится один раз и после этого в потоке будет просто бесконечная проверка не вызвал ли кто-то Terminate()
0
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
09.09.2016, 22:20
так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall TMainForm::SpeedButton3Click(TObject *Sender)
{    
    if (SpeedButton3->Down)
    {
        UDPThread = new ReadUDP(true);   // UDPThread объявляй, как член класса TMainForm
        UDPThread->FreeOnTerminate = false;
        UDPThread->Resume();
        SpeedButton3->Caption = "Disconnect";
    }
    else
    {
        UDPThread->Terminate();
        UDPThread->WaitFor();
        delete UDPThread;
        SpeedButton3->Caption = "Connect";
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.09.2016, 22:20
Помогаю со студенческими работами здесь

Закрыть UDP порт на Windows XP
как закрыть UDP порт на Windows XP SP3 стандартным файрволом. Нужно что бы через него трафик не шел от моего компьютера и на оборот...

Закрыть tcp/udp 445 порт на srx650
Подскажите, как именно реализуется закрытие портов в данном оборудование? зона используется только одна (trust), как понял нужно правило...

Закрыть форму во втором потоке при окончании вычислений в первом
Утро доброе. есть главная форма, в ней выполняются долгие вычисления (соответственно программа - AutoCAD - виснет). Запихивал эти...

Как осуществить запись(дозапись) в файл в отдельном потоке и закрыть его после записи?
Здравствуйте! Вопрос в названии темы! Подробнее планирую записывать(дозаписывать) в файл массив double doubleArray. Этот массив будет...

Многопоточный Udp сервер
Всем доброе! Возможно ли сделать многопоточный UDP сервер? Многопоточный TCP сервер сделать просто использовав класс QTcpServer в...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru