почумута не работает CreateThread

Тема в разделе "WASM.BEGINNERS", создана пользователем goga2007, 4 июн 2007.

  1. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    это просто ппц.
    тебе же уже всё разжевали.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    goga2007
    Не туда WaitForSingleEvent положил :)
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    goga2007
    ОМФГ =\\\\\
    IceStudent +1... это ппц просто. где же яд=\
     
  4. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    ...ну что не так еще?? смотрим в тутор икцелиона:
    "....В этом пpимеpе я демонстpиpую дpугую технику pаботы с тpедами.

    .IF uMsg==WM_CREATE
    invoke CreateEvent,NULL,FALSE,FALSE,NULL
    mov hEventStart,eax

    mov eax,OFFSET ThreadProc
    invoke CreateThread,NULL,NULL,eax,\
    NULL,0,\
    ADDR ThreadID

    invoke CloseHandle,eax

    Вы можете видеть, что я создал объект события и тpед во вpемя обpаботки сообщения WM_CREATE. Я создаю объект события, установленного в состояние "выключенно"(а я сразу включаю его)
    и обладающего свойством автомтического выключения. После того, как объект события создан, я создаю тpед. Тем не менее, тpед не начинает выполняться немедленно, так как он ждет, пока не включится объект события:

    ThreadProc PROC USES ecx Param:lol: WORD

    invoke WaitForSingleObject,hEventStart,INFINITE
    mov ecx,600000000

    Пеpвая линия пpоцедуpы тpеда - это вызов WainForSingleObject. Она ждет, пока не включится объект события, а затем возвpащается. Это означает, что даже если тpед создан, мы помещаем его в спящее состояние. Когда пользователь выбиpает в меню команду "run thread", мы включаем объект события..."

    у меня все также, хотя мне кажется(так оно и есть), что все осталось по-прежнему, только кода больше....

    ПС те прошу прощения - не сразу включаю
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Зачем создавать евенТ? Ты вообще чето не то делаешь. Я имел в виду WaitForSingleObject на объект нового треда, вызванного в главном треде.
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    goga2007
    Не надо делать CloseHandle сразу после CreateThread ибо возврат из последней и вызов первой может произойти до старта потока.
     
  7. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    вот что пишет икцелион по этому поводу:
    "...Создать тpед", пpогpамма создает тpед:

    .if ax==IDM_CREATE_THREAD
    mov eax,OFFSET ThreadProc
    invoke CreateThread,NULL,NULL,eax,\
    NULL,0,\

    ADDR ThreadID
    invoke CloseHandle,eax

    Вышепpиведенная функция создает тpед, котоpый запустит пpоцедуpу под названием ThreadProc паpаллельно с основным тpедом. Если вызов функции пpошел успешно, CreateThread немедленно возвpащается и ThreadProc начинает выполняться. Так как мы не используем хэндл тpеда, нам следует закpыть его, чтобы не допустить бессмысленное pасходование памяти. Закpытие хэндла не пpеpывает сам тpед. Единственным эффектом будет то, что мы не сможем больше использовать его хэндл."
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    короче на тебе пример на си, чтоб ты больше не устал всем моск=\

    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. DWORD APIENTRY Thread( LPVOID )
    5. {
    6.     printf("In child thread!\n");
    7.  
    8.     return 0;
    9. }
    10.  
    11. int main()
    12. {
    13.     DWORD thID = 0;
    14.     HANDLE hThread = NULL;
    15.  
    16.     printf("Main thread: before CreateThread\n");
    17.  
    18.     hThread = CreateThread( 0, 0, Thread, 0, 0, &thID );
    19.     printf("Main thread: after CreateThread\n");
    20.  
    21.     WaitForSingleObject( hThread, INFINITE );
    22.  
    23.     printf("Main thread: after WaitForSingleObject\n");
    24.  
    25.     CloseHandle( hThread );
    26.     return 0;
    27. }
     
  9. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    Great
    ...вспыльчивый ,однако, паренек...ну чего ты нервничаешь? я же тебя лично не прошу мне отвечать...
    ...или тебя обязывает ктото это делать?
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    просто мне сейчас три часа компостировали мозги как поставить глобальный хук на клаву и почему не компилируется дллька :) немного нервный теперь.
    а по делу - вот я тебе пример кинул, разбирайся. переписать на асм смогёшь?
    просто ты WaitForSingleObject не туда пихал. Надо ожидать сам хендл потока, а ты там какието евенты создавал.
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    goga2007
    Закpытие хэндла не пpеpывает сам тpед
    Я не утверждал обратного. Проблема в том, что "мы не используем хэндл тpеда", а для определения того, что функция потока завершила свою работу ты "ставил брейкпойнт в оле" вместо использования, например, WaitForSingleObject. Olly - multithread отладчик? Установка breakpoint в olly в "главном" потоке не останавливает выполнение остальных потоков отлаживаемого процесса?
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    В олли при желании можно отлаживать мультитредовые проги, но лучше этого не делать ;)
     
  13. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Зачетная тема. Необходимо читать правила форума, пользовать поиск и тому подобные вещи. А вот использование нецензурной лексики до добра не доведет, давайте будем более терпимыми друг к другу.
     
  14. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    гм, сомневаюсь.

    goga2007
    Просто после вызова CreateThread делай Sleep(-1) в первом потоке, а в потоковой процедуре поставь в начале int 3. И запускай это все в олли! Тогда все увидишь.

    CreateThread создает поток, а тот КТО создает продолжает исполнятся параллельно! Передает управление твоей процедуре JMP или CALL :)
     
  15. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Да это совсем не в тему.
     
  16. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Mental_Mirror
    Да это совсем не в тему.
    Ваше право отлаживать программу sleep'ами и 0xCC'ами. ;)
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А ты попробуй.
     
  18. trash_master

    trash_master New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2006
    Сообщения:
    319
    Адрес:
    Україна
    прямой намек подобную тему в ФАК, и не забудьте про CreateRemoteThread. Таких топиков еще будет и будет, или на крайний случай предлагаю купить Great`у валерьянки :)
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Пробовал - не помогает :)
     
  20. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Ну дык я ж не про отладку. Надо просто человеку увидеть собственными глазами, что поток его все таки выполняется. А описатель закрывают сразу, если он не нужен. И какие-либо хитрости здесь отсутствуют.