42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
|
|
1 | |
Где нужно всунуть Критическую секцию для корректной работы18.10.2009, 21:12. Показов 1952. Ответов 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
|
18.10.2009, 21:12 | |
Ответы с готовыми решениями:
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 | |||||
Да но все же по причине чего оно может быть, интересно.
То есть убрать от сюда код?
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 | ||||||||||
Окончательно обнаружил багу. Но справится, что не получается.
В методе Создания формы находятся строки
Оно просто отказывается создавать fstream, ofstream, ifstream. Сразу вылазит исключение. Хоть после Ребилда проекта до след раза все работает. Добавлено через 16 минут Пока использовал этот метод и вроде работает, но хотелось бы получить ответ, что с тем вариантом не то.
0
|
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
|
|
22.10.2009, 22:46 | 16 |
TGrey[WoLf],
Сообщение от TGrey[WoLf
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 | |
23.10.2009, 00:09 | |
Помогаю со студенческими работами здесь
19
Алгоритм Петерсона: почему поток не может два раза подряд выполнить критическую секцию? Реализовать критическую секцию на основе объекта синхронизации типа "событие" Как переделать функцию для корректной работы? Настройка и запуск VirtualBox для корректной работы ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |