Sample code for 30+ languages & platforms
Unicode C

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 Unicode C Downloads

Unicode C
#include <C_CkGlobalW.h>
#include <C_CkHttpW.h>
#include <C_CkTaskW.h>

void ChilkatSample(void)
    {
    BOOL success;
    HCkGlobalW glob;
    HCkHttpW http1;
    HCkHttpW http2;
    HCkHttpW http3;
    const wchar_t *url1;
    const wchar_t *url2;
    const wchar_t *url3;
    HCkTaskW task1;
    HCkTaskW task2;
    HCkTaskW task3;
    int maxWaitMs;
    const wchar_t *err;
    const wchar_t *html1;
    const wchar_t *html2;
    const wchar_t *html3;

    success = FALSE;

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

    success = FALSE;

    // 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. 
    glob = CkGlobalW_Create();
    CkGlobalW_putMaxThreads(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.
    CkGlobalW_putThreadPoolLogPath(glob,L"/home/users/chilkat/logs/threadPoolLog.txt");

    http1 = CkHttpW_Create();
    http2 = CkHttpW_Create();
    http3 = CkHttpW_Create();

    url1 = L"http://www.marcusmiller.com/";
    url2 = L"http://www.tromboneshorty.com/";
    url3 = L"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 = CkHttpW_QuickGetStrAsync(http1,url1);
    if (CkHttpW_getLastMethodSuccess(http1) == FALSE) {
        wprintf(L"%s\n",CkHttpW_lastErrorText(http1));
        CkGlobalW_Dispose(glob);
        CkHttpW_Dispose(http1);
        CkHttpW_Dispose(http2);
        CkHttpW_Dispose(http3);
        return;
    }

    task2 = CkHttpW_QuickGetStrAsync(http2,url2);
    if (CkHttpW_getLastMethodSuccess(http2) == FALSE) {
        wprintf(L"%s\n",CkHttpW_lastErrorText(http2));
        CkTaskW_Dispose(task1);
        CkGlobalW_Dispose(glob);
        CkHttpW_Dispose(http1);
        CkHttpW_Dispose(http2);
        CkHttpW_Dispose(http3);
        return;
    }

    task3 = CkHttpW_QuickGetStrAsync(http3,url3);
    if (CkHttpW_getLastMethodSuccess(http3) == FALSE) {
        wprintf(L"%s\n",CkHttpW_lastErrorText(http3));
        CkTaskW_Dispose(task1);
        CkTaskW_Dispose(task2);
        CkGlobalW_Dispose(glob);
        CkHttpW_Dispose(http1);
        CkHttpW_Dispose(http2);
        CkHttpW_Dispose(http3);
        return;
    }

    // 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.
    success = CkTaskW_Run(task1);
    // Assuming success for brevity...
    success = CkTaskW_Run(task2);
    success = CkTaskW_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.
    maxWaitMs = 20000;
    success = CkTaskW_Wait(task1,maxWaitMs);
    success = CkTaskW_Wait(task2,maxWaitMs);
    success = CkTaskW_Wait(task3,maxWaitMs);
    // Assuming success for brevity...

    err = L"Task failed or canceled";
    html1 = err;
    html2 = err;
    html3 = err;

    // Now get the HTML downloaded in each task:
    if ((CkTaskW_getStatusInt(task1) == 7) && (CkTaskW_getTaskSuccess(task1) == TRUE)) {
        html1 = CkTaskW_getResultString(task1);
    }

    if ((CkTaskW_getStatusInt(task2) == 7) && (CkTaskW_getTaskSuccess(task2) == TRUE)) {
        html2 = CkTaskW_getResultString(task2);
    }

    if ((CkTaskW_getStatusInt(task3) == 7) && (CkTaskW_getTaskSuccess(task3) == TRUE)) {
        html3 = CkTaskW_getResultString(task3);
    }

    wprintf(L"%s\n",html1);
    wprintf(L"----\n");
    wprintf(L"%s\n",html2);
    wprintf(L"----\n");
    wprintf(L"%s\n",html3);
    wprintf(L"----\n");

    CkTaskW_Dispose(task1);
    CkTaskW_Dispose(task2);
    CkTaskW_Dispose(task3);


    CkGlobalW_Dispose(glob);
    CkHttpW_Dispose(http1);
    CkHttpW_Dispose(http2);
    CkHttpW_Dispose(http3);

    }