1. 程式人生 > >Qt 多執行緒之間的通訊 例項 emit

Qt 多執行緒之間的通訊 例項 emit

問題描述:介面執行緒MainApp為主執行緒,工作執行緒MyThread為一子執行緒,從工作執行緒向主執行緒傳遞位置用於改變主執行緒中按鈕的PushButton位置。

注:Qt的訊號與槽機制可以將任何繼承自QObject類的物件捆綁在一起,使不同物件之間能夠相互通訊。

一下是幾個實現的檔案

// mythread.h

#ifndefMYTHREAD_H
#defineMYTHREAD_H
#include<QThread>
#include<QPushButton>
classMyThread:publicQThread
{
Q_OBJECT
public:
explicit
MyThread(QPushButton*pb);
~MyThread();
QPushButton*pb;
signals:
voidchange_postion(int); // 用於向主執行緒傳送資料的訊號函式, 在.cpp中,沒有進行定義,直接使用emit進行資料的傳送
protected:
voidrun();
publicslots:
private:
};
#endif//MYTHREAD_H

// mythread.cpp

#include"mythread.h"
#include<QDebug>
MyThread::MyThread(QPushButton
*pb):
QThread()
{
this->pb=pb;
}
voidMyThread::run()
{
inti=0;
while(true)
{
qDebug("Thenumberis:%d",i);
i+=10;
emitchange_postion(i);//多執行緒間的通訊 將i的值傳送到主執行緒中
this->msleep(1000);
if(i==400)
{
i=0;
}
}
}
MyThread::~MyThread()
{
}

// MainWindow.h

#ifndefMAINWINDOW_H
#defineMAINWINDOW_H
#include<QtGui/QMainWindow>
#include"mythread.h"
classMainWindow:publicQMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget*parent=0);
~MainWindow();
MyThread*thread;
QPushButton*pb;
privateslots:
voidmove_button(inti);
};
#endif//MAINWINDOW_H

// MainWindow.cpp

#include"mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget*parent)
:QMainWindow(parent)
{
this->setGeometry(0,0,400,400);
pb=newQPushButton("AA",this);
thread=newMyThread(pb);
    // 將子執行緒中的訊號 與 主執行緒的反應槽函式進行連線
connect(thread,SIGNAL(change_postion(int)),this,SLOT(move_button(int)),Qt::QueuedConnection); // connect函式的過載,最後一個引數需要注意,不能使用預設
thread->start();
}
MainWindow::~MainWindow()
{
deletethread;
}
voidMainWindow::move_button(inti)
{
pb->move(i,i);
}

// main.cpp

#include<QtGui/QApplication>
#include"mainwindow.h"
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
MainWindoww;
w.show();
returna.exec();
}

實現過程中遇到過的問題

1.connect函式的第五個引數代表訊號與槽的連線模式,執行緒間的訊號與槽不能使用Qt::DirectConnection直接連線方式,因為它要求在發訊號的執行緒內執行槽函式。而Qt::QueuedConnection佇列方式將訊號轉換成事件傳送到槽函式所線上程的訊息佇列中讓槽函式所線上程來處理,可以實現執行緒安全的執行緒間的通訊。這樣的時效性也不差,上面的實現中,會在子執行緒“run()”函式中的第二個Sleep之前執行主執行緒的“change_position(int)”。

Qt執行緒間的訊號與槽於是在除錯的時候子執行緒的emit change_position(int);的下一步並不會立即跳轉到主執行緒的move_button(int),我開始還以為訊號中途丟了沒送達呢。。而強制使用Qt::DirectConnection模式卻怎麼也擺脫不了錯誤。

2.執行緒間用“訊號與槽”傳遞引用引數的話,一定要加const,因為const文字常量存在常量區中,生命週期與程式一樣的長。這樣可以避免slot呼叫的時候引數的執行期已過而使引用無效。

我開始沒注意到需要加const,程式執行時並沒有報告錯誤,但是主執行緒毫無使用子執行緒傳遞來的字串的跡象,這讓我更加錯誤地以為子執行緒傳送的訊號丟了。


相關推薦

Qt 執行之間通訊 例項 emit

問題描述:介面執行緒MainApp為主執行緒,工作執行緒MyThread為一子執行緒,從工作執行緒向主執行緒傳遞位置用於改變主執行緒中按鈕的PushButton位置。 注:Qt的訊號與槽機制可以將任何繼承自QObject類的物件捆綁在一起,使不同物件之間能夠相互通訊。 一下

java併發程式設計一一執行之間通訊(一)

1.多執行緒之間如何實現通訊 多執行緒之間通訊,其實就是多個執行緒在操作同一個資源,但是操作的動作不同。 1.1什麼是多執行緒之間通訊? 需求:第一個執行緒寫入(input)使用者,另一個執行緒讀取(out)使用者。實現讀一個,寫一個操作。 1.2多執行緒之間通訊需求?

java執行之間通訊

