AutoHotkey Community

It is currently May 27th, 2012, 1:20 am

All times are UTC [ DST ]




Post new topic Reply to topic  [ 5 posts ] 
Author Message
PostPosted: November 19th, 2009, 3:44 pm 
Offline

Joined: June 18th, 2008, 8:36 am
Posts: 4923
Location: AHK Forum
Using CriticalSection, you can write and read variables in several threads at the same time.

How to use wrote:
- lpCriticalSection:=CriticalSection() ;create and Initialize a new CriticalSection and return pointer which can be used in Lock() and UnLock().

- Lock(lpCriticalSection) ;EnterCriticalSection - other threads will be waiting for your code to finish

- UnLock(lpCriticalSection) ;DeleteCriticalSection - now other threads can access the variable(s).

- CriticalSection(lpCriticalSection) ;deletes CriticalSection

- CriticalSection() ;deletes all CriticalSections


Example should explain everything else.

You will need AutoHotkey.dll and AhkDllThread as well as CreateScript

Here you will find more information: MSDN.

Example requires AutoHotkey_H from this package
Code:
SetBatchLines,-1 ;Max performance
Loop 2 ;Create 2 CriticalSections and return pointer to use with Lock() and UnLock()
   _C%A_Index%:=CriticalSection()
;Get pointer to Variables to use in Alias()
pX:=getVar(x),pY:=getVar(y)

ThreadScript=
(
  #Persistent
  Alias(x,%pX% + 0),Alias(y,%pY% + 0) ;create Alias variables x+y, so you can use same variables in exe and dll
  Loop 2
     SetTimer,Label`%A_Index`%,50 ;Label1 and Label2 will be launched rapidly
  Return
   Label1:
    Lock(%_C1%)
    x.="new"
    UnLock(%_C1%)
  Return

  Label2:
    Lock(%_C2%)
    y.="newtext"
    UnLock(%_C2%)
)
dll:=AhkDllThread("AutoHotkey.dll")
dll.ahktextdll(ThreadScript)
Loop
  {
    Loop 2
      Lock(_C%A_Index%)
   lengthX:=StrLen(x),lengthY:=StrLen(y)
    Loop 2
      UnLock(_C%A_Index%)
    ToolTip % lengthX "-" lengthY
  }
Esc::ExitApp

To run it with AutoHotkey_L you will need LowLevel:
Code:
SetBatchLines,-1 ;Max performance
LowLevel_Init()
;Create CriticalSection and return pointer to use with Lock() and UnLock()
Loop 2
   _C%A_Index%:=CriticalSection()
;Get pointer to Variables to use in Alias()
pX:=__getVar(x),pY:=__getVar(y)

ThreadScript=
(
  #Persistent
  Alias(x,%pX% + 0),Alias(y,%pY% + 0) ;create Alias variables x+y, so you can use same variables in exe and dll
  Loop 2
     SetTimer,Label`%A_Index`%,50 ;Label1 and Label2 will be launched rapidly
  Return
   Label1:
    Lock(%_C1%)
    x.="new"
    UnLock(%_C1%)
  Return

  Label2:
    Lock(%_C2%)
    y.="newtext"
    UnLock(%_C2%)
)
dll:=AhkDllThread("AutoHotkey.dll")
dll.ahktextdll(ThreadScript)
Loop
  {
    Loop 2
      Lock(_C%A_Index%)
   lengthX:=StrLen(x),lengthY:=StrLen(y)
    Loop 2
      UnLock(_C%A_Index%)
    ToolTip % lengthX "-" lengthY
  }
Esc::ExitApp

CriticalSection.ahk Note :!: AutoHotkey_H and AHK.dll have a build in function Lock() + UnLock(), they are faster than user defined functions
Therefore if you are using AHK_H, delete the Lock and UnLock functions from CriticalSection.ahk.
Code:
Lock(LPCRITICAL_SECTION){
  DllCall("EnterCriticalSection","UInt",LPCRITICAL_SECTION)
}
UnLock(LPCRITICAL_SECTION){
  DllCall("LeaveCriticalSection","UInt",LPCRITICAL_SECTION)
}

CriticalSection(LPCRITICAL_SECTION="ÿÿÿÿ"){
  static
  If (LPCRITICAL_SECTION!="" and LPCRITICAL_SECTION!="ÿÿÿÿ"){
    DllCall("DeleteCriticalSection","Uint",LPCRITICAL_SECTION)
    Return
  } else if (LPCRITICAL_SECTION=""){
    Loop % (count){
      DllCall("DeleteCriticalSection","Uint",&CriticalSection%count%)
      count:=0
    }
    Return
  }
  count++
  VarSetCapacity(CriticalSection%count%,24)
  DllCall("InitializeCriticalSection","Uint",&CriticalSection%count%)
  Return &CriticalSection%count%
}

_________________
AHK_H (2alpha) AHF TT _Struct WatchDir Yaml _Input ObjTree RapidHotkey DynaRun :wink:


Last edited by HotKeyIt on January 18th, 2012, 12:57 pm, edited 6 times in total.

Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 28th, 2010, 12:55 pm 
Offline

Joined: February 13th, 2007, 3:54 pm
Posts: 21
Great job!

I will use it in my script.

One problem though, it does not work with AutoHotkey_N41:
http://www.autohotkey.net/~HotKeyIt/Aut ... CE_N41.zip

When I put a msgbox after
Thread(ThreadScript "`nInclude:IncludeEnd"),
the script never reaches it.

It works fine, with:
http://www.autohotkey.net/~tinku99/ahkd ... ey_N10.zip


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 6th, 2011, 3:41 pm 
Offline

Joined: June 18th, 2008, 8:36 am
Posts: 4923
Location: AHK Forum
I have changed examples to work with most current AHK.dll.

_________________
AHK_H (2alpha) AHF TT _Struct WatchDir Yaml _Input ObjTree RapidHotkey DynaRun :wink:


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 6th, 2011, 5:24 pm 
Where are LockSec() and UnLockSec()?

I used AutoHotkey_H, copied the necessary code and included the files mentioned...

Quote:
Error: Call to nonexistent function.

Specifically: LockSec(_C%A_Index%)


:?:


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: January 6th, 2011, 8:08 pm 
Offline

Joined: June 18th, 2008, 8:36 am
Posts: 4923
Location: AHK Forum
Sorry it should be Lock() and UnLock(), I have updated examples.

_________________
AHK_H (2alpha) AHF TT _Struct WatchDir Yaml _Input ObjTree RapidHotkey DynaRun :wink:


Report this post
Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 5 posts ] 

All times are UTC [ DST ]


Who is online

Users browsing this forum: Apollo, Google Feedfetcher, Yahoo [Bot] and 8 guests


You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Powered by phpBB® Forum Software © phpBB Group