導航:首頁 > 使用方法 > qthread的使用方法

qthread的使用方法

發布時間:2022-11-02 19:43:55

A. 怎樣正確的使用QThread類

實例如下:
#include <QtCore>

class Thread : public QThread
{
private:
void run()
{
qDebug()<<"From worker thread: "<<currentThreadId();
}
};

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug()<<"From main thread: "<<QThread::currentThreadId();

Thread t;
QObject::connect(&t, SIGNAL(finished()), &a, SLOT(quit()));

t.start();
return a.exec();
}

B. 關於pyQt 中如何實現多線程

可以新開一個Python線程,主線程與線程之間通過queue通信。
PyQt本身可以使用Qt線程(QThread),統一進程的不同QThread之間可以是使用signal/slot機制的!

C. python pyqt5 qthread有哪些方法

用例子說明吧,常用的不多
PyQt中的線程類 QtCore.QThread ,使用時繼承QThread類
啟動界面的線程暫稱為UI線程。界面執行命令時都在自己的UI線程中。
如果在UI線程中執行網路連接和資料庫操作等耗時的操作,界面會被卡住,Windows下有可能會出現「無響應」的警告。
阻塞UI線程會降低用戶體驗和應用穩定性。因此我們可以把耗時操作放在線程中去執行。
QThread代表一個線程,我們可以復寫run函數來執行我們要的操作。
QThread可以使用 QtCore.pyqtSignal 來與界面交互和傳輸數據。
PyQt4 QThread 代碼示例

•Python2.7
# -*- coding: utf-8 -*-
import sys

from PyQt4 import QtCore
from PyQt4.QtCore import QCoreApplication
from PyQt4.QtGui import QWidget, QPushButton, QApplication, QTextBrowser

class TimeThread(QtCore.QThread):
signal_time = QtCore.pyqtSignal(str, int) # 信號

def __init__(self, parent=None):
super(TimeThread, self).__init__(parent)
self.working = True
self.num = 0

def start_timer(self):
self.num = 0
self.start()

def run(self):
while self.working:
print "Working", self.thread()
self.signal_time.emit("Running time:", self.num) # 發送信號
self.num += 1
self.sleep(1)

class TimeDialog(QWidget):
def __init__(self):
super(TimeDialog, self).__init__()
self.timer_tv = QTextBrowser(self)
self.init_ui()
self.timer_t = TimeThread()
self.timer_t.signal_time.connect(self.update_timer_tv)

def init_ui(self):
self.resize(300, 200)
self.setWindowTitle('TimeDialog')
self.timer_tv.setText("Wait")
self.timer_tv.setGeometry(QtCore.QRect(10, 145, 198, 26))
self.timer_tv.move(0, 15)

btn1 = QPushButton('Quit', self)
btn1.setToolTip('Click to quit')
btn1.resize(btn1.sizeHint())
btn1.move(200, 150)
btn1.clicked.connect(QCoreApplication.instance().quit)

start_btn = QPushButton('Start', self)
start_btn.setToolTip("Click to start")
start_btn.move(50, 150)
self.connect(start_btn, QtCore.SIGNAL("clicked()"), self.click_start_btn)

def click_start_btn(self):
self.timer_t.start_timer()

def update_timer_tv(self, text, number):
self.timer_tv.setText(self.tr(text + " " + str(number)))

if __name__ == '__main__':
app = QApplication(sys.argv)
time_dialog = TimeDialog()
time_dialog.show()

sys.exit(app.exec_())

QThread中使用的信號 signal_time = QtCore.pyqtSignal(str, int) 指定了參數str和int
發送信號 self.signal_time.emit("Running time:", self.num)
外部接收信號 self.timer_t.signal_time.connect(self.update_timer_tv)
信號連接到方法 update_timer_tv(self, text, number) ,注意信號與方法的參數要一一對應
使用中我們可以定義多種不同的信號 QtCore.pyqtSignal
啟動線程,調用 start()

D. 怎樣正確的使用QThread類

記住幾個要點:
1。誰創建QThread對象,誰就負責銷毀此對象。
2。線程處理結束後,才能去銷毀QThread對象。線程正在運行中時,不要銷毀對象。
3。線程處理的結束,盡量要自己控制結束,不要被kill掉。
4。分清幾個東西:線程對象自己、線程對象的創建者、啟動線程的調用者、線程處理過程。

E. Qt如何進行創建多線程

在Qt中使用多線程,目前就我使用過的有兩種,一是子類化QThread,重寫run函數,在run函數里實現自己的代碼,這一部分代碼通常是比較耗時,或者乾脆直接阻塞的。比如一個while循環,設置一個標志,判斷循環結束。
這樣的例子在網上有很多,就不寫了。

這樣寫的話,會有一些東西需要了解。
子類化QThread的方法,只有run函數裡面的內容是執行在子線程里的,其他的部分,比如槽函數什麼的還是在主線程里執行(假設是在主線程開啟的該子線程)。

還有一種方法,是子類化QObject,新建一個線程,然後使用MoveToThread把這個類的對象移到新建的線程中,這種做法使得它所有的槽函數都是執行在新開辟的線程裡面。

