Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2012, 09:10   #1
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию Closehandle (thread)-ошибка чтения памяти.

Все доброго времени суток. Суть вот в чем: при загрузке программы открывается форма (якобы загрузочная, для примера вот как офис 10), на create стоит таймер, который запускает функцию анимации в потоке. делаю это с помощью BeginThread. так вот. Когда все отработало, по закрытию формы я пишу Closehandle. Вылетает ошибка чтения памяти. Скорее всего я что-то не так делаю, но не могу понять что. В примерах, что нашел в интернете, методика такая же: сначала BeginThread, потом Closehandle. Подскажите, что я делаю не так?
googl вне форума Ответить с цитированием
Старый 29.03.2012, 09:26   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Скорее всего я что-то не так делаю, но не могу понять что.
Мы тоже не можем понять что ты делаешь.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 29.03.2012, 09:29   #3
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Мы тоже не можем понять что ты делаешь.
да суть не в том что именно я делаю, а как) есть процедура. я ее запускаю с помощью beginthread. в процедуре стоит цикл. и он выполняется пока переменная тру. на закрытии формы я присваиваю этой переменной фолс и пишу closehandle. Вылетает ошибка чтения памяти.
googl вне форума Ответить с цитированием
Старый 29.03.2012, 09:31   #4
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию

Код:
begin
  // установка наших отображаемых сообщений
  msg1.thread := 1;
  msg1.msg    := 'Hello World';
  msg2.thread := 2;
  msg2.msg    := 'Goodbye World';

  // Запуск первого выполнения потока, спрошивающего имя пользователя
  thread1 := BeginThread(nil,
                         0,
                         Addr(ShowMsg),
                         Addr(msg1),
                         0,
                         id1);

  // И также спрашиваем фамилию
  thread2 := BeginThread(nil,
                         0,
                         Addr(ShowMsg),
                         Addr(msg2),
                         0,
                         id2);

  // Гарантируйте, что потоки будут закрыты только когда всё сделано
  ShowMessagePos('Press this when other dialogs finished.', 200, 300);

  // Наконец, убераемся, закрывая потоки
  CloseHandle(thread1);
  CloseHandle(thread2);
end;
что-то вроде этого. только есть глобальная переменная, которой я фолс и присваиваю. а в процедуре проверяю. и если она фолс, останавливаю цикл.
googl вне форума Ответить с цитированием
Старый 29.03.2012, 09:32   #5
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Closehandle (thread)-ошибка чтения памяти.
Так бывает если идет попытка закрытия невалидного хендла.
Видимо Closehandle вызывется неоднократно. Попробуйте после Closehandle обнулить переменную thread.
EUGY вне форума Ответить с цитированием
Старый 29.03.2012, 09:35   #6
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Так бывает если идет попытка закрытия невалидного хендла.
Видимо Closehandle вызывется неоднократно. Попробуйте после Closehandle обнулить переменную thread.
спасибо, попробую. сейчас просто на работе. и тут кроме navision ничего нет =(
googl вне форума Ответить с цитированием
Старый 29.03.2012, 13:42   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
да суть не в том что именно я делаю
суть как раз в этом.
Цитата:
процедура. я ее запускаю с помощью beginthread. в процедуре стоит цикл. и он выполняется пока переменная тру. на закрытии формы я присваиваю этой переменной фолс и пишу closehandle
внутри потока?! закрываем сами себя!
это мои догадки не подтвежденные вашим кодом
да еще
Цитата:
Код:
  ShowMessagePos('Press this when other dialogs finished.', 200, 300);

  // Наконец, убераемся, закрывая потоки
  CloseHandle(thread1);
  CloseHandle(thread2);
Цитата:
Видимо Closehandle вызывется неоднократно.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 29.03.2012, 13:50   #8
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию

Closehandle))) Не внутри конечно. А то что я код написал. Я по аналогии делаю. Нет сейчас моего кода под рукой
googl вне форума Ответить с цитированием
Старый 02.04.2012, 09:43   #9
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

CloseHandle можно и внутри. Это говорит винде, что поток нас больше не интересует. Но не закрывает его. Нужен код функции, запускаемой потоком, вызовы самих потоков, процедуру закрытия.
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка чтения памяти при посылки дублирующей команды Close Вспомогательной Форме (Form2) deryt Общие вопросы Delphi 4 09.01.2012 22:14
Ошибка 100: Ошибка чтения с диска. vodilawofer Помощь студентам 5 28.12.2011 22:49
Попытка чтения защищенной памяти Cannibal Общие вопросы C/C++ 1 06.11.2011 15:16
Ошибка чтения из памяти Шульц Общие вопросы Delphi 20 03.11.2009 12:26
Thread creation error - Недостаточно памяти RealSwift Общие вопросы Delphi 1 06.07.2008 12:27