CreateThread с разными переменными

Тема в разделе "WASM.BEGINNERS", создана пользователем readme, 7 авг 2005.

  1. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    нужно создавать одновеременно несколько потоков но с разными начальными значениями, как этого добиться?
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    передавать адрес блока данных ф-ции трэда.
    Код (Text):
    1.  
    2.     unsigned long ID;
    3.     void * thread = CreateThread(0, 0, thread_function, this /* points to data block */, 0, &ID);
    4.  
    5. //
    6.  
    7. unsigned long __stdcall my_class::thread_function(void * p)
    8. {
    9.     /// Функция выполняется в отдельном трэде,
    10.     /// поэтому передаём указатель на объект в качестве параметра
    11.     /// __stdcall функции.
    12.     my_class * This = (my_class *) p;
    13.  
    14.     ///
     
  3. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    чтот я невъежаю пока, S_T_A_S_ можно поподробней)



    вот к примеру

    invoke CreateThread,0,0, offset funktion,0,???,offset ThreadID

    там где ??? туда пишем адресс данных каторые у нас неизменятся для потока?

    а какого они будут размера?

    в потоке этот адрес будет фиксированным?
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Вместо ??? передаём адрес данных. Размер данных может быть какой хочешь, трэд должен его либо знать заранее, либо этот размер можно поместить в первый dword данных. Мой пример выше в качестве таких данных передаёт указатель на экземпляр класса.
     
  5. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    я просто синтексис "c" почти незнаю.

    а как же поток узнает этот адрес который мы ему передаём чтото я непойму(((

    чувствую придётся рихтера читать, искать там то что мне нужно
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Примерно так это может выглядеть на fasm
    Код (Text):
    1.         xor    ebx, ebx
    2.  
    3.         ; выделяем место для данных
    4.         push   size_of_data    ; dwBytes
    5.         push   ebx             ; dwFlags = 0
    6.         call   [GetProcessHeap]
    7.         push   eax             ; hHeap
    8.         call   [HeapAlloc]
    9.         ; eax = адрес данных
    10.  
    11.         push   ecx             ; выделяем место для lpThreadId
    12.         push   esp             ; адрес lpThreadId
    13.         push   ebx             ; dwCreationFlags = 0
    14.         push   eax             ; lpParameter - это значение получает ф-ция трэда
    15.         push   thread_function ; lpStartAddress
    16.         push   ebx             ; dwStackSize по умолчанию
    17.         push   ebx             ; lpThreadAttributes = 0
    18.  
    19.         ;;
    20.         ; здесь помещаем данные в выделенную память (адрес в eax)
    21.         ;;
    22.  
    23.         call   [CreateThread]
    24.         ; eax = handle to the new thread
    25.         pop    ecx             ; ecx = ThreadId
    26.  
    27.         ;;
    28.  
    29. ; ф-ция трэда
    30. thread_function:
    31.         mov     eax, [esp + 8] ; адрес данных, переданный в CreateThread
     
  7. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    я раньше с кучами не работал

    вот я чуть подсебя переделал

    xor ebx, ebx

    ; выделяем место для данных

    call GetProcessHeap



    push 4;size_of_data ; dwBytes

    push ebx ; dwFlags = 0

    push eax ; hHeap

    call HeapAlloc



    mov ebx,offset thread_function

    invoke CreateThread,0,0, ebx,eax,0 ,offset ThreadID;REALTIME_PRIORITY_CLASS ,offset ThreadID

    jmp $

    ; ф-ция трэда

    thread_function proc

    mov eax, [esp + 04h] ; адрес данных, переданный в CreateThread

    thread_function endp

    ;------------------------------------

    push 4;size_of_data ;тут мы запрашиваем 4е байта?

    HeapAlloc нам указывает где адрес на 4е байта?

    ps

    почемуто у меня смещения в стеке произошло другое чем у тебя
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    readme >




    Да. Но выделять в хипе 4ре байта смысла немного - проще этот dword передавать сразу как параметр для ф-ции CreateThread (и, соответственно, thread_function получит этот dword)



    >




    masm сгененрировал пролог ф-ции (push ebp, mov ebp, esp), а в моём варианте ф-ция без пролога.

    В masm объявляй ф-цию трэда так:

    thread_function proc param:lol: WORD

    тогда в переменной param будет адрес.
     
  9. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    S_T_A_S_ спасибо)