Код следующий, пример работы потоков с соседнего форума: Код (ASM): format PE console include 'win32ax.inc' .data fName db 'backup.txt',0 capt db 'Type text for save to file',13,10 db '--------------------------',13,10,0 cLen dd $ - capt final db '--------------------------',13,10 db 'Save to backup.txt - OK! ',0 fLen dd $ - final buff db 512 dup(0) ; буфер для ввода rSize dd 0 ; реальная длина ввода. tHndl dd 0 ; хэндлы: - потока Thread fHndl dd 0 ; - файла File eHndl dd 0 ; - события Event ;------- .code start: ;// Создаём событие и доп.поток invoke CreateEvent,0,0,0,0 mov [eHndl],eax invoke CreateThread,0,0,threadFunc,0,0,0 mov [tHndl],eax ;// Выводим заголовок программы в консоль ;// и принимаем от юзера ввод invoke WriteConsoleA,7,capt,[cLen],0,0 invoke ReadConsoleA,3,buff,512,rSize,0 ;// Включаем объект события для доп.потока invoke SetEvent,[eHndl] ;// Выводим финальную мессагу в основном потоке invoke WriteConsoleA,7,final,[fLen],0,0 invoke ExitProcess,0 ;//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ;//--- Функция дополнительного потока ---- proc threadFunc invoke WaitForSingleObject,[eHndl],-1 ; ждём события.. invoke _lcreat,fName,0 ; создать файл R/W invoke _lwrite,eax,buff,[rSize] ; запись в него из буфера! invoke _lclose,[fHndl] ; закрыть файл invoke ExitThread,0 ; ..и выгрузить поток. ret endp .end start Вопрос: Понадобились потоки, компилю пример. При открытии на доли секунды вылетает консоль, отддебажил просмотрел Олей, при дебаге висит консоль, но не выводит инфу и не забирает, пустой висит, в Оле код отрабатывает правильно, ложит в стек параметры, исполняет функции, не выдает ошибок, код пересмотрел раз 10, всё ровно. машина win10 x32 Посоветуете, куда смотреть?
У тебя invoke ExitProcess,0 срабатывает раньше чем в потоке код. Нужно ожидать пока поток завершится а потом уже завершать процесс.
Подправил. Спасибо Код (ASM): format PE console include 'win32ax.inc' ;--------- .data fName db 'backup.txt',0 capt db 'Input txt to save in backup.txt:',0 cLen dd $ - capt final db 'Save to backup.txt - OK!. Press any key...',0 fLen dd $ - final buff db 512 dup(0) rSize dd 0 tHndl dd 0 fHndl dd 0 eHndl dd 0 ;--------- .code start: invoke CreateEvent,0,0,0,0 mov [eHndl],eax invoke CreateThread,0,0,threadFunc,0,0,0 mov [tHndl],eax invoke WriteConsole,<invoke GetStdHandle,STD_OUTPUT_HANDLE>,capt,[cLen],0,0 ;через GetStdHandle беру хендл на ввод-вывод invoke ReadConsole,<invoke GetStdHandle,STD_INPUT_HANDLE>,buff,512,rSize ;win10x32 не работают 7,3 invoke SetEvent,[eHndl] invoke WaitForSingleObject,[tHndl],-1 ;ждем пока отработает тред invoke WriteConsole,<invoke GetStdHandle,STD_OUTPUT_HANDLE>,final,[fLen],0,0 invoke ReadConsoleInput,<invoke GetStdHandle,STD_INPUT_HANDLE>,buff,1,rSize ;ждём нажатия любой клавиши invoke ExitProcess,0 proc threadFunc invoke WaitForSingleObject,[eHndl],-1 invoke _lcreat,fName,0 invoke _lwrite,eax,buff,[rSize] invoke _lclose,[fHndl] invoke ExitThread,0 ret endp ;--------- .end start
bin1101d, Нужно знать механизмы синхронизаций, их очень много, но базовые не менялись. Все изменения по синхрону реализованы не в виде ядерных сервисов, как пример - rwl блокировки, это юзер алгоритмическая реализация. Базовых(сервисных) не много может десяток, эвенты семафоры и тп. В ядре иначе, там защита от race cond. etc. Обзор этого можно посмотреть у Неббета. Если читать Рихтера, то ты заблудишься. ps эвент это самый примитивный синхромеханизм, есть двойной. Спецификация по базовому синхрону.
Indy_, Хоть это и не в тему и не к месту, (причем тут натив в данной теме). Попробую добавить свою лепту (свой файл) с рабочего стола Удобней нативные функи искать в структурированном "chm" (для чего для новых виндов надо ставить пакет обновления), чем в "pdf".
RETN, Удобно в сурках и манах. Просто нужно в начале сориентироваться. Откуда брать инфу, источник должен быть чётким понятным.
Indy_, RETN, расскажите же, как создать поток средствами чисто Native API и зачем. Или все таки нужно юзать винапи? Вот ваш пост за 11 год:
M0rg0t, Если создать ядерный обьект, поток например то он будет не полноценный - нужна юзер обёртка". Поэтому нет никакого смысла из юзер использовать ядерные вызовы.
M0rg0t, тут обсуждалось уже https://wasm.in/threads/rtlcreateuserthread-vs-createremotethread.29253/ Меня больше взволновало , что у я же 2ч потратил сегодня на долбаный GetOpenFileName , пока не врубил во флагах PE хидера для Wow64(кто не знает х86 процесс на х64 кодесе)