Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
1

Где нужно всунуть Критическую секцию для корректной работы

18.10.2009, 21:12. Показов 1952. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, есть такая проблема, точнее я полагаю, что она там есть. В обще при создании форм я достаю информацию из ИНИ файла. И иногда случается так что пишет, что идет попытка обращения к левой памяти, но программа не ложится, работает дальше. Посмотрев, что я дописывал последний раз увидел, что это обращение и чтение к тому же ИНИ файлу. В обще я так думаю, что иногда оно успевает и достает инфу раньше с первой формы, чем оно начинает читать файл в другой форме. А в другой раз не успевает или пытается прочесть во время того, как уже читается.
Это мое предположение.
Подумал, что нужно разделить эти процессы, чтобы они не начинались одновременно и решил использовать Критические секции, но по причине отсутствия опыта работы с ними хочу вот спросить, куда их нужно пихать. Достаточно ли только в те места, где происходит считывание в первой форме и в другой.
Код
Форма1
CRITICAL_SECTION cs;
InitCriticalSection(&cs);
EnterCriticalSection(&cs);
//Read from INI
LeaveCriticalSection(&cs);

Форма 2
CRITICAL_SECTION cs;
InitCriticalSection(&cs);
EnterCriticalSection(&cs);
//Read from INI
LeaveCriticalSection(&cs);
Достаточно ли этого будет, чтобы разделить выполнение?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2009, 21:12
Ответы с готовыми решениями:

Передача указателя на критическую секцию
Уважаемые програмисты MFC и WinAPI, вопрос к вам! Есть класс наследованный от CWinThread и...

Вход потоков в критическую секцию по порядку
Как создать такое событие чтобы потоки входили в критическую секцию по порядку 1,2,3,4 ..... Пока...

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

Написать программу с семафорами которая входит в критическую секцию
На дом задали такую домашку "написать программу с семафорами которая входит в критическую секцию"....

18
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
19.10.2009, 10:35 2
TGrey[WoLf], а зачем читать ини-файл в двух местах? и почему создается сразу две формы?
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
19.10.2009, 22:35  [ТС] 3
Такс ну для начала в ИНИ файле хранятся значения для установки Чекеров на формах. Поэтому из разных форм оно и читает. Сначала устанавливает в первой, потом во второй. Но поскольку я убрал ту часть и ошибка вроде, как пропала было хорошо, но после чего при тесте на другой машине снова появилась.

Почему 2 формы? Ну у меня приложение такое мультиформенное) У меня там 5 форм, просто чекеры нужно установить только на 2. Я не знаю, как Борланд создает формы и если потоками, то была идея, что оно не успевает считать для первой формы данные.

Но, что я заметил, характерным признаком того, что вылезла ошибка остается тот факт, что программа продолжает работу, НО сокет уже отказывается производить конект к серверу.
Поскольку все действия с сокетами и с данными я запихал в класс и класс создается в глобальной области 2 формы, после чего к нему начинают обращаться разные функции устанавливая его свойства.
И тут меня посетила такая мысль, что возможно класс не успевает создаться до того, как к нему начинают обращаться, что вызывает ошибку обращения к памяти а в дальнейшем отказ в коннекте по причине отсутствия данных в классе. Теперь попробую проверить эту догадку. Было бы хорошо еще знать, как проверить создан ли объект. Попробую создавать его динамически и проверять указатель на Существование?!
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
19.10.2009, 22:41 4
TGrey[WoLf],
Где нужно всунуть Критическую секцию для корректной работы
Засунь её в .... э-э.. как бы помягче выразиться... D в то место... в котором возможен множественный доступ. :LOL:
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
19.10.2009, 22:54  [ТС] 5
Не сомневаюсь в вашей компетенции, но там где-то вроде написано "по отсутствию опыта". Вот поэтому я бы и всунул ее в ... помягче куда-нибудь)) А потом вопрос по первому посту видимо отпадает. Буду проверять указатели на валидность. Может прокатит.
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
20.10.2009, 01:39 6
TGrey[WoLf], на счет форм я не зря спросил... обе формы у вас в auto-create находятся или нет? а секция по идее должна быть одна, в главной форме инициализируется, а потом уже в нужных местах раставляете Enter и Leave...
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
20.10.2009, 16:00  [ТС] 7
Ну вот как Компилятор создает формы так и создает. Я там ничего не менял.
Насчет секции она должна быть одна и входить в нее одну? А то я думал 2 секции в разных участках кода и входить в них.
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
20.10.2009, 17:09 8
TGrey[WoLf], сколько будет секций, столько и очередей на выполнение (вроде бы)... а вам посоветую перенести все же ненужные формы из auto-create и нужда в критических секциях по идее отпадет сама собой, если вы, конечно же, верно локализировали глюк
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
20.10.2009, 17:25  [ТС] 9
Как их перенести из auto-create и как создать в дальнейшем?
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
20.10.2009, 22:35 10
перенести можно в свойствах проекта, создавать как и любой другой объект класса через new, например
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
20.10.2009, 23:52  [ТС] 11
Ясно. Буду пробовать. И все же Критические секции к примеру
CRITICAL_SECTION cs1,cs2;
если в 1-й форме входить в 1-ю секцию, а в 2-й форме во 2-ю, то оно синхронизируются? Или надо в обоих случая в 1 секцию входить?

