Что нового

Функция CreateThread

Статус
Закрыто для дальнейших ответов.

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Нашёр в MSDN функцию CreateThread, говорится что можно создать поток,
можно ли это сделать на автоит?

Под знаками ? я не знаю что вписать:

Код:
; ThreadAttributes 
;         Указатель на SECURITY_ATTRIBUTES структуру, которая определяет, может ли возвращенный дескриптор быть 
;         унаследован дочерними процессами. Если lpThreadAttributes является NULL, дескриптор не может быть унаследован.

; StackSize
;         Начальный размер стека, в байтах. Система округляет это значение до ближайшего странице. Если этот параметр 
;         равен нулю, новый поток использует по умолчанию размер исполняемого файла. 

; StartAddress
;         Указатель на определенную приложением функцию, которая будет выполнена нитью. Этот указатель представляет начальный адрес потока.

; Parameter
;         Указатель на переменную, передаваемый поток.

; CreationFlags
;         Флаги, которые управляют созданием потока.

Global Const $NULL                              = 0          ; Поток выполняется сразу после создания.
Global Const $CREATE_SUSPENDED                  = 0x00000004 ; Поток создается в подвешенном состоянии
Global Const $STACK_SIZE_PARAM_IS_A_RESERVATION = 0x00010000 ; StackSize параметр задает начальный размер резерва стека. Если этот флаг не указан, StackSize указывает зафиксировать размер.

; ThreadId 
;         Указатель на переменную, которая получает идентификатор потока. Если этот параметр NULL, идентификатор потока не возвращается.


Func _WinAPI_CreateThread($ThreadAttributes, $StackSize, $StartAddress, $Parameter, $CreationFlags, $ThreadId)
    Return DllCall("Kernel32.dll", "int", "CreateThread", "?", $ThreadAttributes, "int", $StackSize, "int", $StartAddress, "?", $Parameter, "int", $CreationFlags, "?", $ThreadId)
EndFunc	

; hProcess
;       Дескриптор процесса, в котором поток должен быть создан. Дескриптор должен иметь PROCESS_CREATE_THREAD, 
;       PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE и PROCESS_VM_READ прав доступа, и может 
;       не без этих прав на определенных платформах.

Func _WinAPI_CreateRemoteThread($hProcess, $ThreadAttributes, $StackSize, $StartAddress, $Parameter, $CreationFlags, $ThreadId)
    Return DllCall("Kernel32.dll", "int", "CreateRemoteThread", "?", $hProcess,"?", $ThreadAttributes, "int", $StackSize, "int", $StartAddress, "?", $Parameter, "int", $CreationFlags, "?", $ThreadId)
EndFunc	

; ExitCode
;       Код выхода на поток.

Func _WinAPI_ExitThread($ExitCode)
    DllCall("Kernel32.dll", "none", "ExitThread", "?", $ExitCode)
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Не парься, в AutoIt это все равно не будет работать, ну никак. Точнее оно запуститься, но потом наглухо зависнит.
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Нашол скрипт который создает поток в нутри себя, вот только понять не могу как там все устроенно. Доказательство появления потока на скриншотах Dr.Killer - показывает сколько потоков до включения функции и после, также архив где я это все нашол, думаю вы сможите разобратся...
Скриншот до вызова функции, доктор в скобочках показывает потоки...
OffTopic:

Кстате Dr.Killer - это моя работа :smile:

1_F.png

После вызова функции:
2_F.png

Архив скачать можно тут источника я не помню :(
http://ganiball-95.narod2.ru/Processes_Threads_nDLLs.zip
OffTopic:

Также посматрите на значки на рабочем столе ;D
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Не кому не интересно создать поток? :(
 

SyDr

Сидра
Сообщения
651
Репутация
158
Да нет вообще-то. Никому не интересно. Зачем?
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Это способ заставить однопоточный Autoit работать в несколько потоков? Я правильно понял?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Yashied
Я бы тебе поверил что на автоите это не работает, но в том скрипте это РАБОТАЕТ!
Или хотябы объясни почему в том скрипте работает поток? :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Здесь я тоже использую потоки, но работа с ними почти невозможна.
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Yashied,
Так значит есть возможность создания их, можите сделать пример потока из сторонего *.exe файла, и потом его превратить в поток, очень нужно! :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Ganibal95 сказал(а):
можите сделать пример потока из сторонего *.exe файла, и потом его превратить в поток, очень нужно!

Могу.

Код:
Run('Thread.exe')


А вообще, прежде чем заморачиваться потоками, тебе нужно об этом получше узнать.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Параллельные потоки создаются в пределах одного кода и не имеют отношение к исполняемым файлам. Создать поток, это означает запустить какую-либо часть кода (функцию) параллельно основному коду программы. Запуск любого исполняемого файла уже будет запущен параллельно другим процессам, ну или в отдельном потоке, если хочешь. Поэтому твой вопрос изначально неправильно сформулирован.
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Тогда как можно запустить функцию, и как ее сделать? :smile:


Добавлено:
Сообщение автоматически объединено:

Yashied,
Небольшие вопросы:
1.Что за бинарный код используется для создания потока и как его создать?
2.Как сделать вызов?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Ganibal95
Какже ты не поймешь, что НЕЛЬЗЯ создать управляемый асинхронный(синхронный) поток в AutoIT.
Ну нету у него поддержки данных функций. Даже функции Adlib приостанавливают основной цикл программы.

Вот в C++ это сделать очень просто. Есть встроенная функция _beginthread которая создает асинхронный поток.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Проблема в том, что менеджер памяти (?) в AutoIt изначально не писался для мультипотоковых приложений. Поэтому любая попытка запустить дополнительный поток в рамках DllCallRegister() чревата непредсказуемыми последствиями (в большинстве случаев крахом процесса). Другими словами, функция потока не может использовать внутренние функции AutoIt. Единственный способ запустить дополнительный поток, это написание .dll на другом ЯП, поддерживающим мультипоточность, например Pure Basic. Как вариант, можно написать функцию потока непосредственно в машинном коде aka ассемблер. тем самым обойтись без .dll. Простой пример см. здесь. На этом, думаю, вопрос исчерпан.

Тема закрыта.
 
Статус
Закрыто для дальнейших ответов.
Верх