Objective-C
Objective-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 Objective-C Downloads
#import <CkoGlobal.h>
#import <CkoHttp.h>
#import <NSString.h>
#import <CkoTask.h>
BOOL success = NO;
// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
success = NO;
// 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.
CkoGlobal *glob = [[CkoGlobal alloc] init];
glob.MaxThreads = [NSNumber numberWithInt: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.
glob.ThreadPoolLogPath = @"/home/users/chilkat/logs/threadPoolLog.txt";
CkoHttp *http1 = [[CkoHttp alloc] init];
CkoHttp *http2 = [[CkoHttp alloc] init];
CkoHttp *http3 = [[CkoHttp alloc] init];
NSString *url1 = @"http://www.marcusmiller.com/";
NSString *url2 = @"http://www.tromboneshorty.com/";
NSString *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.
CkoTask *task1 = [http1 QuickGetStrAsync: url1];
if (http1.LastMethodSuccess == NO) {
NSLog(@"%@",http1.LastErrorText);
return;
}
CkoTask *task2 = [http2 QuickGetStrAsync: url2];
if (http2.LastMethodSuccess == NO) {
NSLog(@"%@",http2.LastErrorText);
return;
}
CkoTask *task3 = [http3 QuickGetStrAsync: url3];
if (http3.LastMethodSuccess == NO) {
NSLog(@"%@",http3.LastErrorText);
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 = [task1 Run];
// Assuming success for brevity...
success = [task2 Run];
success = [task3 Run];
// 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.
int maxWaitMs = 20000;
success = [task1 Wait: [NSNumber numberWithInt: maxWaitMs]];
success = [task2 Wait: [NSNumber numberWithInt: maxWaitMs]];
success = [task3 Wait: [NSNumber numberWithInt: maxWaitMs]];
// Assuming success for brevity...
NSString *err = @"Task failed or canceled";
NSString *html1 = err;
NSString *html2 = err;
NSString *html3 = err;
// Now get the HTML downloaded in each task:
if (([task1.StatusInt intValue] == 7) && (task1.TaskSuccess == YES)) {
html1 = [task1 GetResultString];
}
if (([task2.StatusInt intValue] == 7) && (task2.TaskSuccess == YES)) {
html2 = [task2 GetResultString];
}
if (([task3.StatusInt intValue] == 7) && (task3.TaskSuccess == YES)) {
html3 = [task3 GetResultString];
}
NSLog(@"%@",html1);
NSLog(@"%@",@"----");
NSLog(@"%@",html2);
NSLog(@"%@",@"----");
NSLog(@"%@",html3);
NSLog(@"%@",@"----");