Модераторы: 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   Вверх
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   Вверх
bass
Дата 12.6.2012, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кажеться так и получилось, пока руки не добираються до этого кода но быстро накалякал  Mutex'ы кажеться такая же байда....
Щас посмотрю......
PM MAIL   Вверх
xvr
Дата 12.6.2012, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alexeis @  12.6.2012,  00:54 Найти цитируемый пост)
 Это еще почему? Насколько я знаю мьютексы под виндой ведут себя точно также как и критические секции.

Да, действительно -
Цитата

The thread that owns a mutex can specify the same mutex in repeated wait function calls without blocking its execution. Typically, you would not wait repeatedly for the same mutex, but this mechanism prevents a thread from deadlocking itself while waiting for a mutex that it already owns. However, to release its ownership, the thread must call ReleaseMutex once for each time that the mutex satisfied a wait.
посыпаю голову пеплом  smile 
Тогда действительно только семафор со счетчиком 1 ( http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx )

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


Опытный
**


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

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



Так ребят я вообще не чего не пойму........ 
Код

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
CRITICAL_SECTION CritsectQweryBuffer ;
HANDLE mut;
//---------------------------------------------------------------------------
__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)
{
Form1->Memo1->Lines->Add(IntToStr( GetCurrentThreadId()));
//EnterCriticalSection(&CritsectQweryBuffer);

WaitForSingleObject(mut,INFINITE);
//WaitForSingleObject(mut,INFINITE);
MessageBox(NULL,"", "", MB_OK );
MessageBox(NULL,"2", "", MB_OK );
//LeaveCriticalSection(&CritsectQweryBuffer);
ReleaseMutex(mut);


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

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

//         ITDStop = 0;

}



DWORD WINAPI Trace1(void *Param)
{
WaitForSingleObject(mut,INFINITE);
MessageBox(NULL,"1", "", MB_OK );
MessageBox(NULL,"21", "", MB_OK );
}


DWORD WINAPI Trace2(void *Param)
{
WaitForSingleObject(mut,INFINITE);
MessageBox(NULL,"2", "", MB_OK );
MessageBox(NULL,"22", "", MB_OK );
}



//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
//InitializeCriticalSection(&CritsectQweryBuffer);
mut = CreateMutex(NULL, true, NULL);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
DWORD GOid;
CreateThread(NULL,0,Trace1,0,0,&GOid); //çàïóñêàòü 1 ðàç
Sleep(1000);
CreateThread(NULL,0,Trace2,0,0,&GOid); //çàïóñêàòü 1 ðàç
}
//---------------------------------------------------------------------------



Когда запускаю потоки с кнопки два не одного месадж бокса не высвечиваеться а когда запускаю сервер через WaitForSingleObject(mut,INFINITE); проскакивает...... Бред......... smile  smile 
PM MAIL   Вверх
Dem_max
Дата 12.6.2012, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Я же тебе сказал посмотри на семафоры.


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


Опытный
**


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

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



Спасибо но ответа было два и я как всегда выбрал неверный..... Ну это то что осталось доделать в сервачке...... И как всегда закон подлости...... 
PM MAIL   Вверх
bass
Дата 12.6.2012, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот это номер................. Заходит один поток вешаеться на мессадж боксе, заходит другой и виснет весь сервер................. Вот  и синхронизировал................)))))))))))))) Говорил тыкать мышкой в месадж боксы эффективнее....)))))))))))
Так а че делать то ???????................. Не ожидал такого прикола, хотя выше уже такой тест приводился ......., я не обратил внимания......
Семафоры действительно заработали.......
Если честно я думал  что ServerSocket создает поток для каждого подключения......... А оказалось............
PM MAIL   Вверх
bass
Дата 12.6.2012, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Короче наверно придеться так выкручиваться .... Если комуто нужна эта функция он запускает поток, выполняються операции в порядке очереди и продолжаеться работа........ Выход вижу такой, корректно ли это будет.....?????
PM MAIL   Вверх
volatile
Дата 12.6.2012, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(bass @  12.6.2012,  21:13 Найти цитируемый пост)
придеться так выкручиваться .... 

