· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› как нам вернуться домой (из Thread'a)?

. 1 . 2 . >>

Посл.отвђт Сообщен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, а что они могут натворить неизвестно.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.063