Сейчас на форуме: (+2 невидимых) |
eXeL@B —› Оффтоп —› Delphi. Глюки при частом обращении к функе. Помогите найти проблему. |
Посл.ответ | Сообщение |
|
Создано: 11 декабря 2009 19:46 · Поправил: ToBad · Личное сообщение · #1 Столкнулся с проблемой одновременного вывода в лог файл из разных потоков. В силу задачи должен постоянно открывать и закрывать файл при записи строки. Соответственно, что бы не получать I/O error 103 использовал CriticalSection. Эта ошибка пропала, но теперь возникают совершенно другие ошибки и чаще всего инвалид поинтер на goto rt. Ошибка происходит через определённое время, когда сразу, когда через пару минут, для того что бы скорее её узреть сделал 5 потоков и частое обращение. Заметил если в функе xlog закомментировать код после EnterCriticalSection и до result:=s то ошибка не возникает. Так же если оставить одну строку LogFileName:='data_'+DateToStr(now)+'.txt'; - это уже приводит к ошибке. Как я понимаю где то подгаживается стек? Помогите пожалуйста устранить проблему. Выкладываю код тут и в аттаче с exe вместе. Code:
02e0_11.12.2009_CRACKLAB.rU.tgz - thrd.rar p.s. Прошу модератора, если можно, подобрать наиболее подходящий раздел и перенести тему... Тут никто не читает... |
|
Создано: 11 декабря 2009 22:47 · Поправил: Модератор · Личное сообщение · #2 |
|
Создано: 11 декабря 2009 23:18 · Личное сообщение · #3 Archer пишет: Да и код абзац, чего стоят только ГОТО, когда есть нормальные циклы while. Да, я понимаю, что код некрасивый, но акцентирую внимание не на 5-ти потоках с готом внутри, а на функцию записи в файл, ибо ошибка возникает после её отработки. Очень хочется услышать замечания по функции xlog которые возможно помогут избежать ошибок... |
|
Создано: 11 декабря 2009 23:26 · Поправил: Isaev · Личное сообщение · #4 ToBad пишет: на функцию записи в файл, ибо ошибка возникает после её отработки. в общем вроде относительно корректно написано долго анализировал и не понял почему может падать потом качнул, запустил... и правда не падает (15000 записей по крайней мере подождал ~11min) может от ос зависит? у меня xp sp2 ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 12 декабря 2009 01:32 · Личное сообщение · #5 |
|
Создано: 12 декабря 2009 02:30 · Личное сообщение · #6 |
|
Создано: 12 декабря 2009 03:21 · Личное сообщение · #7 |
|
Создано: 12 декабря 2009 05:04 · Личное сообщение · #8 Isaev пишет: а когда слетает, лог в каком состоянии? Когда как придётся. Когда нормально, а когда так: Code:
А ещё интересно получается, если нажать второй раз - у меня на компе глюкает стабильно, а вот на втором тестовом где без слётов работало до 43Мб лога, потом нажал кнопку 10 раз, а значит общее кол-во потоков 50, дождался до 61 мб и просто прекратил тест. Это 3 часа 40 минут и 4099380 строк в логе без единого глюка. Какой-то глюкотестер получился... |
|
Создано: 12 декабря 2009 15:15 · Личное сообщение · #9 |
|
Создано: 12 декабря 2009 18:30 · Личное сообщение · #10 |
|
Создано: 13 декабря 2009 14:39 · Личное сообщение · #11 |
|
Создано: 19 декабря 2009 19:54 · Личное сообщение · #12 Переделал по-другому, всё равно глючит.... Не пойму что за фигня... Наговорено может??? Подобная конструкция очень часто вылетает с разными ошибками, то инвалид поинтер, то обращение по адресу и память не может быть рид, на другой сборке windows просто молча закрывается. Ошибка происходит через неопределённое время, чаще всего в первые 5 минут работы. Для того, что бы в случае нарушения совместного доступа к файлу лога данные не терялись - реализовал работу со списком. Этот момент работает хорошо. Список не переполняется, ошибка не в этом. Code:
Выкладываю тест, там отображается кол-во записей не обработанных. Пишет в лог файл в корень С. c7dd_19.12.2009_CRACKLAB.rU.tgz - thrd_test_prj.exe |
|
Создано: 19 декабря 2009 20:07 · Личное сообщение · #13 |
|
Создано: 20 декабря 2009 07:04 · Личное сообщение · #14 |
|
Создано: 27 апреля 2010 00:21 · Личное сообщение · #15 |
|
Создано: 15 мая 2010 11:39 · Личное сообщение · #16 |
|
Создано: 18 мая 2010 18:36 · Личное сообщение · #17 |
eXeL@B —› Оффтоп —› Delphi. Глюки при частом обращении к функе. Помогите найти проблему. |