如果直接(QObject對象).abc()的話,這個成員函數是在主進程內執行,可能會出現"QObject::killTimer: timers
cannot be stopped from another thread"的運行錯誤。

使用第二種方法的話,貌似會遇到這樣的問題:如果在一個槽函數中把子線程阻塞,其他的槽函數無法接受來自主線程

F. 怎樣正確的使用QThread類

要實現一個線程很簡單,寫一個函數,綁定一些數據,如果有必要的話,可以使用 mutex 或者其他方法來保證和線程的安全交互。
無論是 Win32、POSIX 或其他線程,工作原理都基本相同,並相當可靠。至少我敢說比 socket 更容易使用和處理。
簡述
worker-object
worker-object
使用 QThread 時,最主要的事情是把它當成一個線程對象的封裝。此封裝提供了信號、槽和方法,可以輕松地使用 Qt 項目中的線程對象。這說明了子類化 QThread 並實現其 run() 函數是非常錯誤的。
一個 QThread 應該更像一個普通線程實例:准備一個 QObject 類和所有想要的功能,然後創建一個新的QThread,使用 moveToThread(QThread *) 將 QObject 對象移動至線程中,並調用 QThread 實例的 start() 函數。就這樣,再設置適當的信號/槽連接使它正常退出,所有的事情就都做完了。

G. 用QThread創建的線程如何關閉

QT線程有3個函數可以關閉線程,分別是:
void quit ()
相當於exit(0)。

void exit ( int returnCode = 0 )
調用exit後,thread將退出event loop,並從exec返回,exec的返回值就是returnCode。
通常returnCode=0表示成功,其他值表示失敗。

void terminate ()
結束線程,線程是否立即終止取決於操作系統。
線程被終止時,所有等待該線程Finished的線程都將被喚醒。
terminate是否調用取決於setTerminationEnabled ( bool enabled = true )開關。

其中quit與terminate是槽,可以直接用信號連接關閉線程,不過一般不建議使用terminate,還有想關閉線程,最好像下面例子;
直接調用stop介面就行了,線程就會關閉

class Thread : public QThread
{
Q_OBJECT
public:
Thread();

void setMessage(const QString &message);
void stop();

protected:
void run();

private:
QString messageStr;
volatile bool stopped;
};

Thread::Thread()
{
stopped = false;
}
void Thread::run()
{
while (!stopped)
std::cerr << qPrintable(messageStr);
stopped = false;
std::cerr << std::endl;
}
void Thread::stop()
{
stopped = true;
}

H. qt中如何實現多線程

QT線程是獨立的類:

在QT中添加C++類,頭文件引用#include <QThread>;類公開,這樣寫:
class XXXX:public QThread,類裡面申明Q_OBJECT,直接寫在裡面。signals: XXX();這是你的訂閱事件名。private:void run();這是run函數;public: int cona=3;這是變數,一定要public。

cpp文件里引用頭文件,run函數裡面寫方法:

void XXXX::run()
{
do
{
msleep(cona);
emit connec();
}while(true);
}

上面就是線程類了。現在我們在窗體中應用,先在頭文件申明
頭文件private: XXXX *thread1;XXXX *thread2;
構造函數中初始化他們
thread1=new XXXX();
thread1->cona=3;
QObject::connect(thread1,SIGNAL(connec()),this,SLOT(XXX信號1()));
thread2=new XXXX();
thread2->cona=4;
QObject::connect(thread2,SIGNAL(connec()),this,SLOT(XXX信號2()));
XXX信號1()是讀A數據,XXX信號2()讀B數據。
按鈕1的信號槽里寫方法同時進行每3秒讀A、沒4秒讀B
thread1->start();
thread2->start();
要結束誰就用 xxxx->terminate();

看明白沒?QT可不同與C++,你不熟悉編程環境,是很難理解的。

閱讀全文

與qthread的使用方法相關的資料

熱點內容
干物質檢測方法 瀏覽:336
介紹語文學習方法技巧 瀏覽:599
怎麼可以讓關節變軟的方法 瀏覽:148
愛她凝露使用方法 瀏覽:148
測量系統rr計算方法 瀏覽:320
軟文的結尾有哪些方法 瀏覽:453
手機電筒功能介紹和使用方法 瀏覽:920
游戲網站課題研究步驟方法和措施 瀏覽:834
如何用吃的方法去表達歉意 瀏覽:404
解決題方法是什麼意思 瀏覽:467
設置的位置在哪裡設置方法 瀏覽:324
桂花扦插技巧方法 瀏覽:978
海爾洗衣機第一次安裝方法 瀏覽:78
新古箏安裝方法 瀏覽:497
檢測硫離子的方法化學方程式 瀏覽:616
玻璃蝕刻倒角的最佳方法 瀏覽:310
鐵焊條的安裝方法 瀏覽:130
光化學研究方法和研究領域 瀏覽:108
積石的最佳治療方法 瀏覽:273
腳氣去除土方法有哪些 瀏覽:249