передача более одного параметра потоковой функции

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

  1. Ko1d

    Ko1d New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2006
    Сообщения:
    8
    собственно, как?
    если в CreateThread передается один параметр ( как передать функции два? или более? думал через структуру там может, но в коде это осуществить не удалось (

    спасибо..
     
  2. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    только через структуру

    а в CreateThread передавать указаткль на ее экземпляр.

    показывай код. или пиши конкретнее в чем собственно проблема
     
  3. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    код в студию
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Выдели память под структуру и передай указатель на неё.
     
  5. Ko1d

    Ko1d New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2006
    Сообщения:
    8
    если выделять память под структуру, то все получается
    а если нужно запустить процедуру в потоке, которой нужно передать более одного параметра?


    Код (Text):
    1. Suks struct
    2. par1 dd ?
    3. par2 dd ?
    4. Suks ends
    5.  
    6.  
    7.  
    8. .data
    9.  
    10. s1  db "Hi",   0
    11. s2  db "man!", 0
    12.  
    13.  
    14. hMem    dd 0
    15. ThreadId    dd 0
    16.  
    17.  
    18.  
    19.  
    20.  
    21. .code
    22.  
    23.  
    24.  
    25. start:
    26.  
    27.  
    28. invoke VirtualAlloc, 0, sizeof Suks, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE
    29. mov hMem, eax
    30. assume eax : ptr Suks
    31. mov [eax].par1, offset s1
    32. mov [eax].par2, offset s2
    33.  
    34. push hMem
    35.  
    36. lea ecx, ThreadProc
    37. lea edx, offset ThreadId
    38. invoke CreateThread, 0, 0, ecx, hMem, 0, edx
    39.  
    40. .while TRUE
    41. invoke Sleep, 3000
    42. .endw
    43. invoke ExitProcess, 0
    44.  
    45.  
    46.  
    47.  
    48. ThreadProc PROC shit:dword
    49.  
    50. mov esi, shit
    51. assume esi: ptr Suks
    52. invoke MessageBox, 0, [esi].par1, [esi].par2, MB_OK
    53.  
    54. ret
    55.  
    56. ThreadProc endp
    57.  
    58.  
    59.  
    60.  
    61. end start
    так все робит, а вот как быть если функция


    Код (Text):
    1. ThreadProc PROC par1:dword, par2:dword
    2.  
    3. invoke MessageBox, 0, par1, par2, MB_OK
    4.  
    5. ret
    6.  
    7. ThreadProc endp
    типа такого?...
     
  6. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    зачем вообще именно так нужно делать?

    ThreadProc зарезервирована как колбэк функция с одним параметром, тобишь тут ты изменить ничего не сможешь

    Только 1й вариан подходит
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    если приспичило, делай переходник:
    Код (Text):
    1. Args struct
    2.   var1 dd ?
    3.   var2 dd ?
    4. Args ends
    5.  
    6. ThreadProc proc lpParam
    7.   mov  eax,[lpParam]
    8.   invoke YourThreadProc,[eax].Args.var1,[eax].Args.var2
    9.   ret
    10. ThreadProc endp
    11.  
    12. YourThreadProc proc par1,par2
    13.   ret
    14. YourThreadProc endp
     
  8. Ko1d

    Ko1d New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2006
    Сообщения:
    8
    Большое спасибо всем!
    разобрался!..