{"id":28504,"date":"2024-03-16T10:27:06","date_gmt":"2024-03-16T10:27:06","guid":{"rendered":"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/"},"modified":"2024-03-22T13:37:01","modified_gmt":"2024-03-22T13:37:01","slug":"about-the-issue-with-mfc-multithreaded-progress-bar","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/","title":{"rendered":"About the issue with MFC multithreaded progress bar"},"content":{"rendered":"<p>In MFC, implementing a progress bar using multiple threads can be achieved through the following steps:<\/p>\n<ol>\n<li>Create a progress bar control using the CProgressCtrl class provided by MFC.<\/li>\n<li>Create a custom thread class that inherits from CWinThread and override the Run method. Implement the tasks that need to be executed in the background within the Run method, and update the progress bar control at appropriate times.<\/li>\n<li>Instantiate a custom thread class in the main thread and call its CreateThread method to start the thread.<\/li>\n<li>To update the progress bar, send a custom message to the main window to notify the main thread to update the value of the progress bar control.<\/li>\n<\/ol>\n<p>The specific implementation code is shown below:<\/p>\n<pre class=\"post-pre\"><code><span class=\"hljs-comment\">\/\/ \u4e3b\u7ebf\u7a0b\u4ee3\u7801<\/span>\r\n<span class=\"hljs-function\"><span class=\"hljs-type\">void<\/span> <span class=\"hljs-title\">CMyDialog::OnButtonStart<\/span><span class=\"hljs-params\">()<\/span>\r\n<\/span>{\r\n    <span class=\"hljs-comment\">\/\/ \u521b\u5efa\u8fdb\u5ea6\u6761<\/span>\r\n    m_progressBar.<span class=\"hljs-built_in\">Create<\/span>(WS_CHILD | WS_VISIBLE | PBS_SMOOTH, <span class=\"hljs-built_in\">CRect<\/span>(<span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">200<\/span>, <span class=\"hljs-number\">30<\/span>), <span class=\"hljs-keyword\">this<\/span>, IDC_PROGRESS_BAR);\r\n\r\n    <span class=\"hljs-comment\">\/\/ \u521b\u5efa\u81ea\u5b9a\u4e49\u7ebf\u7a0b\u7c7b\u7684\u5b9e\u4f8b<\/span>\r\n    m_thread = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">CMyThread<\/span>();\r\n\r\n    <span class=\"hljs-comment\">\/\/ \u542f\u52a8\u7ebf\u7a0b<\/span>\r\n    m_thread-&gt;<span class=\"hljs-built_in\">CreateThread<\/span>();\r\n\r\n    <span class=\"hljs-comment\">\/\/ \u6ce8\u518c\u81ea\u5b9a\u4e49\u6d88\u606f<\/span>\r\n    m_progressBar.<span class=\"hljs-built_in\">SetOwner<\/span>(<span class=\"hljs-keyword\">this<\/span>);\r\n    m_progressBar.<span class=\"hljs-built_in\">SetRange<\/span>(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">100<\/span>);\r\n}\r\n\r\n<span class=\"hljs-comment\">\/\/ \u81ea\u5b9a\u4e49\u7ebf\u7a0b\u7c7b<\/span>\r\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">CMyThread<\/span> : <span class=\"hljs-keyword\">public<\/span> CWinThread\r\n{\r\n<span class=\"hljs-keyword\">public<\/span>:\r\n    <span class=\"hljs-function\">BOOL <span class=\"hljs-title\">InitInstance<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span>\r\n    <\/span>{\r\n        <span class=\"hljs-comment\">\/\/ \u540e\u53f0\u4efb\u52a1<\/span>\r\n        <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-type\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt;= <span class=\"hljs-number\">100<\/span>; i++)\r\n        {\r\n            <span class=\"hljs-comment\">\/\/ \u66f4\u65b0\u8fdb\u5ea6\u6761<\/span>\r\n            <span class=\"hljs-built_in\">SendMessage<\/span>(m_pMainWnd-&gt;m_hWnd, WM_MY_UPDATE_PROGRESS, i, <span class=\"hljs-number\">0<\/span>);\r\n\r\n            <span class=\"hljs-comment\">\/\/ \u6a21\u62df\u8017\u65f6\u64cd\u4f5c<\/span>\r\n            <span class=\"hljs-built_in\">Sleep<\/span>(<span class=\"hljs-number\">100<\/span>);\r\n        }\r\n\r\n        <span class=\"hljs-comment\">\/\/ \u4efb\u52a1\u5b8c\u6210<\/span>\r\n        <span class=\"hljs-built_in\">PostMessage<\/span>(m_pMainWnd-&gt;m_hWnd, WM_MY_TASK_COMPLETE, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>);\r\n\r\n        <span class=\"hljs-keyword\">return<\/span> TRUE;\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-type\">void<\/span> <span class=\"hljs-title\">ExitInstance<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">override<\/span>\r\n    <\/span>{\r\n        <span class=\"hljs-comment\">\/\/ \u91ca\u653e\u7ebf\u7a0b\u5bf9\u8c61<\/span>\r\n        <span class=\"hljs-keyword\">delete<\/span> <span class=\"hljs-keyword\">this<\/span>;\r\n    }\r\n};\r\n\r\n<span class=\"hljs-comment\">\/\/ \u4e3b\u7a97\u53e3\u6d88\u606f\u6620\u5c04<\/span>\r\n<span class=\"hljs-built_in\">BEGIN_MESSAGE_MAP<\/span>(CMyDialog, CDialog)\r\n    <span class=\"hljs-built_in\">ON_MESSAGE<\/span>(WM_MY_UPDATE_PROGRESS, OnUpdateProgress)\r\n    <span class=\"hljs-built_in\">ON_MESSAGE<\/span>(WM_MY_TASK_COMPLETE, OnTaskComplete)\r\n<span class=\"hljs-built_in\">END_MESSAGE_MAP<\/span>()\r\n\r\n<span class=\"hljs-comment\">\/\/ \u66f4\u65b0\u8fdb\u5ea6\u6761\u7684\u6d88\u606f\u5904\u7406\u51fd\u6570<\/span>\r\n<span class=\"hljs-function\">LRESULT <span class=\"hljs-title\">CMyDialog::OnUpdateProgress<\/span><span class=\"hljs-params\">(WPARAM wParam, LPARAM lParam)<\/span>\r\n<\/span>{\r\n    <span class=\"hljs-type\">int<\/span> progress = <span class=\"hljs-built_in\">static_cast<\/span>&lt;<span class=\"hljs-type\">int<\/span>&gt;(wParam);\r\n\r\n    m_progressBar.<span class=\"hljs-built_in\">SetPos<\/span>(progress);\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}\r\n\r\n<span class=\"hljs-comment\">\/\/ \u4efb\u52a1\u5b8c\u6210\u7684\u6d88\u606f\u5904\u7406\u51fd\u6570<\/span>\r\n<span class=\"hljs-function\">LRESULT <span class=\"hljs-title\">CMyDialog::OnTaskComplete<\/span><span class=\"hljs-params\">(WPARAM wParam, LPARAM lParam)<\/span>\r\n<\/span>{\r\n    <span class=\"hljs-built_in\">AfxMessageBox<\/span>(_T(<span class=\"hljs-string\">\"\u4efb\u52a1\u5b8c\u6210\"<\/span>));\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}\r\n<\/code><\/pre>\n<p>The above is a simple example of implementing a multi-threaded progress bar. In actual applications, one may also need to consider issues such as thread synchronization and exception handling.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In MFC, implementing a progress bar using multiple threads can be achieved through the following steps: Create a progress bar control using the CProgressCtrl class provided by MFC. Create a custom thread class that inherits from CWinThread and override the Run method. Implement the tasks that need to be executed in the background within the [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-28504","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>About the issue with MFC multithreaded progress bar - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"About the issue with MFC multithreaded progress bar\" \/>\n<meta property=\"og:description\" content=\"In MFC, implementing a progress bar using multiple threads can be achieved through the following steps: Create a progress bar control using the CProgressCtrl class provided by MFC. Create a custom thread class that inherits from CWinThread and override the Run method. Implement the tasks that need to be executed in the background within the [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/SiliCloudGlobal\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-16T10:27:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-22T13:37:01+00:00\" \/>\n<meta name=\"author\" content=\"Olivia Parker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@SiliCloudGlobal\" \/>\n<meta name=\"twitter:site\" content=\"@SiliCloudGlobal\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Olivia Parker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/\"},\"author\":{\"name\":\"Olivia Parker\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/3ff7b3da0e45ac5dbbef2502f3cea8d9\"},\"headline\":\"About the issue with MFC multithreaded progress bar\",\"datePublished\":\"2024-03-16T10:27:06+00:00\",\"dateModified\":\"2024-03-22T13:37:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/\"},\"wordCount\":155,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/\",\"name\":\"About the issue with MFC multithreaded progress bar - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\"},\"datePublished\":\"2024-03-16T10:27:06+00:00\",\"dateModified\":\"2024-03-22T13:37:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.silicloud.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"About the issue with MFC multithreaded progress bar\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/blog\/\",\"name\":\"Silicon Cloud Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\",\"name\":\"Silicon Cloud Blog\",\"url\":\"https:\/\/www.silicloud.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png\",\"contentUrl\":\"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png\",\"width\":1024,\"height\":1024,\"caption\":\"Silicon Cloud Blog\"},\"image\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/SiliCloudGlobal\/\",\"https:\/\/twitter.com\/SiliCloudGlobal\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/3ff7b3da0e45ac5dbbef2502f3cea8d9\",\"name\":\"Olivia Parker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/56c66f189ba32a6f9eb50f31a38fe774e2a725c213d4070835ccc51b8fbbc54b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/56c66f189ba32a6f9eb50f31a38fe774e2a725c213d4070835ccc51b8fbbc54b?s=96&d=mm&r=g\",\"caption\":\"Olivia Parker\"},\"url\":\"https:\/\/www.silicloud.com\/blog\/author\/oliviaparker\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"About the issue with MFC multithreaded progress bar - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/","og_locale":"en_US","og_type":"article","og_title":"About the issue with MFC multithreaded progress bar","og_description":"In MFC, implementing a progress bar using multiple threads can be achieved through the following steps: Create a progress bar control using the CProgressCtrl class provided by MFC. Create a custom thread class that inherits from CWinThread and override the Run method. Implement the tasks that need to be executed in the background within the [&hellip;]","og_url":"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/","og_site_name":"Blog - Silicon Cloud","article_publisher":"https:\/\/www.facebook.com\/SiliCloudGlobal\/","article_published_time":"2024-03-16T10:27:06+00:00","article_modified_time":"2024-03-22T13:37:01+00:00","author":"Olivia Parker","twitter_card":"summary_large_image","twitter_creator":"@SiliCloudGlobal","twitter_site":"@SiliCloudGlobal","twitter_misc":{"Written by":"Olivia Parker","Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/#article","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/"},"author":{"name":"Olivia Parker","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/3ff7b3da0e45ac5dbbef2502f3cea8d9"},"headline":"About the issue with MFC multithreaded progress bar","datePublished":"2024-03-16T10:27:06+00:00","dateModified":"2024-03-22T13:37:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/"},"wordCount":155,"commentCount":0,"publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/","url":"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/","name":"About the issue with MFC multithreaded progress bar - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/#website"},"datePublished":"2024-03-16T10:27:06+00:00","dateModified":"2024-03-22T13:37:01+00:00","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/blog\/about-the-issue-with-mfc-multithreaded-progress-bar\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.silicloud.com\/blog\/"},{"@type":"ListItem","position":2,"name":"About the issue with MFC multithreaded progress bar"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/blog\/#website","url":"https:\/\/www.silicloud.com\/blog\/","name":"Silicon Cloud Blog","description":"","publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.silicloud.com\/blog\/#organization","name":"Silicon Cloud Blog","url":"https:\/\/www.silicloud.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png","contentUrl":"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png","width":1024,"height":1024,"caption":"Silicon Cloud Blog"},"image":{"@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/SiliCloudGlobal\/","https:\/\/twitter.com\/SiliCloudGlobal"]},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/3ff7b3da0e45ac5dbbef2502f3cea8d9","name":"Olivia Parker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/56c66f189ba32a6f9eb50f31a38fe774e2a725c213d4070835ccc51b8fbbc54b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/56c66f189ba32a6f9eb50f31a38fe774e2a725c213d4070835ccc51b8fbbc54b?s=96&d=mm&r=g","caption":"Olivia Parker"},"url":"https:\/\/www.silicloud.com\/blog\/author\/oliviaparker\/"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/28504","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/comments?post=28504"}],"version-history":[{"count":1,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/28504\/revisions"}],"predecessor-version":[{"id":62806,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/28504\/revisions\/62806"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/media?parent=28504"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/categories?post=28504"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/tags?post=28504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}