![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| bass |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Поток один и тот же............. Dem_max 200 %............... Получаеться ServerSocket1 не создает поток на новое подключение......... И как выкручиваться в данной ситуации...????? И интересно сколько тогда может выдержать подключений ServerSocket1 ????????? |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Как вариант не парится
Так как ServerSocket1Accept(); работает в одном потоке, не делай долгих задержек в этой функции. Т. е. если надо добавляй новый сокет в список и выходи из функции, только же опять не забывай добавлять через критические секции, так как в где то в другом потоке список может использоваться. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| bass |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Я бы не парился........ Но в один момент нужно создать буффер и отправить клиенту, так в момент создания буффера идут обращения к первой и второй форме............ И тут начала вылетела ошибка доступа к лейблу.... И так я и доковырялся что критическая секция не работает......
|
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Доступ к лейблу и визуальным компонентам должен быть только из главного потока.
http://rxlib.ru/WinLesson/bles2_1.htm -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| bass |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Полностью согласен с тобой(там операции были несложные, поэтому забил, знаю сделал не по програмерски... Ну...), но как быть допустим в этой ситуации........... Поток то у нас один теперь как выяснилось.......
И в одном моменте сбиваеться последовательность ситуаций и вылетает ошибка....... Для этого и продумывал критическую секцию..... Век живи век учись..... С уважением..... Это сообщение отредактировал(а) bass - 11.6.2012, 15:34 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Я имел ввиду, что обработчик вызывается в главном потоке. Т.е. поток сокета синхронизируется с главным и вызывает обработчик в главном потоке. Но тут я тоже протупил, потому как если обработчик вызывается в главном, то пока он не закончил свое выполнение не сможет синхронизироваться второй обработчик, ведь один поток не может исполнять 2 действия одновременно. Добавлено через 6 минут и 58 секунд Хотя не, теоретически может, если использует механизм асинхронных вызовов Windows. Представим себе ситуацию. 1) 1й поток получил accept и записался в очередь к главному потоку на синхронизацию 2) Вызвался обрабочик в главном потоке и вызвался месажбокс 3) Месажбокс заблокировался на обработке сообщений 4) 2й поток получился accept и записался в очередь к главному потоку на синхронизацию 5) Поскольку месажбокс занимается обработкой сообщений, то это разрешает вызов 2го обработчика от 2го потока. 6) Вызывается второй обработчик также в главном потоке, и для него критическая секция не является блокировкой поскольку вызывающий поток 1. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| bass |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Все понял................
Как и предположил что связанно с оконной процедурой. Вернее с ее свойствами приема потока сообщений оказалось. А как быть в такой ситуации..... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Отключить синхронизацию с главным потоком ServerType = stNonBlocking -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| bass |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
В его свойствах и так стоит ServerType = stNonBlocking ...................
Так и стоит..... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
bass, а если поставить блокирующий? Возможно он все неблокирующий обрабатывает в главном потоке. Кстати! Он же может события accept ставить на обработку окном главного потока! Это и есть наиболее вероятный способ разблокировки сокета. Значит нужно переключить в блокирующий.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| bass |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Все заработался пришла в голову мысль поставить счетчик потоков зашедших если больше одного то выскакивает мессадж бокс....... Когда поток уходит смотрит на наличие мессадж боксов и тыкает мышкой......))))))))))))))))))))))))))
А серьезно..... Щас ставим блокирующий........ Куча клиенов выполняют опперации и тут мы попадаем в эту функцю и блокируемся секунд на 5 все....... А так все работаем кому в друг понядобилась эта функция встаем в очередь....... Там еще есть запрос пользователя..... И тогда сервер зависнет............ Но всеравно попробую......... Неа не получилось...... Form1->Memo1->Lines->Add(IntToStr( GetCurrentThreadId())); EnterCriticalSection(&CritsectQweryBuffer); MessageBox(NULL,"", "", MB_OK ); LeaveCriticalSection(&CritsectQweryBuffer); Конектиться клиент выскакивает мессадж бокс........ Конектиться другой и в мемо не отображаеться номер потока.... Закрываю мессадж появлеться .... Значит блокиреться все работа.... Хоть коннект и проходит...... Это сообщение отредактировал(а) bass - 11.6.2012, 18:25 |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Почитай тут
http://forum.vingrad.ru/topic-60076.html приглянись к семафорам, они вроде как блокируют вход. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Замените CRITICALSECTION на Mutex'ы - они будут блокироваться даже если их позовут в одном потоке
|
|||
|
||||
| bass |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Иногда да такого маленького ответа приходиться столько докапываться......
Ступил и пошел разбираться почему не срабатывает ......... Спасибки всем...... Если мутексы блокируються то тогда вопрос решен..... Это сообщение отредактировал(а) bass - 11.6.2012, 19:38 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Это еще почему? Насколько я знаю мьютексы под виндой ведут себя точно также как и критические секции. Чтобы добиться полного исключения я использовал эвенты. А у мьютексов фича такая. Раз 1 поток то безопасно вызывать и они не блокируют повторный вход. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |