![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| neosapient |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: 3 Всего: 4 |
Здравствуйте.
Возникла проблема на ровном месте, немогу понять откуда лезет. Задача. Открыть файл, считать оттуда данные определенной структуры, закрыть файл. Решешал задачку так: Создал диалог. В момент прихода сообщения WM_INITDIALOG создается дополнительный поток AnalysFile(...). В этой функции открываю файл test.txt на чтение побайтно. Создаю заполняемую структуру и указатель на нее. Далее пока файл не кончиться, заполняю побайтно через указатель все поля структуры. По окончании файла, закрываю соединение. Дополнительный поток закрываеться.
Ну в общем начинаю я работать с дебагером, то все нормально отрабатывает,а то винда виснет, только мышка по экрану двигается. Подскажите, ЧТО не так делаю. Доп. вопрос: когда происходит считывание байтов из файла и их побайтная запись в структуру, то создается такое впечатление, что char у меня в два байта?! В том смысле, что при i равном 1 из файла считывается значение b однако оно пишется в сокрытую область стуктуры. Может происходит какое то выравнивание длинны структуры до значения кратного 4 байтам? Это сообщение отредактировал(а) neosapient - 19.12.2006, 00:35 Присоединённый файл ( Кол-во скачиваний: 4 )
getdataTest.rar 3,41 Kb |
|||
|
||||
| dumb |
|
||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 27 Всего: 158 |
почти угадал. только выравнивается не размер структуры, а сами поля. значение границ задается опциями, по умолчанию - компилер сам "придумывает" как выравнивать(например в твоем случае он выровнял первое поле до двух байт, чтоб вкупе со вторым они заняли 4 байта). когда гоняешь структуры "наружу"(файл,сокет,итд), надо ставить для них выравнивание в 1.
|
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Нехорошо прерывать поток через TerminateThread. Это для аварийного прерывания, когда поток не отвечает. При этом не освобождаются ресурсы и не происходят другие правильные вещи. Для такой маленькой программы как твоя, это, возможно и ерунда, но для реальных проектов - отнюдь нет.
Поток должен завершаться сам. Для того чтобы завершить его извне, нужно создать, например, событие (event). Управляющий поток сигнализирует событие, а рабочий поток должен в своем цикле отслеживать, не активно ли событие, и завершаться, если это так. Кроме того, поток вполне может завершить до того, как ты нажмешь Cancel. И это тоже нужно проверять. -------------------- ... |
|||
|
||||
| neosapient |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: 3 Всего: 4 |
За "выравние полей" спасибо, не знал.
А по поводу основного вопроса: Если я создаю доп поток не на сообщение WM_INITDIALOG, а на WM_COMMAND -> IDOK, то ничего не виснет. Щелкаю на кнопочку ОК и доп поток запускается. Но мне хочется создавать доп поток на сообщение WM_INITDIALOG |
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: 10 Всего: 12 |
Кажись читал у Рихтера что нельзя пользовать CreateThread если используются функции run-time. Чтение из файла тоже как-то странно оформлено, имхо.
-------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| neosapient |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: 3 Всего: 4 |
Aleksandor, извени, а что относиться к run-time функциям? и на что их заменить?..
Ну, функции взяты из stdio.h |
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: 10 Всего: 12 |
Щас посмотрел, у диалоговой процедуры нет родительского окна. Процедура диалоговая и WinMain как-бы в одном стакане. Мне кажется это не есть хорошо.
Run-time функции это те самые fopen, getc, time, strchr и т.д. Вместо CreateThread лучше заюзать _beginthreadex Почему-ищи в MSDN по слову _beginthreadex Насчет странного это чтение из файла побайтово-это слишком неэффективно. Кстати, в файле может и не быть feof. Тогда чтение зависнет навеки веков Лучше читать сразу весь файл или какую-то его часть в буфер, а потом анализировать. Или сделать file mapping - тогда и буфер не нужен. -------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| neosapient |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: 3 Всего: 4 |
Ну попытался разделить... Создаю окно, делаю дочерний диалог, делаю поток. Все работает. Второй эксперимент - Создаю окно, делаю дочерний диалог и показываю, делаю поток. Все виснет. (этот пример в приложении) Подозрение на прорисовку окна. Как исправлять?
Угу, так и есть, поставил временную заглушку. Присоединённый файл ( Кол-во скачиваний: 3 )
getdataTestExample.rar 38,57 Kb |
||||
|
|||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: 10 Всего: 12 |
Вот, у меня вроде пашет...
Это сообщение отредактировал(а) Aleksandor - 25.12.2006, 06:38 Присоединённый файл ( Кол-во скачиваний: 5 )
000my.rar 5,00 Kb-------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| oper54 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 13.5.2005 Репутация: нет Всего: 1 |
по поводу вот этого... надо под твои данные глобально выделять память GlobalAlloc, и тогда не надо будет ни каких смещений указывать, и все потоки нормально будут работать с этим отрезком памяти... хотя с прагмами тоже вариант, если не хо с памятью морочится... =) ИМХО по меньше пользоватся надо дерективами компилера, ибо не у всех компилеров они такие есть =) |
|||
|
||||
| neosapient |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: 3 Всего: 4 |
Aleksandor, а ты поставь брякпоинт на начало функции AnalysFile и будет тебе "шастъе" В общем пока не пашет... oper54, данные структурированы и я честно говоря не предсталяю как тут применить GlobalAlloc, вместо выравнивания полей. Поясни примером, что имелось в виду... |
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: 10 Всего: 12 |
Я конешно сильно извиняюсь... Но... зачем ставить breakpoint на начале AnalyseFile
-------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| neosapient |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: 3 Всего: 4 |
Чтоб, проверить правильность работы... И вообще надо чтоб в любой части программы можно было ставить breakpoint, чтоб контролировать правильность работы. А то как разобраться с кодом черного ящика... |
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: 10 Всего: 12 |
Не обязательно
-------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| neosapient |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: 3 Всего: 4 |
А как контролировать поля структур далее??? |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |