QTimer在子執行緒中的簡單使用

2021-10-08 13:56:25 字數 1743 閱讀 9959

**碎碎念:**剛開始學習qt,一開始準備建立乙個迴圈放在子執行緒中執行,想到了在子執行緒中使用qtimer定時器。但是遇到了執行緒操作相關的問題,導致程式一直報錯:定時器不可被其他的執行緒關閉/登出。

這個問題困擾了我好久,後來仔細看qt的執行緒執行機制,在qt5中,是先建立執行緒,然後通過訊號-槽的機制讓函式在子執行緒中執行起來。

於是寫了這個小例子,希望能夠幫到一開始有疑惑的朋友。

qt5中繼承於qobject的類,即可放入執行緒中執行,不需要繼承於qthread類。

//寫乙個dataprocess的類,作用是周期性地向qmap中插入資料,插入後向主程式傳送訊號(signal)

//.**件

#ifndef dataprocess_h

#define dataprocess_h

#include

#include

#include

class

dataprocess

:public qobject

;//.cpp檔案

#include

"dataprocess.h"

#include

"globallist.h"

#include

dataprocess::

dataprocess

(qobject *parent)

:qobject

(parent)

//新建乙個qtimer的物件,並將其開啟

void dataprocess::

dpstart()

void dataprocess::

dpstop()

void dataprocess::

dpend()

void dataprocess::

dphandle()

建立和訊號槽函式,連線子執行緒中定時器的開啟,停止,銷毀

程式使用了乙個按鈕對子執行緒的qtimer進行停止操作

程式結束時,銷毀qtimer

//.**件

#include

#include

"dataprocess.h"

qt_begin_namespace

namespace ui

qt_end_namespace

class

mainwindow

:public qmainwindow

;//.cpp檔案

#include

"mainwindow.h"

#include

"ui_mainwindow.h"

#include

"globallist.h"

#include

#include

mainwindow::

mainwindow

(qwidget *parent)

:qmainwindow

(parent),ui

(new ui::mainwindow)

mainwindow::

~mainwindow()

void mainwindow::

dealclose()

void mainwindow::

on_pushbutton_clicked()

上述對qtimer的操作程式中沒有再報「定時器不能被其他執行緒關閉/銷毀」的錯誤。

希望能夠對大家有用

如何使主線程在子執行緒之後執行

當時在做乙個小專案的時候老師要求我們用到多執行緒,然後就碰到乙個問題.每次主線程總是要在子執行緒之前執行.之後慢慢的找到了解決的方法 一開始我向著用thread的setpriority 設定優先順序的方法來使子執行緒優先執行.但是結果還是主線程先跑起來.然後開始考慮使用join方法,讓子執行緒呼叫j...

在子執行緒中Toast

問題 直接在普通子執行緒中toast會報錯 錯誤關鍵 1.普通的執行緒不能直接new乙個handle,而toast初始化 中如下 片 public class toast 2.為什麼普通執行緒不能new乙個handle?handle類 如下 public handler looper類中的 片段 p...

QTimer在QThread環境中失效的問題

qtimer在非qthread的環境下能正常工作。但在qthread環境下,需要做一些改動才能正常工作。建立qt的執行緒有兩種方式 1.子例化qthread 可以在虛函式run中啟動定時器,大致的 如下 建構函式,繼承qthread thread thread qobject parent qthr...