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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> EnterCriticalSection не работает.... 
V
    Опции темы
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   Вверх
Страницы: (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.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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