как прибить тред с рекурсивной функцией?

Тема в разделе "WASM.BEGINNERS", создана пользователем xchg, 13 янв 2007.

  1. xchg

    xchg New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2006
    Сообщения:
    34
    Адрес:
    Russia
    Здравствуйте)
    В общем создается поток с рекурсивной функцией поиска файлов. Я сделал флажок, который проверяется в потоке перед тем,как происходит рекурсия.
    Должно работать так,когда надо прибить поток устанавливает этот флажок и поток соответсвенно должен завершится. но на практике этот поток просто зависает и все(
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    xchg
    Это смотря где ты флажок этот устанавливаешь и как проверяешь, скорее всего, логика нарушена
     
  3. xchg

    xchg New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2006
    Сообщения:
    34
    Адрес:
    Russia
    Код (Text):
    1. invoke FindFirstFile,addr fBuffer,addr wfd
    2.     .if eax==INVALID_HANDLE_VALUE
    3.         ret
    4.     .endif 
    5.     mov hSearch,eax
    6.    
    7.     Repeate:
    8.          cmp fExitFindFiles,1   ;проверяем флажок
    9.     je Quit
    10.    
    11.     invoke lstrcmpi,addr szPoint,addr wfd.cFileName
    12.     je FindNext
    13.     invoke lstrcmpi,addr sz2Point,addr wfd.cFileName
    14.     je FindNext
    15.    
    16.     invoke lstrcpy,addr fBuffer,PathName
    17.     invoke lstrlen,addr fBuffer
    18.     lea edi,fBuffer
    19.     add edi,eax
    20.     xor eax,eax
    21.     mov esi,edi
    22.     dec esi
    23.     lodsb
    24.     cmp eax,'\'
    25.     je @f
    26.     mov al,'\'
    27.     stosb
    28.     mov al,0
    29.     stosb
    30.     @@:
    31.     invoke lstrcat,addr fBuffer,addr wfd.cFileName
    32.    
    33.     lea esi,wfd.dwFileAttributes
    34.     mov eax,[esi]
    35.     .if ax & FILE_ATTRIBUTE_DIRECTORY
    36.         pushad
    37.         push hSearch
    38.         lea edi,BufferForSearch
    39.         mov ecx,512
    40.         xor eax,eax
    41.         rep stosb
    42.         invoke lstrcpy,addr BufferForSearch,addr fBuffer
    43.         invoke lstrlen,addr BufferForSearch
    44.         lea edi,BufferForSearch
    45.         add edi,eax
    46.         mov al,'\'
    47.         stosb
    48.         xor al,al
    49.         stosb
    50.         invoke FindFiles,addr BufferForSearch;,hListView
    51.         pop hSearch
    52.         popad
    53.     .endif
    54.  
    55.     FindNext:
    56.     invoke FindNextFile,hSearch,addr wfd
    57.     cmp eax,0
    58.     je Quit
    59.     jmp Repeate
    60.  
    61.     Quit:
    62.     invoke FindClose,hSearch
    63.     ret
     
  4. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    ExitThread вызываешь?
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    xchg
    Что-то я не вижу, чтобы после проверки флажка функция вернула eax=0
     
  6. xchg

    xchg New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2006
    Сообщения:
    34
    Адрес:
    Russia
    зачем она должна возвращать 0?
    я сейчас попробовал все равно не работает
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    xchg
    Да, согласен, не должна. Попробуй подебужить.
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1.     invoke FindFiles,addr BufferForSearch;,hListView
    2. [b]        cmp fExitFindFiles,1   ;проверяем флажок
    3.     je Quit[/b]
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ну или как советовал Cr4sh вызывай ExitThread когда выходить будешь.
    Код (Text):
    1.          cmp fExitFindFiles,1   ;проверяем флажок
    2.          jne nonflag
    3.          invoke FindClose,hSearch
    4.          invoke ExitThread, 0
    5. nonflag:
     
  10. xchg

    xchg New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2006
    Сообщения:
    34
    Адрес:
    Russia
    добавил проверку после выхода из рекурсии и все заработало)
    Код (Text):
    1. invoke FindFiles,addr BufferForSearch;,hListView
    2.         pop hSearch
    3.         popad
    4.  
    5.         cmp fExitFindFiles,1
    6.         je Terminate
    7.  
    8.     .endif