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

Поиск:

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


Опытный
**


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

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



Тупик .... Компилятор Builder 6.0 Win Xp пишу маленький сервачек.... На серверсокете........

Код

CRITICAL_SECTION CritsectQweryBuffer ;



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




При создании формы.....
Код

InitializeCriticalSection(&CritsectQweryBuffer);


Такой код не работает..... Выскакивают мессадж боксы..... Поидеи потоки по одному должны зайти..... Но счетчики меняються в
CritsectQweryBuffer... Посмотрел отладчиком может я заработался...
 smile  smile 

Заранее спасибо.

Это сообщение отредактировал(а) GremlinProg - 13.6.2012, 07:01
PM MAIL   Вверх
xvr
Дата 11.6.2012, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Должно работать, давайте весь код

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


Опытный
**


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

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



Кода несколько страниц(20), сейчас просто написал маленький код и такая же ошибка........

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
CRITICAL_SECTION CritsectQweryBuffer ;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ServerSocket1->Port=StrToInt(Form1->Edit1->Text);
ServerSocket1->Active = true ;
ServerSocket1->Open() ;
Memo1->Lines->Add("Создан сервер.");
//Form1->Button2->Enabled = true;
Form1->Button1->Enabled = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
 InitializeCriticalSection(&CritsectQweryBuffer);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,
      TCustomWinSocket *Socket)
{
EnterCriticalSection(&CritsectQweryBuffer);
MessageBox(NULL,"", "", MB_OK );
LeaveCriticalSection(&CritsectQweryBuffer);

}
//---------------------------------------------------------------------------



Еще прикрепляю проект... Конекчусь телнетом выскакивает два мессадж бокса.....
Два раза коннекчусь.....

С уважением .. Заранее спасибо...

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  CRITICAL_SECTION.rar 352,62 Kb
PM MAIL   Вверх
Alexeis
Дата 11.6.2012, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Рискну предположить, что ServerSocket1Accept синхронизируется с главным потоком, а потому EnterCriticalSection будет выполняться много раз.


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

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

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


Опытный
**


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

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



Что то я вас не понял...... В критическую секцию должен заходить один поток........ Мессадж бокса два!!!!!!! Значит туда попали два потока........ При нормальной работе другие ожидают....... 
PM MAIL   Вверх
Dem_max
Дата 11.6.2012, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Все просто код работает правильно
Код

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


После MessageBox ты покидаешь критическую секцию так как MessageBox(NULL, ....);  не блокирует поток.


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


Опытный
**


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

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



Пишу вот так.... 
Пока не нажму первый мессадж второй не выскакиват, значит блокирует.......
Код

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

Блокирует MB_OK  вот в чем ответ.......

Это сообщение отредактировал(а) GremlinProg - 13.6.2012, 07:04
PM MAIL   Вверх
Dem_max
Дата 11.6.2012, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



И правда странная хрень


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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



У меня есть подозрение, что InitializeCriticalSection(&CritsectQweryBuffer); выполняется неоднократно... 
Нельзя ли это вывести за пределы TForm1?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
bass
Дата 11.6.2012, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Может что то не то в настройках проекта, но ставил релиз..... Такая же байда.....  
ServerSocket1 интересно как работает?????
Пробовал вставить в форм шоу инициализацию.....

И как это синхронизировать.???????

Код

#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
CRITICAL_SECTION CritsectQweryBuffer ;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


DWORD ITDStop =0;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ServerSocket1->Port=StrToInt(Form1->Edit1->Text);
ServerSocket1->Active = true ;
ServerSocket1->Open() ;
Memo1->Lines->Add("Ñîçäàí ñåðâåð.");
//Form1->Button2->Enabled = true;
Form1->Button1->Enabled = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
// InitializeCriticalSection(&CritsectQweryBuffer);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,
      TCustomWinSocket *Socket)
{
//EnterCriticalSection(&CritsectQweryBuffer);
//MessageBox(NULL,"", "", MB_OK );
//MessageBox(NULL,"2", "", MB_OK );
//LeaveCriticalSection(&CritsectQweryBuffer);



         while(ITDStop)
         {Sleep(1);}
         ITDStop = 1;

MessageBox(NULL,"", "", MB_OK );

         ITDStop = 0;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
//InitializeCriticalSection(&CritsectQweryBuffer);
}
//---------------------------------------------------------------------------



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

Такое ощущение что связано это с оконной процедурой.........

Заранее спасибо, с уважением.

Добавлено @ 13:47
Цитата(feodorv @ 11.6.2012,  13:37)
У меня есть подозрение, что InitializeCriticalSection(&CritsectQweryBuffer); выполняется неоднократно... 
Нельзя ли это вывести за пределы TForm1?

Один раз выполняеться, посмотрел отладчиком......

Добавлено @ 13:56
Цитата(Alexeis @ 11.6.2012,  11:54)
Рискну предположить, что ServerSocket1Accept синхронизируется с главным потоком, а потому EnterCriticalSection будет выполняться много раз.

Скорее всего так и получаеться синхронизация походу есть..... Но прицем тут критическая секция?????? Взрыв мозга....... smile  smile  smile  smile 

Скорее еще прикол в свойствах ServerSocket1..........
Может тему в сети перенести ???? Может там что посоветуют???? 

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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



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

В смысле при втором подключении будет снова InitializeCriticalSection.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
bass
Дата 11.6.2012, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(feodorv @ 11.6.2012,  13:59)
Цитата(bass @  11.6.2012,  14:45 Найти цитируемый пост)
Один раз выполняеться, посмотрел отладчиком......

В смысле при втором подключении будет снова InitializeCriticalSection.

Нет ставлю брейк, запускаю приложение, останавливаеться......
Далее произвожу коннекты не разу на брайке не останавливаеться.....
PM MAIL   Вверх
feodorv
Дата 11.6.2012, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(bass @  11.6.2012,  14:45 Найти цитируемый пост)
         while(ITDStop)
         {Sleep(1);}
         ITDStop = 1;

Так не корректно, нужно пользоваться Interlocked-функциями...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
bass
Дата 11.6.2012, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(feodorv @ 11.6.2012,  14:03)
Цитата(bass @  11.6.2012,  14:45 Найти цитируемый пост)
         while(ITDStop)
         {Sleep(1);}
         ITDStop = 1;

Так не корректно, нужно пользоваться Interlocked-функциями...

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


Эксперт
***


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

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



вот ответ
Цитата

After a thread has ownership of a critical section, it can make additional calls to EnterCriticalSection or TryEnterCriticalSection without blocking its execution. This prevents a thread from deadlocking itself while waiting for a critical section that it already owns. The thread enters the critical section each time EnterCriticalSection and TryEnterCriticalSection succeed. A thread must call LeaveCriticalSection once for each time that it entered the critical section.


если проще, то если критическая секция была уже вызвана в потоке,  то при повторном вхождении в нее в этом же потоке не происходит блокировки

Это сообщение отредактировал(а) Dem_max - 11.6.2012, 14:21


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0691 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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