**碎碎念:**剛開始學習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...