Zohar Posted February 12, 2014 Share Posted February 12, 2014 (edited) Hi If You have some function that is long and continuous, and you want to run it in a seperate way from your script, so it will not block it, then you can do this: 1) Take it out of your script, and put it in a seperate code file, 2) Run that code file seperately, for example via Run(@AutoItExe&" "&$Script_FullPath) This will make the code run in a seperate Process, and so it will run in parallel to your main script, not blocking it. My question is: Is it possible to do this more simply, without needing to move the function to a seperate code file? Maybe some Function in AutoIt exists, that gets 1 parameter which is a FunctionName, and then runs that function seperately? Thank you Zohar Edited February 21, 2014 by Zohar Xandy 1 Link to comment Share on other sites More sharing options...
AdmiralAlkex Posted February 12, 2014 Share Posted February 12, 2014 Is it possible to do this more simply, without needing to move the function to a seperate code file? Well there's always NOT putting it in a separate file. But you will have to decide if that's easier for you. If $CmdLine[0] > 0 And $CmdLine[1] = "Bordsdricka" Then _Test() Exit EndIf HotKeySet("O", _Hot) Sleep(999999) Func _Hot() If @Compiled Then Run(@AutoItExe & ' Bordsdricka') Else Run(@AutoItExe & " " & FileGetShortName(@ScriptFullPath) & ' Bordsdricka') EndIf EndFunc Func _Test() MsgBox(0, "Message from _Test", "Bananas") EndFunc .Some of my scripts: ShiftER, Codec-Control, Resolution switcher for HTC ShiftSome of my UDFs: SDL UDF, SetDefaultDllDirectories, Converting GDI+ Bitmap/Image to SDL Surface Link to comment Share on other sites More sharing options...
Zohar Posted February 12, 2014 Author Share Posted February 12, 2014 (edited) Hi AdmiralAlkex Interesting workaround, tho not exactly simplifying things Maybe there's already a Fucntion in AutoIt that does what I asked about? something like RunAFunctionAsASeparateThread($FunctionName) or RunAFunctionAsASeparateProcess($FunctionName) ? Edited February 12, 2014 by Zohar Link to comment Share on other sites More sharing options...
BrewManNH Posted February 12, 2014 Share Posted February 12, 2014 AutoIt is single threaded, so you can't do it in the same script. If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator Link to comment Share on other sites More sharing options...
nullschritt Posted February 12, 2014 Share Posted February 12, 2014 As stated autoit is single-threaded. The best way to use more than one thread for processing data is using, is to use command line sparrmaters to launch extra copies of your script, each doing what you need. You can have it return the data to the main thread through Inter-Process Communication. There are many methods of doing this. The simplest and slowest is writing to a database or file. Xandy 1 Link to comment Share on other sites More sharing options...
Zohar Posted February 12, 2014 Author Share Posted February 12, 2014 (edited) Thank you both. What I am doing is not multithreading.. More like multi-process , since it creates another process... That's because I put the function in a seperate au3 code file, and then run it. It works and it ahieves what I need, however I thought maybe there's a way to simplify it.. from the developer side - my side. Instead of everytime creating a seperate code file when needing this parallel work, It could've been nice if AutoIt had a unction called RunAsASeperateProcess($FunctionName), which will achieve, the same as what I do now(by moving the code to a separate code file and running it), without moving it to a separate file. Maybe the developers can consider this as a new function? Edited February 12, 2014 by Zohar Link to comment Share on other sites More sharing options...
nullschritt Posted February 13, 2014 Share Posted February 13, 2014 @zohar, this function wont be added, because it can already be achieved in auto-it EASILY. Just like AdmiralAlkex showed you. you put the function you want to call inside a command line switch, then launch the script with the command line option. A new process will be opened from the same file, but only the specified function will run. Link to comment Share on other sites More sharing options...
orbs Posted February 13, 2014 Share Posted February 13, 2014 quick forum search for "multithread" shows these promising works: '?do=embed' frameborder='0' data-embedContent>> '?do=embed' frameborder='0' data-embedContent>> and more... Signature - my forum contributions: Spoiler UDF: LFN - support for long file names (over 260 characters) InputImpose - impose valid characters in an input control TimeConvert - convert UTC to/from local time and/or reformat the string representation AMF - accept multiple files from Windows Explorer context menu DateDuration - literal description of the difference between given dates Apps: Touch - set the "modified" timestamp of a file to current time Show For Files - tray menu to show/hide files extensions, hidden & system files, and selection checkboxes SPDiff - Single-Pane Text Diff Link to comment Share on other sites More sharing options...
jchd Posted February 13, 2014 Share Posted February 13, 2014 These don't make AutoIt any more threadsafe, just because some naïve people mislead themselves and others thinking they can do that by pure magic. All one can do is discover creative and unsuspected ways to shoot oneself in the foot. AutoIt is not threadsafe and no amount of gift wrap or holy water will make it such. Period. Anyway, threads are evil. This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe hereRegExp tutorial: enough to get startedPCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta. SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt) Link to comment Share on other sites More sharing options...
Zohar Posted February 13, 2014 Author Share Posted February 13, 2014 @zohar, this function wont be added, because it can already be achieved in auto-it EASILY. Just like AdmiralAlkex showed you. you put the function you want to call inside a command line switch, then launch the script with the command line option. A new process will be opened from the same file, but only the specified function will run. Yes, I understand it. But you do understand that when you use this workaround, you then block your command line from being used for other stuff.. quick forum search for "multithread" shows these promising works: '?do=embed' frameborder='0' data-embedContent>> '?do=embed' frameborder='0' data-embedContent>> and more... Hi Orbs It is nice, but I am not looking for MultiThreading, just to create another (long) process which will happen in parallel. (and to achieve it in a simpler way that what I use now) These don't make AutoIt any more threadsafe, just because some naïve people mislead themselves and others thinking they can do that by pure magic. All one can do is discover creative and unsuspected ways to shoot oneself in the foot. AutoIt is not threadsafe and no amount of gift wrap or holy water will make it such. Period. Anyway, threads are evil. But this is Multi-Process, not multi-threading. And yes, as all developers, I am aware of the disadvantages of multithreading. Link to comment Share on other sites More sharing options...
AdamUL Posted February 13, 2014 Share Posted February 13, 2014 But you do understand that when you use this workaround, you then block your command line from being used for other stuff. This is not a true statement. Use the command line to your advantage with switches for the functions that you want to execute, not just feeding the command line a script. > Mat's Command Line UDF is also useful for this. If you have other command line switches, keep the ones for re-execution private, like when you write a UDF with internal functions. Have a look at this stripped down example, from one of my old projects, where I used multiple functions that were run in a different process using the command line and re-execution. I didn't use Mat's UDF with this project. expandcollapse popup#include <ClipBoard.au3> If StringInStr($CmdLineRaw, '/MsgBoxData;') Then ;Creates Return Message boxes. Opt("TrayIconHide", 1) ;Hide tray icon for rerun script that shows the Message box. $CmdLineRaw = StringSplit(StringMid($CmdLineRaw, StringInStr($CmdLineRaw, '/MsgBoxData')), ';') Global $aMsgBoxData = StringSplit($CmdLineRaw[2], "|") Switch $aMsgBoxData[0] Case 3 MsgBox($aMsgBoxData[1], $aMsgBoxData[2], $aMsgBoxData[3]) Case 4 MsgBox($aMsgBoxData[1], $aMsgBoxData[2], $aMsgBoxData[3], $aMsgBoxData[4]) Case 5 MsgBox($aMsgBoxData[1], $aMsgBoxData[2], $aMsgBoxData[3], $aMsgBoxData[4], $aMsgBoxData[5]) EndSwitch Exit ElseIf StringInStr($CmdLineRaw, '/MonDialog:') Then ;Monitor HotKeys for Return Dialog boxes. Opt("TrayIconHide", 1) ;Hide tray icon for rerun script that reads Dialog. $CmdLineRaw = StringSplit(StringMid($CmdLineRaw, StringInStr($CmdLineRaw, '/MonDialog')), ':') HotKeySet("^!n", "_CopyToClipboard") HotKeySet("^!b", "_CopyToClipboard") HotKeySet("^!s", "_CopyToClipboard") HotKeySet("^!p", "_CopyToClipboard") HotKeySet("^!i", "_CopyToClipboard") HotKeySet("^!m", "_CopyToClipboard") HotKeySet("^!u", "_CopyToClipboard") While ProcessExists($CmdLineRaw[2]) Sleep(50) WEnd Exit EndIf Global $sDefaultValue = "" Global $sInputBoxAnswer Global $iError Global $sMsgBoxData Global $iReturnBoxPID Global $sReturnBoxPIDs Global $aReturnBoxPIDs Global $aWinPos Global $iStartHotKey While 1 $sInputBoxAnswer = InputBox("This is a test", "Please Enter Something.", $sDefaultValue, "","150","140") $iError = @error Select Case $iError = 0 ;OK - The string returned is valid Case $iError = 1 ;The Cancel button was pushed ExitLoop Case $iError = 3 ;The InputBox failed to open MsgBox(16,"ERROR","Input Box would not open.") ExitLoop EndSelect $sInputBoxAnswer = StringUpper($sInputBoxAnswer) If StringInStr($sInputBoxAnswer, ";") Then $sInputBoxAnswer = StringReplace($sInputBoxAnswer, ";", "-") EndIf $sDefaultValue = $sInputBoxAnswer $sMsgBoxData = "Data Entered in InputBox: " & @CRLF & @CRLF & $sInputBoxAnswer $iReturnBoxPID = _MsgBoxEx(0, $sInputBoxAnswer, $sMsgBoxData) $sReturnBoxPIDs &= $iReturnBoxPID & "|" Opt("WinTitleMatchMode", 3) WinWait($sInputBoxAnswer) $aWinPos = WinGetPos($sInputBoxAnswer) WinMove($sInputBoxAnswer, "", $aWinPos[0] + 250, $aWinPos[1] - 100) $iStartHotKey += 1 If $iStartHotKey = 1 Then _MontorReturnDialog() WEnd $aReturnBoxPIDs = StringSplit(StringTrimRight($sReturnBoxPIDs, 1), "|") For $iPID = 1 To $aReturnBoxPIDs[0] Step 1 ProcessClose($aReturnBoxPIDs[$iPID]) Next Func _CopyToClipboard() Local $sReadText = WinGetText("[active]") If StringInStr($sReadText, "Data Entered in InputBox: ") Then _ClipBoard_Empty() _ClipBoard_Open(0) Local $aReadText = StringSplit(StringTrimLeft(StringStripWS($sReadText, 3), 3), @CRLF & @CRLF, 1) Local $aDataPulled Switch @HotKeyPressed Case "^!n" _ClipBoard_SetData(WinGetTitle("[active]") ) Case "^!b" $aDataPulled = StringSplit($aReadText[1], ": ", 1) _ClipBoard_SetData($aDataPulled[2]) Case "^!s" $aDataPulled = StringSplit($aReadText[2], ": ", 1) _ClipBoard_SetData($aDataPulled[2]) Case "^!p" $aDataPulled = StringSplit($aReadText[3], ": ", 1) _ClipBoard_SetData($aDataPulled[2]) Case "^!i" $aDataPulled = StringSplit($aReadText[4], ": ", 1) _ClipBoard_SetData($aDataPulled[2]) Case "^!m" $aDataPulled = StringSplit($aReadText[5], ": ", 1) _ClipBoard_SetData($aDataPulled[2]) Case "^!u" $aDataPulled = StringSplit($aReadText[6], ": ", 1) _ClipBoard_SetData($aDataPulled[2]) Case Else $aDataPulled = StringSplit($aReadText[5], ": ", 1) _ClipBoard_SetData($aDataPulled[2]) EndSwitch _ClipBoard_Close() EndIf EndFunc Func _MsgBoxEx($iFlag, $sTitle, $sText, $iTimeOut = 0, $iHwnd = 0) ;Show a message box for the data. Local $sMsgBoxDataEx If $iTimeOut = 0 And $iHwnd = 0 Then $sMsgBoxDataEx = $iFlag & '|' & $sTitle & '|' & $sText ElseIf $iTimeOut <> 0 And $iHwnd = 0 Then $sMsgBoxDataEx = $iFlag & '|' & $sTitle & '|' & $sText &'|' & $iTimeOut Else $sMsgBoxDataEx = $iFlag & '|' & $sTitle & '|' & $sText & '|' & $iTimeOut & '|' & $iHwnd EndIf Return _ReRunScript('/MsgBoxData;' & $sMsgBoxDataEx) EndFunc Func _MontorReturnDialog() ;Monitor Return Dialog for HotKeys. Return _ReRunScript('/MonDialog:' & @AutoItPID) EndFunc Func _ReRunScript($sCmdLine) If @Compiled Then Return(Run(@ScriptFullPath & ' ' & $sCmdLine)) Else Return(Run(@AutoItExe & ' "' & @ScriptFullPath & '" ' & $sCmdLine)) EndIf EndFunc Adam Link to comment Share on other sites More sharing options...
Zohar Posted February 15, 2014 Author Share Posted February 15, 2014 I see.. Thank you. I think for the simplicity of code, I will not use the command line trick this time, and simply copy to a seperate code file.. But I might use it in the future. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now