Chilkat HOME Android™ Classic ASP C C++ C# Mono C# .NET Core C# C# UWP/WinRT DataFlex Delphi ActiveX Delphi DLL Visual FoxPro Java Lianja MFC Objective-C Perl PHP ActiveX PHP Extension PowerBuilder PowerShell PureBasic CkPython Chilkat2-Python Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ Visual Basic 6.0 VB.NET VB.NET UWP/WinRT VBScript Xojo Plugin Node.js Excel Go
(MFC) Thread Pool SizeDemonstrates 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.
#include <CkGlobal.h> #include <CkHttp.h> #include <CkTask.h> void ChilkatSample(void) { CkString strOut; // All Chilkat classes can be unlocked at once at the beginning of a program // by calling UnlockBundle. It requires a Bundle unlock code. CkGlobal chilkatGlob; bool success = chilkatGlob.UnlockBundle("Anything for 30-day trial."); if (success != true) { strOut.append(chilkatGlob.lastErrorText()); strOut.append("\r\n"); SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); return; } // 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. chilkatGlob.put_MaxThreads(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. chilkatGlob.put_ThreadPoolLogPath("/home/users/chilkat/logs/threadPoolLog.txt"); CkHttp http1; CkHttp http2; CkHttp http3; const char *url1 = "http://www.marcusmiller.com/"; const char *url2 = "http://www.tromboneshorty.com/"; const char *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. CkTask *task1 = http1.QuickGetStrAsync(url1); if (http1.get_LastMethodSuccess() == false) { strOut.append(http1.lastErrorText()); strOut.append("\r\n"); SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); return; } CkTask *task2 = http2.QuickGetStrAsync(url2); if (http2.get_LastMethodSuccess() == false) { strOut.append(http2.lastErrorText()); strOut.append("\r\n"); delete task1; SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); return; } CkTask *task3 = http3.QuickGetStrAsync(url3); if (http3.get_LastMethodSuccess() == false) { strOut.append(http3.lastErrorText()); strOut.append("\r\n"); delete task1; delete task2; SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); 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(maxWaitMs); success = task2->Wait(maxWaitMs); success = task3->Wait(maxWaitMs); // Assuming success for brevity... const char *err = "Task failed or canceled"; const char *html1 = err; const char *html2 = err; const char *html3 = err; // Now get the HTML downloaded in each task: if ((task1->get_StatusInt() == 7) && (task1->get_TaskSuccess() == true)) { html1 = task1->getResultString(); } if ((task2->get_StatusInt() == 7) && (task2->get_TaskSuccess() == true)) { html2 = task2->getResultString(); } if ((task3->get_StatusInt() == 7) && (task3->get_TaskSuccess() == true)) { html3 = task3->getResultString(); } strOut.append(html1); strOut.append("\r\n"); strOut.append("----"); strOut.append("\r\n"); strOut.append(html2); strOut.append("\r\n"); strOut.append("----"); strOut.append("\r\n"); strOut.append(html3); strOut.append("\r\n"); strOut.append("----"); strOut.append("\r\n"); delete task1; delete task2; delete task3; SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); } |
© 2000-2022 Chilkat Software, Inc. All Rights Reserved.