Да оставьте все как было в начале, небольшоая добавочка только:
Цитата(bass @  11.6.2012,  01:43 Найти цитируемый пост)
EnterCriticalSection(&CritsectQweryBuffer);
MessageBox(NULL,"", "", MB_OK | MB_TASKMODAL );
LeaveCriticalSection(&CritsectQweryBuffer);

Если не ошибась должно помочь...

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


Опытный
**


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

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



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

Мессадж боксы использовались в роли тестов.......................................................

А там в функции в реальном коде много действий с формой........... Вернее считывание ее параметров и создан ие буфера для передачи.............     И если туда залетает два потока то начинаеться белеберда.....
PM MAIL   Вверх
volatile
Дата 13.6.2012, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(bass @  13.6.2012,  00:24 Найти цитируемый пост)
много действий с формой

Ну так и форму сделайте модальной.

PM MAIL   Вверх
xvr
Дата 13.6.2012, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(bass @  13.6.2012,  00:24 Найти цитируемый пост)
А там в функции в реальном коде много действий с формой........... Вернее считывание ее параметров и создан ие буфера для передачи.............     И если туда залетает два потока то начинаеться белеберда..... 

Откуда там взяться 2м потокам, если все вызовы ServerSocket1Accept сериализуются в один и тот же поток (сами же экспериментально на эти грабли только что наступили)? Если вы в ServerSocket1Accept  не будете показывать модальные окна и вызывать MessageBox'ы, то одновременный вызов нескольких экземпляров ServerSocket1Accept в принципе невозможен

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


Эксперт
***


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

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



Цитата(bass @ 12.6.2012,  21:13)
Короче наверно придеться так выкручиваться .... Если комуто нужна эта функция он запускает поток, выполняються операции в порядке очереди и продолжаеться работа........ Выход вижу такой, корректно ли это будет.....?????

Оставляй как было в самом первом коде и не парься


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


Опытный
**


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

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



Цитата(volatile @ 12.6.2012,  23:32)
Цитата(bass @  12.6.2012,  21:13 Найти цитируемый пост)
придеться так выкручиваться .... 

Да оставьте все как было в начале, небольшоая добавочка только:
Цитата(bass @  11.6.2012,  01:43 Найти цитируемый пост)
EnterCriticalSection(&CritsectQweryBuffer);
MessageBox(NULL,"", "", MB_OK | MB_TASKMODAL );
LeaveCriticalSection(&CritsectQweryBuffer);

Если не ошибась должно помочь...

Убрал критические секции ......
Поставил MB_TASKMODAL..... И вообще не чего не изминилось..... Скорее всего в этом дело MB_OK....... Поидеи модальная форма должна появиться и управление обратно отдаться так ведь????

Сделаю так запущу еще один поток, ему какойто сокет запрос на создание буфера, поток закончил передал буфер сокету........ Если два сокета сделали запрос, в порятке очереди......... Думаю так заработает....... И все ок будет................ 

Оставляй как было в самом первом коде и не парься.....
Вылетают ошибки.......
PM MAIL   Вверх
xvr
Дата 13.6.2012, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(bass @  13.6.2012,  15:33 Найти цитируемый пост)
 Скорее всего в этом дело MB_OK.......

Я же вам уже писал - дело в MesageBox. Уберите его, и все будет исполняться строго последовательно и без всяких CRITICALSECTION, Mutex'ов и всего прочего.

PM MAIL   Вверх
Dem_max
Дата 14.6.2012, 02:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


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


Эксперт
****


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

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



Цитата(Dem_max @  14.6.2012,  02:57 Найти цитируемый пост)
не критические секции нужны, вдруг есть другие потоки которые будут пользоваться ресурсами того что находится в критической секции данного потока. 

Точно? Это надо у ТС уточнить. Если да, тогда можно оставить, но в любом случае вызовы самого ServerSocket1Accept никогда не могут наложиться друг на друга (если только вы их сами не наложите)

PM MAIL   Вверх
Dem_max
Дата 14.6.2012, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

но в любом случае вызовы самого ServerSocket1Accept никогда не могут наложиться друг на друга (если только вы их сами не наложите)

точно


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


Опытный
**


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

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



Цитата(xvr @ 14.6.2012,  12:28)
Цитата(Dem_max @  14.6.2012,  02:57 Найти цитируемый пост)
не критические секции нужны, вдруг есть другие потоки которые будут пользоваться ресурсами того что находится в критической секции данного потока. 

Точно? Это надо у ТС уточнить. Если да, тогда можно оставить, но в любом случае вызовы самого ServerSocket1Accept никогда не могут наложиться друг на друга (если только вы их сами не наложите)

Да действительно вы правы, сейчас только протестировал....... Поставил слип на 10 минут....... И этот слиип парализовал работу серввера.......     Сделал отдельный поток который занимаеться обработкой долгих операций и выполняющий запрос пользователя............
Все заработало УРА!!!!!!!

Всем огромное человеческое спасибо........ Ставлю на тесты...... 

А вот интересно сколько выдержит подключний ServerSocket...... Сейчас больше 10 врятли будет..... Но на будущее...????
Ну если его на сервер поставить естественно........
PM MAIL   Вверх
xvr
Дата 14.6.2012, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(bass @  14.6.2012,  16:29 Найти цитируемый пост)
А вот интересно сколько выдержит подключний ServerSocket...... 

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

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


Опытный
**


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

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



Но могу сказать если сделать запрос пользователя, и повесить сервер и продолжать подключения виснет вся система.....(((((
PM MAIL   Вверх
xvr
Дата 15.6.2012, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(bass @ 15.6.2012,  12:50)
Но могу сказать если сделать запрос пользователя, и повесить сервер и продолжать подключения виснет вся система.....(((((

Ой, что то вы суровое напрограмировали  smile Что бы из User Space подвесить систему надо очень сильно постараться  smile 

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


Опытный
**


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

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



Цитата(xvr @ 15.6.2012,  14:35)
Цитата(bass @ 15.6.2012,  12:50)
Но могу сказать если сделать запрос пользователя, и повесить сервер и продолжать подключения виснет вся система.....(((((

Ой, что то вы суровое напрограмировали  smile Что бы из User Space подвесить систему надо очень сильно постараться  smile

Ну не совсем..... Виснет рабочий стол и прога..... Можно запустить таск манеджер и убить процес......  Но это в тесте с месадж боксами.....
ХР.....)))))))))
PM MAIL   Вверх
Dem_max
Дата 15.6.2012, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



возможно использует главный поток всей программы.


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


Опытный
**


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

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



Грабли грабли и еще раз грабли............... Вот глупые люди всегда наступают на одни и теже грабли.... Но умные не лучше всегда наступат на новые.......   
Незнаю к какому типу себя отнести, но на очередные наступил......


 
Код

void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,
      TCustomWinSocket *Socket)
{
DWORD dwLen;
sockaddr_in adr;

String IpAdress;


dwLen = sizeof(sockaddr_in);
getpeername((DWORD)Socket->Handle , (sockaddr*)&adr,(int*)&dwLen);
IpAdress = inet_ntoa(adr.sin_addr);


Form1->Memo1->Lines->Add(IpAdress);
}



Или 0.0.0.0 выдает либо 30.4.121.0 или что то подобное.......... Хотя коннект провожу с 127.0.0.1 ..................


Код

Memo1->Lines->Add(ServerSocket1->Socket->Connections[SoketStruct->Index]->RemoteAddress);


Вот такая вещь работает..... Остаеться одно..... Socket->Handle..... либо там не стоит 4 ех байтовое выравнивание либо он не привязан к настояшему хендлу сокета....... И еще почитав про ServerSocket ....... Оказалось что после коннекта Index может меняться...... И такой код будет глючить........... Индекс я назначаю при коннекте, вернее получаю....... А вся привязка клиента идет по его хендлу.....
Код

Form1->ServerSocket1->Socket->Connections[SoketStrukt->Index]->SendBuf(&BUFFER1,4);


Код в топку............ Где то валялся клиент написанный на винапи переделаю под сервер конект на бинд надо сменить и все....... 
Не когда в жизни больше не возму ServerSocket..............



Это сообщение отредактировал(а) feodorv - 16.6.2012, 17:15
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.1278 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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