Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
TGrey[WoLf]
41 / 41 / 4
Регистрация: 14.09.2008
Сообщений: 683
1

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

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

Здравствуйте, есть такая проблема, точнее я полагаю, что она там есть. В обще при создании форм я достаю информацию из ИНИ файла. И иногда случается так что пишет, что идет попытка обращения к левой памяти, но программа не ложится, работает дальше. Посмотрев, что я дописывал последний раз увидел, что это обращение и чтение к тому же ИНИ файлу. В обще я так думаю, что иногда оно успевает и достает инфу раньше с первой формы, чем оно начинает читать файл в другой форме. А в другой раз не успевает или пытается прочесть во время того, как уже читается.
Это мое предположение.
Подумал, что нужно разделить эти процессы, чтобы они не начинались одновременно и решил использовать Критические секции, но по причине отсутствия опыта работы с ними хочу вот спросить, куда их нужно пихать. Достаточно ли только в те места, где происходит считывание в первой форме и в другой.
Код
Форма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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2009, 21:12
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Но, что я заметил, характерным признаком того, что вылезла ошибка остается тот факт, что программа продолжает работу, НО сокет уже отказывается производить конект к серверу.
Поскольку все действия с сокетами и с данными я запихал в класс и класс создается в глобальной области 2 формы, после чего к нему начинают обращаться разные функции устанавливая его свойства.
И тут меня посетила такая мысль, что возможно класс не успевает создаться до того, как к нему начинают обращаться, что вызывает ошибку обращения к памяти а в дальнейшем отказ в коннекте по причине отсутствия данных в классе. Теперь попробую проверить эту догадку. Было бы хорошо еще знать, как проверить создан ли объект. Попробую создавать его динамически и проверять указатель на Существование?!
0
Rififi
2365 / 1058 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
19.10.2009, 22:41 4
TGrey[WoLf],
Где нужно всунуть Критическую секцию для корректной работы
Засунь её в .... э-э.. как бы помягче выразиться... D в то место... в котором возможен множественный доступ. :LOL:
0
19.10.2009, 22:41
TGrey[WoLf]
41 / 41 / 4
Регистрация: 14.09.2008
Сообщений: 683
19.10.2009, 22:54  [ТС] 5
Не сомневаюсь в вашей компетенции, но там где-то вроде написано "по отсутствию опыта". Вот поэтому я бы и всунул ее в ... помягче куда-нибудь)) А потом вопрос по первому посту видимо отпадает. Буду проверять указатели на валидность. Может прокатит.
0
Lord_Voodoo
Супер-модератор
8625 / 2278 / 133
Регистрация: 07.03.2007
Сообщений: 10,946
Завершенные тесты: 1
20.10.2009, 01:39 6
TGrey[WoLf], на счет форм я не зря спросил... обе формы у вас в auto-create находятся или нет? а секция по идее должна быть одна, в главной форме инициализируется, а потом уже в нужных местах раставляете Enter и Leave...
0
TGrey[WoLf]
41 / 41 / 4
Регистрация: 14.09.2008
Сообщений: 683
20.10.2009, 16:00  [ТС] 7
Ну вот как Компилятор создает формы так и создает. Я там ничего не менял.
Насчет секции она должна быть одна и входить в нее одну? А то я думал 2 секции в разных участках кода и входить в них.
0
Lord_Voodoo
Супер-модератор
8625 / 2278 / 133
Регистрация: 07.03.2007
Сообщений: 10,946
Завершенные тесты: 1
20.10.2009, 17:09 8
TGrey[WoLf], сколько будет секций, столько и очередей на выполнение (вроде бы)... а вам посоветую перенести все же ненужные формы из auto-create и нужда в критических секциях по идее отпадет сама собой, если вы, конечно же, верно локализировали глюк
0
TGrey[WoLf]
41 / 41 / 4
Регистрация: 14.09.2008
Сообщений: 683
20.10.2009, 17:25  [ТС] 9
Как их перенести из auto-create и как создать в дальнейшем?
0
Lord_Voodoo
Супер-модератор
8625 / 2278 / 133
Регистрация: 07.03.2007
Сообщений: 10,946
Завершенные тесты: 1
20.10.2009, 22:35 10
перенести можно в свойствах проекта, создавать как и любой другой объект класса через new, например
0
TGrey[WoLf]
41 / 41 / 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
Lord_Voodoo
Супер-модератор
8625 / 2278 / 133
Регистрация: 07.03.2007
Сообщений: 10,946
Завершенные тесты: 1
21.10.2009, 09:30 12
TGrey[WoLf], на стандратную библиотеку не похоже... а ты еще попробуй с оконами поиграться, как я тебе писал...
0
TGrey[WoLf]
41 / 41 / 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
Lord_Voodoo
Супер-модератор
8625 / 2278 / 133
Регистрация: 07.03.2007
Сообщений: 10,946
Завершенные тесты: 1
21.10.2009, 20:07 14
TGrey[WoLf], можно и тут, но лучше все же в свойствах проекта
0
TGrey[WoLf]
41 / 41 / 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
Lord_Voodoo
Супер-модератор
8625 / 2278 / 133
Регистрация: 07.03.2007
Сообщений: 10,946
Завершенные тесты: 1
22.10.2009, 22:46 16
TGrey[WoLf],
Цитата Сообщение от TGrey[WoLf
;316893]И вот они то и вызывают краш. Проверил tryем ексепшен оно ловит. Но вот проблема теперь только в том, как это исправить. Почему оно крашится не постоянно и что ему не нравится, если файлы на месте и в них есть инфа(или нету)
это надо экспериментировать... а какой эксепшен вылетает?
0
TGrey[WoLf]
41 / 41 / 4
Регистрация: 14.09.2008
Сообщений: 683
22.10.2009, 23:16  [ТС] 17
Та я на все обрабатываю. Кстати я подумал о том, что почему во время создания формы оно крашит, а дальше же ведь в программе файлы открываются так же само и записывается в них инфа. Только подумал об этом, профиксил то. Запускаю программу оно доходит до момент, где должно записывать в файлы и тут тот же самый краш))
В общем я залез в свойства проекта и врубил обратно галочки Build with Runtime & Use dinamic RTL.
Как я помню, это нужно отключать для работоспособности на других машинах, где нет Компилятора. Но если такая история получается, как оно тогда там будет работать-то ?!
0
Lord_Voodoo
Супер-модератор
8625 / 2278 / 133
Регистрация: 07.03.2007
Сообщений: 10,946
Завершенные тесты: 1
22.10.2009, 23:44 18
TGrey[WoLf], а без галочки работает без сбоев?
0
TGrey[WoLf]
41 / 41 / 4
Регистрация: 14.09.2008
Сообщений: 683
23.10.2009, 00:09  [ТС] 19
Наоборот, я их включил и работает как прежде. Даже с тем кодом, что вызывал краш.
Просто я тестировал программу на другой машине и выключал их, чтобы программа там работала.
0
23.10.2009, 00:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2009, 00:09

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

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru