Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> EnterCriticalSection не работает.... 
V
    Опции темы
bass
Дата 11.6.2012, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Код

EnterCriticalSection(&CritsectQweryBuffer);
Form1->Memo1->Lines->Add(IntToStr( GetCurrentThreadId()));

MessageBox(NULL,"", "", MB_OK );
MessageBox(NULL,"2", "", MB_OK );
LeaveCriticalSection(&CritsectQweryBuffer);


Поток один и тот же............. 
Dem_max 200 %...............

Получаеться ServerSocket1 не создает поток на новое подключение.........

И как выкручиваться в данной ситуации...?????  smile  smile  smile 

И интересно сколько тогда может выдержать подключений ServerSocket1 ?????????
PM MAIL   Вверх
Dem_max
Дата 11.6.2012, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Как вариант не парится
Так как ServerSocket1Accept(); работает в одном потоке, не делай долгих задержек в этой функции. Т. е.  если надо добавляй новый сокет в список и выходи из функции, только же опять не забывай добавлять через критические секции, так как в где то в другом потоке список может использоваться.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
bass
Дата 11.6.2012, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Я бы не парился........ Но в один момент нужно создать буффер и отправить клиенту, так в момент создания буффера идут обращения к первой и второй форме............ И тут начала вылетела ошибка доступа к лейблу.... И так я и доковырялся что критическая секция не работает......
 
PM MAIL   Вверх
Dem_max
Дата 11.6.2012, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Доступ к лейблу и визуальным компонентам должен быть только из главного потока.
http://rxlib.ru/WinLesson/bles2_1.htm


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
bass
Дата 11.6.2012, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Полностью согласен с тобой(там операции были несложные, поэтому забил, знаю сделал не по програмерски... Ну...), но как быть допустим в этой ситуации........... Поток то у нас один теперь как выяснилось.......

И в одном моменте сбиваеться последовательность ситуаций и вылетает ошибка....... Для этого и продумывал критическую секцию.....
Век живи век учись..... 

С уважением.....

Это сообщение отредактировал(а) bass - 11.6.2012, 15:34
PM MAIL   Вверх
Alexeis
Дата 11.6.2012, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(bass @  11.6.2012,  14:45 Найти цитируемый пост)
Скорее всего так и получаеться синхронизация походу есть..... Но прицем тут критическая секция?????? Взрыв мозга....... smile  smile  smile  smile 

  Я имел ввиду, что обработчик вызывается в главном потоке. Т.е. поток сокета синхронизируется с главным и вызывает обработчик в главном потоке. Но тут я тоже протупил, потому как если обработчик вызывается в главном, то пока он не закончил свое выполнение не сможет синхронизироваться второй обработчик, ведь один поток не может исполнять 2 действия одновременно.

Добавлено через 6 минут и 58 секунд
Хотя не, теоретически может, если использует механизм асинхронных вызовов Windows.
Представим себе ситуацию.
1) 1й поток получил accept и записался в очередь к главному потоку на синхронизацию
2) Вызвался обрабочик в главном потоке и вызвался месажбокс
3) Месажбокс заблокировался на обработке сообщений
4) 2й поток получился accept и записался в очередь к главному потоку на синхронизацию
5) Поскольку месажбокс занимается обработкой сообщений, то это разрешает вызов 2го обработчика от 2го потока.
6) Вызывается второй обработчик также в главном потоке, и для него критическая секция не является блокировкой поскольку вызывающий поток 1.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bass
Дата 11.6.2012, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Все понял................ 

Как и предположил что связанно с оконной процедурой. Вернее с ее свойствами приема потока сообщений оказалось.   А как быть в такой ситуации.....
PM MAIL   Вверх
Alexeis
Дата 11.6.2012, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(bass @  11.6.2012,  17:01 Найти цитируемый пост)
А как быть в такой ситуации..... 

  Отключить синхронизацию с главным потоком ServerType = stNonBlocking


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bass
Дата 11.6.2012, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



В его свойствах и так стоит ServerType = stNonBlocking ...................
Так и стоит.....
PM MAIL   Вверх
Alexeis
Дата 11.6.2012, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



bass, а если поставить блокирующий? Возможно он все неблокирующий обрабатывает в главном потоке. Кстати! Он же может события accept ставить на обработку окном главного потока! Это и есть наиболее вероятный способ разблокировки сокета. Значит нужно переключить в блокирующий.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bass
Дата 11.6.2012, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Dem_max
Дата 11.6.2012, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Почитай тут
http://forum.vingrad.ru/topic-60076.html
приглянись к семафорам, они вроде как блокируют вход.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
xvr
Дата 11.6.2012, 19:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Замените CRITICALSECTION на Mutex'ы - они будут блокироваться даже если их позовут в одном потоке

PM MAIL   Вверх
bass
Дата 11.6.2012, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Иногда да такого маленького ответа приходиться столько докапываться......
Ступил и пошел разбираться почему не срабатывает ......... 
Спасибки всем...... Если мутексы блокируються то тогда вопрос решен.....

Это сообщение отредактировал(а) bass - 11.6.2012, 19:38
PM MAIL   Вверх
Alexeis
Дата 12.6.2012, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(xvr @  11.6.2012,  20:02 Найти цитируемый пост)
Замените CRITICALSECTION на Mutex'ы - они будут блокироваться даже если их позовут в одном потоке

  Это еще почему? Насколько я знаю мьютексы под виндой ведут себя точно также как и критические секции. Чтобы добиться полного исключения я использовал эвенты. А у мьютексов фича такая. Раз 1 поток то безопасно вызывать и они не блокируют повторный вход.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0782 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.