Unicode C
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
#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);
}