Jump to content
Sign in to follow this  

Simulated MultiThreading

Recommended Posts

Hi, I got tempted to try this out when I read the posts in this Topic.

So I did some coding and I think it works quite ok.

It works by creating a temporary file using _TempFile, and writing au3 code to it.

Then it runs the code:

$i_Pid = Run(@AutoItExe & " /AutoIt3ExecuteScript " & $s_TempFile, $s_ScriptDir,  $s_State, 7)

Which executes the script, and saving the PID to be able to read data from the output.

Using adlib you can make a function that "listens" for the output of the data...

It contains 3 functions:

_MultiTask_Exec($s_Au3Code, $s_CommandLine = "", $s_ScriptDir = @ScriptDir, $s_State = @SW_SHOW)

_MultiTask_Read($i_Pid); Reads output from "threads" if any, otherwise sets @error to 1 and returns -1

_AdlibCheckThreads(); This functions is called by the AdlibEnable() command to do the processing of any data output from the "threads"

Ok, that's about it... I'm not really sure if this would work in ALL situations, but I think so.

I just wrapped this up to test if it was possible so I have not been able to thoroughly test it..

Anyways, here's the code(contains a simple test to demonstrate it.. lol):

#include <File.au3>
#include <Array.au3>

Dim $MsgBoxCode = 'Opt("TrayIconHide", 1)' & @CRLF & 'ConsoleWrite(MsgBox(4, "Question", "Is simulating MultiThreading a working Solution?"))' & @CRLF & 'FileDelete(@ScriptFullPath)'
Dim $Remove = False

    For $i = 1 To 3
Until $SMT_GlobalArray[0] < 1

Func _AdlibCheckThreads()
    Local $ReturnVal
    If $SMT_GlobalArray[0] > 0 Then
        For $i = 1 To $SMT_GlobalArray[0]
            $ReturnVal = _MultiTask_Read($SMT_GlobalArray[$i])
            If Not @error Then
                TrayTip("Answer", "Got answer " & $ReturnVal & " from pid " & $SMT_GlobalArray[$i], 5)
                _ArrayDelete($SMT_GlobalArray, $i)
                $SMT_GlobalArray[0] -= 1

Func _MultiTask_Exec($s_Au3Code, $s_CommandLine = "", $s_ScriptDir = @ScriptDir, $s_State = @SW_SHOW)
    Local $i_Pid
    Local $s_TempFile = _TempFile(@TempDir, "au3_script", ".au3")
    FileWrite($s_TempFile, $s_Au3Code)
    $i_Pid = Run(@AutoItExe & " /AutoIt3ExecuteScript " & $s_TempFile & $s_CommandLine, $s_ScriptDir,  $s_State, 7)
    $SMT_GlobalArray[0] += 1
    ReDim $SMT_GlobalArray[$SMT_GlobalArray[0]+1]
    $SMT_GlobalArray[$SMT_GlobalArray[0]] = $i_Pid

Func _MultiTask_Read($i_Pid)
    Local $s_Return
    Local $i_Available_Chars = StdoutRead($i_Pid, 0, True)
    If $i_Available_Chars > 0 Then
        $s_Return = StdoutRead($i_Pid)
        SetError(1); No output
        $s_Return = -1; No output
    Return $s_Return


Added: Support for commandline when executing another "thread".


This is obviously not real Threads

Edited by FreeFry

Share this post

Link to post
Share on other sites

Added support for commandline when executing another "thread".

I needed this in a test I was doing. So here it is, I've updated first post.

I was testing how simulating multi-threading would work in an aimbot ...

Maybe one should run 4 "threads" scanning 4 squares around the mouse, and reporting found coords back to the main app.. hmm I wonder if it would have a positive impact on performance using multiple scanners instead of just running one pixelsearch over the area .. hmm

Edited by FreeFry

Share this post

Link to post
Share on other sites

it Hurts me when you call a process thread ;)

are you guys realy willing to sacrifice Scite's Syntax highlighting just for creating another process...

this is no offence but you dont have to reinvent the wheel.

you could pick up Coroutine or that CoProc stuff i did some time ago and make is better.

CoProc Multi Process Helper libraryTrashBin.nfshost.com store your AutoIt related files here!AutoIt User Map

Share this post

Link to post
Share on other sites

As I thought I made clear in the first post by using "" when I used the word thread, and as this whole topic states: It's simulated "MultiThreading", meaning it runs another process that executes a bit of code, it's not a real Thread.

As this is rather advanced, one would have to make sure not to make errors when writing the other "thread(s)" code, therefore I don't really think the scite syntax highlightning is much of a sacrifice.

And I glanced at the CoRoutine UDF but I thought it was a little... complicated to implement. As for your CoProc thing I didn't know existed at this time, neither would that that stopped me from posting this.

And as the first post states, I got tempted to try it out myself, as I like to challenge my own skills to do something instead of just only relying on others.

First post updated to clarify the obvious.

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Create New...