нужно создавать одновеременно несколько потоков но с разными начальными значениями, как этого добиться?
передавать адрес блока данных ф-ции трэда. Код (Text): unsigned long ID; void * thread = CreateThread(0, 0, thread_function, this /* points to data block */, 0, &ID); // unsigned long __stdcall my_class::thread_function(void * p) { /// Функция выполняется в отдельном трэде, /// поэтому передаём указатель на объект в качестве параметра /// __stdcall функции. my_class * This = (my_class *) p; ///
чтот я невъежаю пока, S_T_A_S_ можно поподробней) вот к примеру invoke CreateThread,0,0, offset funktion,0,???,offset ThreadID там где ??? туда пишем адресс данных каторые у нас неизменятся для потока? а какого они будут размера? в потоке этот адрес будет фиксированным?
Вместо ??? передаём адрес данных. Размер данных может быть какой хочешь, трэд должен его либо знать заранее, либо этот размер можно поместить в первый dword данных. Мой пример выше в качестве таких данных передаёт указатель на экземпляр класса.
я просто синтексис "c" почти незнаю. а как же поток узнает этот адрес который мы ему передаём чтото я непойму((( чувствую придётся рихтера читать, искать там то что мне нужно
Примерно так это может выглядеть на fasm Код (Text): xor ebx, ebx ; выделяем место для данных push size_of_data ; dwBytes push ebx ; dwFlags = 0 call [GetProcessHeap] push eax ; hHeap call [HeapAlloc] ; eax = адрес данных push ecx ; выделяем место для lpThreadId push esp ; адрес lpThreadId push ebx ; dwCreationFlags = 0 push eax ; lpParameter - это значение получает ф-ция трэда push thread_function ; lpStartAddress push ebx ; dwStackSize по умолчанию push ebx ; lpThreadAttributes = 0 ;; ; здесь помещаем данные в выделенную память (адрес в eax) ;; call [CreateThread] ; eax = handle to the new thread pop ecx ; ecx = ThreadId ;; ; ф-ция трэда thread_function: mov eax, [esp + 8] ; адрес данных, переданный в CreateThread
я раньше с кучами не работал вот я чуть подсебя переделал 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 почемуто у меня смещения в стеке произошло другое чем у тебя
readme > Да. Но выделять в хипе 4ре байта смысла немного - проще этот dword передавать сразу как параметр для ф-ции CreateThread (и, соответственно, thread_function получит этот dword) > masm сгененрировал пролог ф-ции (push ebp, mov ebp, esp), а в моём варианте ф-ция без пролога. В masm объявляй ф-цию трэда так: thread_function proc paramWORD тогда в переменной param будет адрес.