|
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 36
|
|
TTCPServer и два потока25.02.2011, 04:40. Показов 3865. Ответов 10
Метки нет (Все метки)
Доброго времени суток, форумчане!
У меня появилась такая задачка: надо организовать получение и отправку данных через серверный сокет. В программе должно быть 2 потока: главный и поток для сокета. Для каждого пользователя создавать отдельный поток нельзя, так как выполняются не потоко-безопасные функции. Я попробывал реализовать это через компонент TTcpServer, но как мне показал менеджер задач (Process Explorer), новый поток во время начала прослушки порта не создается, да и когда пользователь подключается - тоже нет нового потока. Судя по всему все работает в главном потоке, что меня не устраивает. Вопросы:
0
|
|
| 25.02.2011, 04:40 | |
|
Ответы с готовыми решениями:
10
Что будет, если два разных потока попытаются отправить одновременно одному клиенту два разных пакета TTcpServer, TTcpClient... |
|
|
|||||||||||
| 25.02.2011, 08:06 | |||||||||||
|
Используй класс TThread. Пример из Rad Studio XE:
1
|
|||||||||||
|
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 36
|
|
| 25.02.2011, 11:35 [ТС] | |
|
Дело в том, что я уже пытался создавать сокет в новом потоке в методе Execute. Я инициализировал его до цикла, и открыл соединение (фаерволом увидел, что мой поток начал прослушивать порт). Потом пробывал подключаться клиентом, но события подключения клиента так и не возникли. Поток как-будто занят итерациями цикла и не обращает внимание на прием событий подключения клиента.
Синхронизацию таким методом, который вы указали я не использую. В dll он не работает, поэтому у меня немного другой метод синхронизации.
0
|
|
|
|
|
| 25.02.2011, 11:56 | |
|
С потоками я не спец. Но если логически подумать, то в Execute не должно быть циклов, нужно вызвать его и выйти как можно скорее. А цикл обрабатывать с помощью таймера.
0
|
|
|
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 36
|
||
| 25.02.2011, 11:59 [ТС] | ||
|
0
|
||
|
|
|||||||||||
| 25.02.2011, 14:48 | |||||||||||
|
Вроде получилось. Ответ от клиента приходит в другом потоке.
CPP:
0
|
|||||||||||
|
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 36
|
|
| 25.02.2011, 18:14 [ТС] | |
|
kzru_hunter, вот что вы сделали:
1. Выделили память для треда и тспсервера. 2. Тред запустился - открыл прослушку порта и сразу же остановился, так как в методе Execute пусто. 3. Так как тспсерверу был выставлено свойство BlockMode = bmThreadBlocking, то для каждого подключения создается отдельный тред. 4. В итоге толку от треда, который вы создали - 0. Вы попробуйте выставить свойство BlockMode в bmNonBlocking и увидите, что новый тред для клиента не создастся. Мне не надо новый тред для каждого клиента, мне надо, чтобы прослушка и обработка запросов была в отдельном треде с очередью клиентов.
0
|
|
|
|
|||
| 25.02.2011, 19:08 | |||
|
TheSteelRat, проверял код?
Добавлено через 48 минут В инете узнал, что с этими компонентами не удобно работать. Поэтому лучше вместо них использовать TClientSocket и TServerSocket.
0
|
|||
|
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 36
|
|
| 25.02.2011, 20:30 [ТС] | |
|
kzru_hunter, я уже много чего перепробывал. bmThreadBlocking обозначает, что каждый клиент должен в отдельном потоке обрабатываться, и он нифига не блокирует тот поток, в котором щас находится, он блокирует те потоки, которые сам создаст. Он из созданного тобою потока выйдет сразу же после открытия прослушки и будет выполняться в основном потоке до подключения клиентов. Как только начнут подключаться клиенты - сразу наштампует потоков под каждого клиента.
Компоненты TClientSocket и TServerSocket являются устаревшими и мало чем отличаются от TTcpServer и TTcpClient...
0
|
|
|
|
|
| 25.02.2011, 21:00 | |
|
С этими компонентами только сегодня познакомился, поэтому многого не знаю.
Решил как-то помочь, т.к. тоже интересна тема. Надеюсь, кто-нибудь поможет. Насчет потоков хотел спросить: почему ThreadID показывает одинаковый, если подключаться с разных клиентов?
0
|
|
|
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 36
|
|
| 25.02.2011, 22:31 [ТС] | |
|
kzru_hunter, функция GetCurrentThreadId получает скорее всего именно Id главного потока. Для того, чтобы получить id потока, который создал TcpServer надо обращаться к конкретной функции этого объекта, что-то типа ClientSocket->ThreadId...
0
|
|
| 25.02.2011, 22:31 | |
|
Помогаю со студенческими работами здесь
11
два потока Два потока winapi Создать два потока на с++ Звук на два потока Создать два потока Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html
Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
|
|
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
|
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях.
Задача: при копировании документа очищать определенные реквизиты и табличную. . .
|
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git
main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели
8ATzM_2aurI
|
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2.
Задача: запретить редактирование документа, если он открыт у другого пользователя.
/ / . . .
|