Добавлено через 49 минут
Вот. Добавил указатели, но ошибка осталась(( Но я забыл упомянуть, что когда компилятор ее выводит то оно показывает на файл
_numpunct.h
В строку
string grouping() const { return do_grouping(); }

Что оно может быть?
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
21.10.2009, 09:30 12
TGrey[WoLf], на стандратную библиотеку не похоже... а ты еще попробуй с оконами поиграться, как я тебе писал...
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
21.10.2009, 19:45  [ТС] 13
Да но все же по причине чего оно может быть, интересно.

То есть убрать от сюда код?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();
                 Application->Title = "Easy Bizarre";
                 try
                 {
                 Application->CreateForm(__classid(TAuthWindow), &AuthWindow);
                 }
                 catch(...){ShowMessage("1");}
                 try{
                 Application->CreateForm(__classid(TChatWindow), &ChatWindow);
                 }
                 catch(...){ShowMessage("2");}
                 try{
                 Application->CreateForm(__classid(TAboutWindow), &AboutWindow);
                 }
                 catch(...){ShowMessage("3");}
                 Application->CreateForm(__classid(TLoading), &Loading);
                 Application->CreateForm(__classid(TFilterWindow), &FilterWindow);
                 Application->CreateForm(__classid(TBanWindow), &BanWindow);  
                 Application->Run();
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
21.10.2009, 20:07 14
TGrey[WoLf], можно и тут, но лучше все же в свойствах проекта
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
22.10.2009, 22:31  [ТС] 15
Окончательно обнаружил багу. Но справится, что не получается.
В методе Создания формы находятся строки
C++
1
2
3
4
5
6
7
8
9
        /*ofstream o("1.html");
        o.clear();
        o.close();
        ofstream o2("2.html");
        o2.clear();
        o2.close();
        ofstream o3("3.html");
        o3.clear();
        o3.close();*/
И вот они то и вызывают краш. Проверил tryем ексепшен оно ловит. Но вот проблема теперь только в том, как это исправить. Почему оно крашится не постоянно и что ему не нравится, если файлы на месте и в них есть инфа(или нету)

Оно просто отказывается создавать fstream, ofstream, ifstream. Сразу вылазит исключение. Хоть после Ребилда проекта до след раза все работает.

Добавлено через 16 минут
Пока использовал этот метод и вроде работает, но хотелось бы получить ответ, что с тем вариантом не то.
C++
1
2
        HANDLE hh = CreateFile("E:\\Borland\\CBuilder6\\Projects\\Bizarre\\1.html", GENERIC_READ, NULL, NULL, CREATE_ALWAYS, NULL, NULL );
        CloseHandle(hh);
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
22.10.2009, 22:46 16
TGrey[WoLf],
Цитата Сообщение от TGrey[WoLf
;316893]И вот они то и вызывают краш. Проверил tryем ексепшен оно ловит. Но вот проблема теперь только в том, как это исправить. Почему оно крашится не постоянно и что ему не нравится, если файлы на месте и в них есть инфа(или нету)
это надо экспериментировать... а какой эксепшен вылетает?
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
22.10.2009, 23:16  [ТС] 17
Та я на все обрабатываю. Кстати я подумал о том, что почему во время создания формы оно крашит, а дальше же ведь в программе файлы открываются так же само и записывается в них инфа. Только подумал об этом, профиксил то. Запускаю программу оно доходит до момент, где должно записывать в файлы и тут тот же самый краш))
В общем я залез в свойства проекта и врубил обратно галочки Build with Runtime & Use dinamic RTL.
Как я помню, это нужно отключать для работоспособности на других машинах, где нет Компилятора. Но если такая история получается, как оно тогда там будет работать-то ?!
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
22.10.2009, 23:44 18
TGrey[WoLf], а без галочки работает без сбоев?
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
23.10.2009, 00:09  [ТС] 19
Наоборот, я их включил и работает как прежде. Даже с тем кодом, что вызывал краш.
Просто я тестировал программу на другой машине и выключал их, чтобы программа там работала.
0
23.10.2009, 00:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2009, 00:09
Помогаю со студенческими работами здесь

Алгоритм Петерсона: почему поток не может два раза подряд выполнить критическую секцию?
Друзья! Имеем два потока. Читаем: "Не должно возникать неограниченно долгого ожидания для...

Реализовать критическую секцию на основе объекта синхронизации типа "событие"
Есть код, все, вреде бы логически правильно... Должно работать, но... Увы нет((( Если есть...

Как переделать функцию для корректной работы?
Всем доброе утро! У меня есть код для замени текста: $string = "raptor editor является...

Настройка и запуск VirtualBox для корректной работы ?
Здравствуйте. Хотел установить ос windows 8.1 iso файл. Прежде хочу попробовать её на VirtualBox....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru