|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 11, 2004 18:09:48 · Поправил: cresta.data
hThread dd 0
.code
invoke CreateThread,NULL,NULL,addr ThreadProc,NULL,0,addr hThread
ThreadProc proc lParam:dword
PrintText "HERE" ;пишет, что в процедуру попали
ret ;программа вылетает
ThreadProc endp
Собственно сам вопрос: почему программа вылетает при возвращении из потока? Пробовал через GetExitCodeThread-> ExitThread - всё равно вылетает, пробовал TerminateThread - тот же результат. |
|
|
Дата: Авг 11, 2004 18:33:19 ThreadProc() же передается 1 параметр. ret 4 наверное надо |
|
|
Дата: Авг 11, 2004 18:35:04 · Поправил: VOOrDOOluck Посмотри пример айселона Х:\masm32\icztutes\TUTE15\THREAD.ASM Может поймеш mov eax,OFFSET ThreadProc invokeCreateThread,NULL,NULL,eax,\ NULL,NORMAL_PRIORITY_CLASS,\ADDR ThreadID invoke CloseHandle,eax ThreadProc PROC USES ecx Param:DWORD mov ecx,300000000 Loop1: add eax,eax dec ecx jz Get_out jmp Loop1 Get_out: invoke SendMessage,hwnd,WM_FINISH,NULL,NULL ret ThreadProc ENDP |
|
|
Дата: Авг 11, 2004 19:16:35 ssx ret 4 тоже пробовал - не помогло. VOOrDOOluck Может поймеш Видел я это. И что тут можно такого сокровенного найти? Чем принципиально отличается Icezelion'овский пример от моего вызова? hThread возвращается нормально,процедура вызывается правильно,что положено выполняет. Тем что там CloseHandle? Мне хэндл ещё нужен, поэтому не закрываю. Разницы в применении offset и addr в данном случае нет. Перепробовал все варианты. |
|
|
Дата: Авг 11, 2004 21:44:11 cresta Если б вместо твоей PrintText "HERE" там стоял MessageBox и ты спрашивал бы, то было бы понятно, но нихрена ведь неизвестно что творится у тебя в PrintText "HERE", бери дебаггер и проверяй. ssx > ThreadProc() же передается 1 параметр. ret 4 наверное надо Это ж masm однако, там и будет ret 4 после компиляции. |
|
|
Дата: Авг 11, 2004 21:55:04 cresta > Мне хэндл ещё нужен, поэтому не закрываю. Зачем тебе хэндл если thread уже отработал |
|
|
Дата: Авг 11, 2004 21:55:51 А почему бы не заиметь какой-нибудь Event, созданный, как NotSet и ожидать после вызова CreateThread WaitFor..этот Event. А в ThreadProc в конце поставить SetEvent. Кажется будет работать. Или чё нитак понял. |
|
|
Дата: Авг 11, 2004 22:38:10 Asterix Зачем тебе хэндл если thread уже отработал Это просто пустая процедура для примера(чтобы не заваливать топик), чтобы понять, почему не возвращается, на деле в процедуре работает цикл, и достаточно долго. И при некоторых обстоятельствах бывает необходимо прервать этот поток, чтобы перезапустить снова, уже с другими параметрами. Поэтому хэндл нужен. Есть или нет PrintText - ничего не меняется, он только для того, чтобы показать, что вызов прошёл нормально. Случайно определил, что поток нормально отрабатывает и нормально, безо всяких коллизий возвращается, если создается в каком - либо другом месте кода. Отсюда вопрос: как влияет на создание и завершение потока конкретное место, откуда он запускается? Разве не всё равно, откуда вызывать CreateThread? |
|
|
Дата: Авг 11, 2004 22:38:23 Asterix Зачем тебе хэндл если thread уже отработал Это просто пустая процедура для примера(чтобы не заваливать топик), чтобы понять, почему не возвращается, на деле в процедуре работает цикл, и достаточно долго. И при некоторых обстоятельствах бывает необходимо прервать этот поток, чтобы перезапустить снова, уже с другими параметрами. Поэтому хэндл нужен. Есть или нет PrintText - ничего не меняется, он только для того, чтобы показать, что вызов прошёл нормально. Случайно определил, что поток нормально отрабатывает и нормально, безо всяких коллизий возвращается, если создается в каком - либо другом месте кода. Отсюда вопрос: как влияет на создание и завершение потока конкретное место, откуда он запускается? Разве не всё равно, откуда вызывать CreateThread? |
|
|
Дата: Авг 12, 2004 00:12:36 cresta Может мы все-таки увидим программу или хотя бы исходник? |
|
|
Дата: Авг 12, 2004 02:11:00 Black_mirror В аттаче 3 процедуры - две из которых вызывается, и одна, которая вызывается. _1187373562__tmp.asm |
|
|
Дата: Авг 12, 2004 02:52:42 · Поправил: Asterix cresta В процедуре PrepareIndex вовсю юзается ebx но я нигде не видел чтобы он у тебя сохранялся!! |
|
|
Дата: Авг 12, 2004 05:59:46 cresta Согласен с Asterix. + в PrepareIndex ты не используешь диапазон из lParam, а всегда используешь [0...Cnt], что содержит Cnt при вызове потока из ListProc? |
|
|
Дата: Авг 12, 2004 11:48:33 Asterix я пробовал делать pushad/popad+push edi&esi/pop edi&esi, пробовал uses, т.к. видел, что регистры меняются все. Да и в варианте с нормальным вызовом и возвратом я ведь не сохраняю ebx тоже, как с этим быть? И при этом работает. q_q Cnt содержит кол-во файлов найденых поиском. В одном случае (из ListButtProc) запрашиваю сразу для всех индексы иконок, а в другом (из ListProc) только для тех, кто обозначился по LVN_ODCACHEHINT т.е. от .iFrom до .iTo. Пробовал в обоих вариантах использовать передачу диапазона как через lParam, так и через глобальную переменную. |
|
|
Дата: Авг 12, 2004 12:26:37 cresta а в другом (из ListProc) только для тех, кто обозначился по LVN_ODCACHEHINT т.е. от .iFrom до .iTo. Но при этом внутри PrepareIndex используешь Cnt, а не lParam. Ты уверен, что Cnt содержит допустимое значение? Другое возможное объяснение, что пришло несколько LVN_ODCACHEHINT и запущено несколько PrepareIndex, а что они могут натворить неизвестно. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.063 |