![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Надо завершить дополнительный поток...
Вот так я делаю :
Программа компилиться, но при тестировании выпадает некоректное юзание памятью Что скажете ? Я использую этот способ(экстр. завершение), потому что данный код исполняется в главном потоке, а не в дополнительном... Это сообщение отредактировал(а) chipset - 5.1.2005, 15:03 |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 2 Всего: 165 |
А проверять не забываем память? Он у тебя не static обьект случаем? --------------------
|
||||
|
|||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
chipset
Да... после создания потока, я установил m_bAutoDelete = FALSE, так что в памяти действительно будет висеть Main_pot(вернее его остатки Проблема имхо тут : "GetExitCodeThread(Main_pot->m_hThread, lp_my_ret); while(*lp_my_ret == STILL_ACTIVE)" Добавлено @ 15:18 CWinThread *Main_pot; Это сообщение отредактировал(а) En_t_end - 5.1.2005, 15:20 |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 2 Всего: 165 |
Пройдись дебаггером и посмотри где происходит выброс памяти.
Желательно ещё использовать клавишу F11 (в VC7.1). Это сообщение отредактировал(а) chipset - 5.1.2005, 15:19 --------------------
|
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 1 Всего: 99 |
En_t_end, тут я раз уже своими мыслями делился
http://forum.vingrad.ru/index.php?showtopi...ndpost&p=276689 -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Прошёлся по-этапно дебаггером, ошибка здесь :
*lp_my_ret == STILL_ACTIVE Почему сравнение не правильно ? Добавлено @ 15:29 cardinal А где именно ты говорил про аннологичную ситуацию ? Тут проблемма имхо в другом... |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 2 Всего: 165 |
Память не выделил для lp_my_ret --------------------
|
||||
|
|||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
LPDWORD lp_my_ret;
TerminateThread(Main_pot->m_hThread, 0); GetExitCodeThread(Main_pot->m_hThread, lp_my_ret); while(*lp_my_ret == STILL_ACTIVE) { Sleep(10); GetExitCodeThread(Main_pot->m_hThread, lp_my_ret); } GlobalFree(Main_pot); //Забыл то самое главное Цикл вообще не правильно организовал Сейчас ещё раз дебагером пройдусь... |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 2 Всего: 165 |
En_t_end, лишний раз щелкай кнопкой "Код", так гораздо удобнее читать ;)
--------------------
|
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Ага теперь материться на GetExitCodeThread(Main_pot->m_hThread, lp_my_ret), видно не правильно я в lp_my_ret статус ложу
Добавлено @ 15:36 "лишний раз щелкай кнопкой "Код", так гораздо удобнее читать ;)" Не могу |
|||
|
||||
| chipset |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 2 Всего: 165 |
Память выделяй для lp_my_ret Примерно так: lp_my_ret = new DWORD; Добавлено @ 15:43
Какой браузер? --------------------
|
||||||
|
|||||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Какой браузер?
Micr. Enternet Expl. Это имхо в поддержке java проблемма... так как любой жабовский скрипт, на моем компе запускаться не хочет, просто ничего не делает Всё заработало Chipset Спасибо... Действительно память не выделил "+" репутация... |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 2 Всего: 165 |
Надо бы это в фак занести, я на этой фигне дни тратил... --------------------
|
||||
|
|||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 2 Всего: 165 |
Модератор: перенесено из Visual C++/MFC/WTL в Системное программирование
--------------------
|
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
ОФФТОП почему из Visual C++/MFC/WTL в Системное программирование ???
Тут теперь ещё странность одна... Если допустим поток завершился во время спячки(Sleep(-n-)), то, если я захочу создать ещё раз этот поток, то в локальных переменных этого потока оказывается такая чушь !!! Интересно из-за чего это ? |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 1 Всего: 99 |
Я там просто мысли по управлению потока высказывал А слово кстати volatile (при объявлении переменных) тебе что-нибудь говорит? Если нет, то почитай про него что-нибудь в инете. Это очень важно при работе с потоками. Но тут как видно дело было именно в выделении памяти, точнее в ее невыделении А можешь полностью код запостить - интересно посмотреть, что у тебя получлось. Создание потока тоже если можно... Просто в VB с этим проблемы какие-то, а ты тут в принципе API пользуешься, можно попробовать перевести то, что ты написал и посмотреть будет ли работать в VB -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
cardinal
"volatile" "то в локальных переменных этого потока оказывается такая чушь !!!"---Это ты про это ? или про это : ??? ""Но тут как видно дело было именно в выделении памяти, точнее в ее невыделении"" "А можешь полностью код запостить - интересно посмотреть, что у тебя получлось." Пока не могу, до конца ещё не до делал, кстати в "Visual C++ and MFC", про такой способ завершения потока вообще ничего не сказанно, сказанно лишь, что существует TerminateThread(%%%, %%%); и GetExitCodeThread(%%%, %%%);, а дальше сам думай... не хорошо поступили |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Всё ура!!!... с переменными разобрался... кстати тоже мучился около недели...
Если кому-то интересно : ПОТОК -_- Вообще-то проблема была в местах использования этих переменных... Я записывал, допустим из файла в цикле значения в переменные, вот так я делал : (кому не трудно, плиз, сделайте "код" на этих записях !) ///////Глобальное.../////// ifstream config; ifstream config_2; ofstream log_my; CWinThread *Main_pot; /////////////////////////////// UINT Potoc(LPVOID pParam) { char N[37]; int P_I = 0; for(;;) { P_I = 0; config.open("config.C"); config_2.open("config_2.C"); log_my.open("last_Status.C"); config >> N; config_2 >> P_I; log_my << N << endl << P_I << endl; log_my.flush(); GlobalFree(N); // Некорректное исполнение config_2.close(); // ______________________ config.close(); // _________________ log_my.close(); //_________ Sleep(6000); //_____ } } ............................................... void CProg::OnStart() { ................................. Main_pot = AfxBeginThread((AFX_THREADPROC)Potoc, (LPVOID)&Status, THREAD_PRIORITY_NORMAL, 0, 0, NULL); Main_pot->m_bAutoDelete = FALSE; } ................................ void CProg::OnStop() { ................................................ LPDWORD lp_my_ret; lp_my_ret = new DWORD; TerminateThread(Main_pot->m_hThread, 0); GetExitCodeThread(Main_pot->m_hThread, lp_my_ret); while(*lp_my_ret == STILL_ACTIVE) { Sleep(10); GetExitCodeThread(Main_pot->m_hThread, lp_my_ret); } config_2.close(); config.close(); log_my.close(); GlobalFree(Main_pot); GlobalFree(lp_my_ret); .................. } Вот если успевать нажать на СТОП во время спячки Main_pot, то после повторного запуска, в переменных окажется мега-чушь, а если заменить вот эти строчки : ............................. GlobalFree(N); // Некорректное исполнение config_2.close(); // ______________________ config.close(); // _________________ log_my.close(); //_________ Sleep(6000); //_____ ............................. на эти : ............................. Sleep(6000); //_____ GlobalFree(N); // Корректное исполнение config_2.close(); // ______________________ config.close(); // _________________ log_my.close(); //_________ ............................. То всё будет нормально !!! Так как я с памятью ещё не очень научился работать, то по научному обьяснить не могу |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
cardinal
За volatile спасибо, каждый день открываю что-нибудь новое для себя... Насколько понял, это способ оптимизации, так ? |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 1 Всего: 99 |
Это способ "защиты" переменной от потери данных -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
"Это способ "защиты" переменной от потери данных "
Ну тыды, я правильно сделал, что не использовал его, так как мне имхо надо было наоборот избавиться от данных, как можно лучше... |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 2 Всего: 165 |
volatile - указывает оптимизеру что эту переменную нельзя хранить в регистрах поскольку она долговечная.. --------------------
|
||||
|
|||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 1 Всего: 99 |
Не не совсем так, см. тут: http://doc.mpv.ru/steps/mfc/steps/339.html -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 1 Всего: 99 |
Ну и что значит слово "долговечная" -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 2 Всего: 165 |
cardinal
Ияжочем.. --------------------
|
|||
|
||||
![]()
|
| Правила форума "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. |