1 實現一個執行緒+1 一個執行緒 -1 class Share511 { public int a = 0; } class Thread552 implements Runnable{ Share511 share; @Override public void run() {

C++ Qt執行 TcpSocket伺服器例項

伺服器: incomming incomming.pro #------------------------------------------------- # # Project created by QtCreator 2016-04-08T09:25:22 # #-

java Condition執行之間通訊

執行緒間通訊Condition Condition可以替代傳統的執行緒間通訊,用await()替換wait(),用signal()替換notify(),用signalAll()替換notifyAll()。 ——為什麼方法名不直接叫wait()/notify()/nofity

java執行之間通訊

一、使用wait()和notify()方法結合實現通訊 注意:wait()和notify()必須在synchronized中使用 wait():是當前執行緒休眠並且釋放鎖。 notify():喚醒另一個執行緒 例項:input執行緒向共享資料中寫入一條資料,out執行緒重共享資料中讀

安卓執行通訊程序之間通訊有什麼不同?分別怎麼實現?

**當一個程式第一次啟動的時候,Android會去動一個Linux進行和一個主執行緒,預設情況下,所有改程式元件都將在該程序和執行緒中 執行,同時Android會為每個應用程式分配一個單獨的Linux使用者,Android會盡量保留一個正在執行的程序,只在記憶體資源出現不足時,Andro

Java——執行基本使用(三) 餓漢式和懶漢式的單例設計模式,執行之間通訊

這一則部落格主要寫的是單例設計模式,與實現多執行緒之間的通訊等等~ 1.單例設計模式:保證類在記憶體中只有一個物件 2.保證類在記憶體中只有一個物件            &

Java執行之間執行間的通訊方式

①同步 這裡講的同步是指多個執行緒通過synchronized關鍵字這種方式來實現執行緒間的通訊。 比如:執行緒B需要等待執行緒A執行完了methodA()方法之後,它才能執行methodB()方法。這樣,執行緒A和執行緒B就實現了 通訊。 這種方式,本質上就是“共享記

執行之間實現通訊

什麼是多執行緒之間通訊? 多執行緒之間通訊,其實就是多個執行緒在操作同一個資源,但是操作的動作不同。 多執行緒之間通訊需求 需求:第一個執行緒寫入(input)使用者,另一個執行緒取讀取(out)使用者.實現讀一個,寫一個操作。 共享資源源實體類 class

使用nanomsg庫實現執行之間通訊(二)

概述:       這次是nanomsg庫實現的一個類似於MQTT通訊的一種方式,廣播訂閱的一個一對多的通訊方式。一個主的廣播訊息,其他可以訂閱自己想要的主題資訊,然後就會只接收訂閱的主題的資訊。 PubSub一對多主題訂閱通訊Demo #include <std

使用nanomsg庫實現執行之間通訊(三)

概述:    這次使用nanomsg庫實現多執行緒一對多的雙向通訊,其實類似一個伺服器,其他均為客戶端,且它們之間是長連線,所以伺服器可以主動和客戶端通訊,客戶端也可以和伺服器通訊,這樣的一個方式。 多執行緒一對多雙向通訊Demo #include <stdio.

非同步程式設計學習之路(三)-執行之間的協作與通訊

本文是非同步程式設計學習之路(三)-多執行緒之間的協作與通訊,若要關注前文,請點選傳送門: 非同步程式設計學習之路(二)-通過Synchronize實現執行緒安全的多執行緒 通過前文,我們學習到如何實現同步的多執行緒,但是在很多情況下,僅僅同步是不夠的,還需要執行緒與執行緒協作(通訊),生產

程序和執行之間通訊方式及通訊實現步驟小結

程序間通訊方式 # 管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。 # 有名管道 (namedpipe) : 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。 #

Qt: 執行,繼承QThread,重寫run(理論+例項

多執行緒的特點: 1、  多個執行緒共享程序的記憶體空間,多執行緒記憶體空間統一。 2、  每個執行緒都有自己獨立的棧空間,多個執行緒之間是相互獨立的。 3、  執行緒是作業系統運算排程的最小單位。

Android 執行之間通訊互動(Ui執行與子執行之間通訊)Handler,Handler.post(Runnable runnable),runUiThread方式

工作內容: 1.FrameLayout/OnTouchListener(滑動監聽) 2.生命週期 3.UI執行緒 4.Android中的耗時操作/多執行緒 5.多執行緒中的互動:Handler handler.post(Runnable runnable) 6.多執行緒中

Qt執行通訊

簡述: 1> Qt執行緒間共享資料主要有兩種方式: 1)使用共享記憶體。即使用一個兩個執行緒都能夠共享的變數(如全域性變數),這樣兩個執行緒都能夠訪問和修改該變數,從而達到共享資料的目的。 2)使用singal/slot機制,把資料從一個執行緒傳遞到另外一個執

執行同步互斥例項——使用synchronized實現執行通訊和互斥

執行緒互斥概念       執行緒互斥是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。 實現執行緒同步互斥的四種方式    

【Linux】程序與執行之間的區別

http://blog.csdn.net/byrsongqq/article/details/6339240 網路程式設計中設計併發伺服器,使用多程序與多執行緒 ,請問有什麼區別?  答案一: 1,程序:子程序是父程序的複製品。子程序獲得父程序資料空間、堆和棧的複製品。 2,執行緒:相

python執行————3、執行通訊:共享變數,queue

1、共享變數 #通過共享變數 import time import threading url_list = [] def get_detail_html(): global url_list while True: if len(url_list):