Sample code for 30+ languages & platforms
Tcl

Thread Pool Size

See more Async Examples

Demonstrates how to set the maximum number of threads in Chilkat's thread pool manager. Also demonstrates how to set a thread pool log file for help in diagnosing unexpected problems.

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

# This example assumes the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.

set success 0

# Set the maximum number of threads in the Chilkat thread pool to 12.
# This means that no more than 12 background worker threads will exist simultaneously.
# If more than 12 tasks are queued then some must wait for a worker thread to become free.
# Note: The Chilkat thread pool manager thread is a thread distinct from the
# worker threads.  It starts when the 1st asynchronous task is Run. 
set glob [new_CkGlobal]

CkGlobal_put_MaxThreads $glob 12

# Also, the ThreadPoolLogPath can be set to cause the thread pool manager thread to
# keep a log file. This is for the purpose of debugging if unexpected problems occur.
CkGlobal_put_ThreadPoolLogPath $glob "/home/users/chilkat/logs/threadPoolLog.txt"

set http1 [new_CkHttp]

set http2 [new_CkHttp]

set http3 [new_CkHttp]

set url1 "http://www.marcusmiller.com/"
set url2 "http://www.tromboneshorty.com/"
set url3 "http://www.jamesmorrison.com/"

# Call the async version of the QuickGetStr method to return a task object.
# The task object is loaded, but is in the Inert state -- meaning it is
# not yet scheduled to run on Chilkat's background thread pool.
# task1 is a CkTask
set task1 [CkHttp_QuickGetStrAsync $http1 $url1]
if {[CkHttp_get_LastMethodSuccess $http1] == 0} then {
    puts [CkHttp_lastErrorText $http1]
    delete_CkGlobal $glob
    delete_CkHttp $http1
    delete_CkHttp $http2
    delete_CkHttp $http3
    exit
}

# task2 is a CkTask
set task2 [CkHttp_QuickGetStrAsync $http2 $url2]
if {[CkHttp_get_LastMethodSuccess $http2] == 0} then {
    puts [CkHttp_lastErrorText $http2]
    delete_CkTask $task1

    delete_CkGlobal $glob
    delete_CkHttp $http1
    delete_CkHttp $http2
    delete_CkHttp $http3
    exit
}

# task3 is a CkTask
set task3 [CkHttp_QuickGetStrAsync $http3 $url3]
if {[CkHttp_get_LastMethodSuccess $http3] == 0} then {
    puts [CkHttp_lastErrorText $http3]
    delete_CkTask $task1

    delete_CkTask $task2

    delete_CkGlobal $glob
    delete_CkHttp $http1
    delete_CkHttp $http2
    delete_CkHttp $http3
    exit
}

# At this point we have 3 task objects, each loaded with a Chilkat method call.
# Note: At this point no background threads are running.  The thread pool manager
# thread is not started -- it will start when the very first task is Run.

# Schedule each task for running on the thread pool.  This changes each task's state
# from Inert to Live. The thread pool manager thread starts with the 1st task queued.
# If the Global.ThreadPoolLogPath property was set, then
# the log file would be created (or appended) at this point.
set success [CkTask_Run $task1]
# Assuming success for brevity...
set success [CkTask_Run $task2]
set success [CkTask_Run $task3]

# The application is now free to do anything else
# while the HTML at the URL's are being downloaded in background threads.

# In this case, we'll just wait for all three tasks to finish.
# All three tasks are running simultaneously in separate background threads.
# We can wait for each in any order.  If Wait is called and the task has already
# finished (or been canceled), then the Wait method returns immediately.
set maxWaitMs 20000
set success [CkTask_Wait $task1 $maxWaitMs]
set success [CkTask_Wait $task2 $maxWaitMs]
set success [CkTask_Wait $task3 $maxWaitMs]
# Assuming success for brevity...

set err "Task failed or canceled"
set html1 $err
set html2 $err
set html3 $err

# Now get the HTML downloaded in each task:
if {expr [[CkTask_get_StatusInt $task1] == 7]  &&  [[CkTask_get_TaskSuccess $task1] == 1]} then {
    set html1 [CkTask_getResultString $task1]
}

if {expr [[CkTask_get_StatusInt $task2] == 7]  &&  [[CkTask_get_TaskSuccess $task2] == 1]} then {
    set html2 [CkTask_getResultString $task2]
}

if {expr [[CkTask_get_StatusInt $task3] == 7]  &&  [[CkTask_get_TaskSuccess $task3] == 1]} then {
    set html3 [CkTask_getResultString $task3]
}

puts "$html1"
puts "----"
puts "$html2"
puts "----"
puts "$html3"
puts "----"

delete_CkTask $task1

delete_CkTask $task2

delete_CkTask $task3


delete_CkGlobal $glob
delete_CkHttp $http1
delete_CkHttp $http2
delete_CkHttp $http3