<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Multithreading on Edward&#39;s Blog</title>
    <link>https://example.org/tags/multithreading/</link>
    <description>Recent content from Edward&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    
    <managingEditor>xxx@example.com (D-Sketon)</managingEditor>
    <webMaster>xxx@example.com (D-Sketon)</webMaster>
    
    <copyright>本博客所有文章除特别声明外，均采用 BY-NC-SA 许可协议。转载请注明出处！</copyright>
    
    <lastBuildDate>Tue, 14 Jul 2026 16:41:00 +0800</lastBuildDate>
    
    
    <atom:link href="https://example.org/tags/multithreading/index.xml" rel="self" type="application/rss&#43;xml" />
    

    
    

    <item>
      <title>Qt 多线程使用</title>
      <link>https://example.org/post/qt-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95%E4%B9%8B%E7%BA%BF%E7%A8%8B%E6%B1%A0/</link>
      <pubDate>Tue, 14 Jul 2026 16:41:00 &#43;0800</pubDate>
      <author>xxx@example.com (D-Sketon)</author>
      <guid>https://example.org/post/qt-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95%E4%B9%8B%E7%BA%BF%E7%A8%8B%E6%B1%A0/</guid>
      <description>
        <![CDATA[<h1>Qt 多线程使用</h1><p>作者：D-Sketon（xxx@example.com）</p>
        
          <p>在进行桌面应用程序开发的时候，假设应用程序在某些情况下需要处理比较复杂的逻辑，如果只有一个线程去处理，就会导致窗口卡顿，无法处理用户的相关操作。这种情况下就需要使用多线程，其中一个线程处理窗口事件，其他线程进行逻辑运算，多个线程各司其职，不仅可以提高用户体验还可以提升程序的执行效率。</p>
<p>在 qt 中使用了多线程，有些事项是需要额外注意的：</p>
<ul>
<li>默认的线程在 qt 中称之为窗口线程，也叫主线程，负责窗口事件处理或者窗口控件数据的更新</li>
<li>子线程负责后台的业务逻辑处理，子线程中不能对窗口对象做任何操作，这些事情需要交给窗口线程处理</li>
<li>主线程和子线程之间如果要进行数据的传递，需要使用 qt 中的信号槽机制</li>
</ul>
<h2 id="1-线程类-qthread">
<a class="header-anchor" href="#1-%e7%ba%bf%e7%a8%8b%e7%b1%bb-qthread"></a>
1 线程类 QThread
</h2><h3 id="11-常用共用成员函数">
<a class="header-anchor" href="#11-%e5%b8%b8%e7%94%a8%e5%85%b1%e7%94%a8%e6%88%90%e5%91%98%e5%87%bd%e6%95%b0"></a>
1.1 常用共用成员函数
</h3><p>Qt中提供了一个线程类。通过这个类就可以创建子线程，Qt一共提供了两种创建子线程的方式。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-cpp" data-lang="cpp"><span style="display:flex;"><span><span style="color:#75715e">// QThread 类常用 API
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 构造函数
</span></span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>QThread(QObject <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> Q_NULLPTR);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 判断线程中的任务是不是处理完毕了
</span></span></span><span style="display:flex;"><span><span style="color:#66d9ef">bool</span> QThread<span style="color:#f92672">::</span>isFinished() <span style="color:#66d9ef">const</span>;
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 判断子线程是不是在执行任务
</span></span></span><span style="display:flex;"><span><span style="color:#66d9ef">bool</span> QThread<span style="color:#f92672">::</span>isRunning() <span style="color:#66d9ef">const</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Qt中的线程可以设置优先级
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 得到当前线程的优先级
</span></span></span><span style="display:flex;"><span>Priority QThread<span style="color:#f92672">::</span>priority() <span style="color:#66d9ef">const</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>setPriority(Priority priority);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">优先级枚举：</span>
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>IdlePriority         <span style="color:#f92672">--&gt;</span> <span style="color:#960050;background-color:#1e0010">最低的优先级</span>
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>LowestPriority
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>LowPriority
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>NormalPriority
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>HighPriority
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>HighestPriority
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>TimeCriticalPriority
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>InheritPriority     <span style="color:#f92672">--&gt;</span> <span style="color:#960050;background-color:#1e0010">默认优先级，最高优先级</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 退出线程，停止底层的事件循环
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 退出线程的工作函数
</span></span></span><span style="display:flex;"><span><span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>exit(<span style="color:#66d9ef">int</span> returnCode <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 调用线程退出函数之后，线程不会马上退出因为当前任务有可能还没有完成，调用这个函数是
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 等待任务完成，然后退出线程，一般情况下会在 exit() 后边调用这个函数
</span></span></span><span style="display:flex;"><span><span style="color:#66d9ef">bool</span> QThread<span style="color:#f92672">::</span>wait(<span style="color:#66d9ef">unsigned</span> <span style="color:#66d9ef">long</span> time <span style="color:#f92672">=</span> ULONG_MAX);
</span></span></code></pre></div><h3 id="12-信号槽">
<a class="header-anchor" href="#12-%e4%bf%a1%e5%8f%b7%e6%a7%bd"></a>
1.2 信号槽
</h3><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-cpp" data-lang="cpp"><span style="display:flex;"><span><span style="color:#75715e">// 和调用 exit() 效果是一样的
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 调用这个函数之后，再调用 wait() 函数
</span></span></span><span style="display:flex;"><span>[slot] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>quit();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 启动子线程
</span></span></span><span style="display:flex;"><span>[slot] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>start(Priority priority <span style="color:#f92672">=</span> InheritPriority);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 线程退出，可能是会马上终止线程，一般情况下不使用这个函数
</span></span></span><span style="display:flex;"><span>[slot] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>terminate();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 线程中执行的任务完成了，发出该信号
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 任务函数中的处理逻辑执行完毕了
</span></span></span><span style="display:flex;"><span>[signal] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>finished();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 开始工作之前发出这个信号，一般不使用
</span></span></span><span style="display:flex;"><span>[signal] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>started();
</span></span></code></pre></div><h3 id="13-静态函数">
<a class="header-anchor" href="#13-%e9%9d%99%e6%80%81%e5%87%bd%e6%95%b0"></a>
1.3 静态函数
</h3><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-cpp" data-lang="cpp"><span style="display:flex;"><span><span style="color:#75715e">// 返回一个指向管理当前执行线程的QThread的指针
</span></span></span><span style="display:flex;"><span>[<span style="color:#66d9ef">static</span>] QThread <span style="color:#f92672">*</span>QThread<span style="color:#f92672">::</span>currentThread();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 返回可以在系统上运行的理想线程数 == 和当前电脑的 CPU 核心数相同
</span></span></span><span style="display:flex;"><span>[<span style="color:#66d9ef">static</span>] <span style="color:#66d9ef">int</span> QThread<span style="color:#f92672">::</span>idealThreadCount();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 线程休眠函数
</span></span></span><span style="display:flex;"><span>[<span style="color:#66d9ef">static</span>] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>msleep(<span style="color:#66d9ef">unsigned</span> <span style="color:#66d9ef">long</span> msecs);    <span style="color:#75715e">// 单位: 毫秒
</span></span></span><span style="display:flex;"><span>[<span style="color:#66d9ef">static</span>] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>sleep(<span style="color:#66d9ef">unsigned</span> <span style="color:#66d9ef">long</span> secs);     <span style="color:#75715e">// 单位: 秒
</span></span></span><span style="display:flex;"><span>[<span style="color:#66d9ef">static</span>] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>usleep(<span style="color:#66d9ef">unsigned</span> <span style="color:#66d9ef">long</span> usecs);    <span style="color:#75715e">// 单位: 微秒
</span></span></span></code></pre></div><h3 id="14-任务处理函数">
<a class="header-anchor" href="#14-%e4%bb%bb%e5%8a%a1%e5%a4%84%e7%90%86%e5%87%bd%e6%95%b0"></a>
1.4 任务处理函数
</h3><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-cxx" data-lang="cxx"><span style="display:flex;"><span><span style="color:#75715e">// 子线程要处理什么任务，需要写到run()中
</span></span></span><span style="display:flex;"><span>[<span style="color:#66d9ef">virtual</span> <span style="color:#66d9ef">protected</span>] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>run();
</span></span></code></pre></div><p>这个 run() 是一个虚函数，如果想让创建的子线程执行某个任务，需要写一个子类让其继承 QThread，并且在子类中重写父类的 run() 方法，函数体就是对应的任务处理流程。另外，这个函数是一个受保护的成员函数，不能够在类的外部调用，如果想要让线程执行这个函数中的业务流程，需要通过当前线程对象调用槽函数 start() 启动子线程，当子线程被启动，这个 run() 函数就在线程内部被调用了。</p>
        
        <hr><p>本文2026-07-14首发于<a href='https://example.org/'>Edward's Blog</a>，最后修改于2026-07-14</p>]]>
      </description>
      
        <category>Qt</category>
      
    </item>
    
  </channel>
</rss>
