Добрый вечер, у меня вот такая ситуация: Код (Text): mov thread_struc.dword_1, WithoutHeaderSize mov thread_struc.dword_2, pWithoutHeader invoke CreateThread,NULL,NULL,addr ThreadProc ,NULL,0,addr ThreadID mov hThread,eax Код который заполняет структур и создаёт тред. Код самого треда: Код (Text): ThreadProc PROC .while WithoutHeaderSize==0 invoke GetCommandFromServer,WithoutHeaderSize,pWithoutHeader mov flag,0 invoke Sleep, 5000 .endw ret ThreadProc endp Мне не ясен момент, как данные из структуры уже внутри треда данные будут извлекаться. Короче говоря как сделать так,чтоб invoke GetCommandFromServer работала с данными переданными через структуру? Спасибо!
эмн.. в смысле передать структуру треду? ну это надо один входной парам функции поставить 32битный, и ему передавать, создавая тред: invoke CreateThread,NULL,NULL,addr ThreadProc ,addr thread_struc,0,addr ThreadID если я правильно тебя понял..
Копируешь данные из этой структуры в локальную копию, и работай себе на здоровье с копией. Можно работать и с оригиналом структуры, но при этом надо быть уверенным, что другие потоки не будут одновременно лезть в эту структуру, а то получится каша.
В теории это я понимаю, я не очень представляю как это в коде изложить. если не сложно покажи как внутри треда из адрессованой структуры вытаскивать данные. пожалуйста.
lust Ты у себя в коде не правильно задал прототип ThreadProc: Код (Text): ThreadProc PROC lParam:DWORD mov eax,lParam assume eax:ptr YOUR_STRUCT mov ecx,[eax].ThreadID ... ret endp ThreadProc будет принимать то, что ты передал в вызове CreateThread последним параметром.
Тут есть ньюанс один. Пусть исходная структура - в локальных. Процедура создает тред и, до старта треда, успевает завершиться. А потом стартует новая процедура. Стек потерся. Структура тоже. Далее стартует наш созданный тред и получаем вместо структуры кашу. Тут как минимум нужно юзать объекты синхронизации, чтобы после старта треда, сам тред успел скопировать структуру себе в локальные.
Можно не заморачиваться на первых порах с этой синхронизацией. Каждому экземпляру потока - свой кусок памяти. Код (Text): .data? MyStruct struct message db 256 dup(?) digit dd ? MyStruct ends .code ;выделяем память под структуру invoke VirtualAlloc, NULL, sizeof MyStruct, MEM_COMMIT, PAGE_READWRITE mov ebx,eax assume ebx:ptr MyStruct ;заполняем структуру данными mov [ebx].digit, 12345678 invoke lstrcpy, addr [ebx].message, SADD("SOME TEXT PASSED TO THREAD") ;создаем поток и передаем в негo указатель на структуру invoke CreateThread, NULL, NULL, MyThread, ebx, NULL, NULL assume ebx:nothing MyThread proc lParam:DWORD LOCAL ms :MyStruct LOCAL buffer[256] :BYTE ;копируем переданные в тред данные в локальную структуру-аналог invoke RtlMoveMemory, addr ms, lParam, sizeof MyStruct ;освобождаем память, из которой скопировали invoke VirtualFree, lParam, NULL, MEM_RELEASE ;теперь работа с копией переданных данных (ms) invoke MessageBox, NULL, addr ms.message, NULL, NULL ;вывод числа ms.digit через отладочное сообщение PrintDec ms.digit ret MyThread endp
да нет, просто Sleep(1) делается в таком случае, управление переходит новой треде, и она успевает скопироваться.
Comer_ а если тредов 2 десятка? И наш тред не с самым высоким приоритетом? cresta сказал самый правильный вариант. В таком случае даже не прийдется заморачиваться с синхронизацией и можно создавать suspended-потоки, которые последствии, где-то через эн процедур стартовать. Самый удобный вариант.
эмн.. ну тогда аллоцировать перед передачей и забывать о том что что то аллоцировали сразу после передачи =\ типо и треду не придётся аллоцировать что то или попировать.
Можно и через кучу. Непринципиально, главное, что у каждого потока своя структура. Можно вообще не копировать в локальную, а сразу работать с переданным оригиналом, главное потом после работы не забыть освободить память.