1. 程式人生 > >QT 多執行緒使用QTcpSocket

QT 多執行緒使用QTcpSocket

本人親測使用moveToThread()的方式可以;不存在報錯,警告
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    SocketThread *worker = new SocketThread;
    worker->moveToThread(&workerThread);
    connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
    connect(this, &Widget::operate, worker, &SocketThread::run1);
    connect(worker, &SocketThread::resultReady, this, &Widget::handleResults);
    workerThread.start();
    emit operate();
    qDebug()<<"main"<<QThread::currentThreadId();
}

Widget::~Widget()
{
    //t.exit();
    workerThread.quit();
    workerThread.wait();
    delete ui;
}

void Widget::handleResults(const QString &)
{

}


#ifndefWIDGET_H
#defineWIDGET_H
#include<QWidget>
#include"socketthread.h"
#include<QThread>
namespaceUi{
classWidget;
}
classWidget:publicQWidget
{
Q_OBJECT
public:
explicitWidget(QWidget*parent=0);
~Widget();
private:
Ui::Widget*ui;
QThreadworkerThread;
publicslots:
voidhandleResults(constQString&);
signals
:
voidoperate();
};
#endif//WIDGET_H
#include"socketthread.h"
#include"QDebug"
#include<QMessageBox>
#include<QThread>
SocketThread::SocketThread(QObject*parent):QObject(parent)
{
//start();
}
SocketThread::~SocketThread()
{
//quit();
//wait();
}
voidSocketThread::OnNewConnection()
{
qDebug()<<"newconnection"
;
socket_ptr=std::make_shared<QTcpSocket>();
socket_ptr=static_cast<std::shared_ptr<QTcpSocket>>(server_ptr->nextPendingConnection());
connect(socket_ptr.get(),QTcpSocket::readyRead,this,OnRead);
socket_list->push_back(socket_ptr);
qDebug()<<QThread::currentThreadId();
}
voidSocketThread::OnRead()
{
qDebug()<<"readyread";
qDebug()<<QThread::currentThreadId();
QByteArrayarr;
QTcpSocket*socket_ptr=static_cast<QTcpSocket*>(sender());
arr=socket_ptr->readAll();
socket_ptr->write(arr);
qDebug()<<arr;
}
voidSocketThread::run1()
{
socket_list=newstd::list<std::shared_ptr<QTcpSocket>>();
server_ptr=std::make_shared<QTcpServer>();
server_ptr->listen(QHostAddress::Any,5000);
connect(server_ptr.get(),QTcpServer::newConnection,\
this,SocketThread::OnNewConnection);
qDebug()<<QThread::currentThreadId();
}
#ifndefSOCKETTHREAD_H
#defineSOCKETTHREAD_H
#include<QObject>
#include<QTcpSocket>
#include<QTcpServer>
#include<memory>
#include<list>
classSocketThread:publicQObject
{
Q_OBJECT
public:
explicitSocketThread(QObject*parent=0);
~SocketThread();
signals:
publicslots:
voidOnNewConnection();
voidOnRead();
publicslots:
voidrun1();
private:
std::list<std::shared_ptr<QTcpSocket>>*socket_list;
std::shared_ptr<QTcpSocket>socket_ptr;
std::shared_ptr<QTcpServer>server_ptr;
signals:
voidresultReady(constQString&result);
};
#endif//SOCKETTHREAD_H

相關推薦

QT 執行使用QTcpSocket

本人親測使用moveToThread()的方式可以;不存在報錯,警告#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget

QT執行淘酒,持續更新

第一階段 首先必須區分三個概念: 主執行緒:在程式初始化完成後,主執行緒就進入了main()函式開始執行應用程式碼,一般在主執行緒上構建介面物件並呈現之,然後就進入了事件迴圈以處理各類訊息(控制元件繪製、使用者輸入、系統輸出等訊息)。這就是熟知的事件驅動模型。 工作執行緒:也就是子執

QT執行中,物件訊號與槽連線不上的解決辦法

1、在接收者建立執行緒中,把接收者移動到主執行緒中: pReceiverObj->moveToThread(QApplication::instance()->thread()); 2、這樣傳送訊號的時候,就會在主執行緒事件佇列處理中來處理了。 把connect的最

QT學習記錄2(QT執行

對QT多執行緒的理解 qt多執行緒基於QThread類,在使用的時候,可以選擇新建類,然後繼承QThread類,然後重寫run函式,從而實現QT多執行緒   QT多執行緒小例程 首先,建立一個QT工程,名字叫做mythread,視窗選擇widget,然後一路下一步即可,生成

qt執行之 std::thread

不時見到有人會這樣做: 不使用QThread,而是使用pthread等平臺相關的底層 api 而又不想使用底層執行緒間同步、通訊的api 那麼,如何使用pthread,而又使用Qt提供的執行緒間機制呢? 本文的初衷源於此,但是使用的的是C++0x 的 std::threa

Qt 執行伺服器與客戶端

文章目錄 思路 伺服器 myserver.h myserver.cpp mythread.h mythread.cpp mysocket.h mysocket.cpp

Qt執行同步

       一、Qt中使用多執行緒時候,多執行緒的同步就是一個不可避免的問題。多執行緒的同步就是使多個執行緒在同時執行同一段程式碼的時候,有順序的執行,不會出現同時有兩個或者多個執行緒執行同一段程式碼的情況,特別是在對變數或者檔案執行寫操作的時候。也就是所謂的

Qt執行-QThreadPool執行池與QRunnable

介紹 執行緒的建立及銷燬需要與系統互動,會產生很大的開銷。若需要頻繁的建立執行緒建議使用執行緒池,有執行緒池維護一定數量的執行緒,當需要進行多執行緒運算時將運算函式傳遞給執行緒池即可。執行緒池會根據可用執行緒進行任務安排。 QThreadPool 此類為Qt提供

QT 執行程式設計

QT通過三種形式提供了對執行緒的支援。它們分別是,一、平臺無關的執行緒類,二、執行緒安全的事件投遞,三、跨執行緒的訊號-槽連線。這使得開發輕巧的多執行緒Qt程式更為容易,並能充分利用多處理器機器的優勢。多執行緒程式設計也是一個有用的模式,它用於解決執行較長時間的操作而不至於使用者介面失去響應。在Qt的早期

Qt執行執行的等待和喚醒】QWaitCondition

QWatiCondition的成員函式 ·QWaitCondition() ·~QWaitCondition() ·bool wait ( QMutex * mutex, unsigned long time = ULONG_MAX ) ·vo

Qt執行學習:建立執行

【為什麼要用多執行緒?】 傳統的圖形使用者介面應用程式都只有一個執行執行緒,並且一次只執行一個操作。如果使用者從使用者介面中呼叫一個比較耗時的操作,當該操作正在執行時,使用者介面通常會凍結而不再響應。這個問題可以用事件處理和多執行緒來解決。 【Linux有執行緒的概念嗎?

QT執行臨界資源互斥

多執行緒是個老梗,一般都會遇到,同樣臨界資源的互斥訪問也是一個老生長談的問題了。這裡把最近使用的一種方法分享一下。 問題場景:主執行緒根據一定條件建立多個子執行緒,子執行緒執行的是同一個類不同例項的方法,該方法中需要向主執行緒傳送一個訊息顯示一個對話方塊用以接收使用者輸入;

Qt執行程式設計

Qt執行緒類 Qt 包含下面一些執行緒相關的類: QThread 提供了開始一個新執行緒的方法 QThreadStorage 提供逐執行緒資料儲存 QMutex   提供相互排斥的鎖,或互斥量 QMutexLocker 是一個便利類,它可以自動對QMut

QT 執行 使用UI

直接上程式碼: qt的ui操作必須在主執行緒做的,分支執行緒只能傳送訊息給主執行緒進行引導操作。 所以平常我們的程式碼都是直接使用一個執行緒來調動UI,但是不同的執行緒同時需要使用UI來顯示結果之類的就需要相互協調; 如果沒有invoke之類的方法,可以考慮直接使用qt 的Qthread

Qt執行程式設計總結(一)

Qt對執行緒提供了支援,基本形式有獨立於平臺的執行緒類、執行緒安全方式的事件傳遞和一個全域性Qt庫互斥量允許你可以從不同的執行緒呼叫Qt方法。 這個文件是提供給那些對多執行緒程式設計有豐富的知識和經驗的聽眾的。推薦閱讀: 警告:所有的GUI類(比如,QWidget和它的

Qt執行程式設計總結(一)(所有GUI物件都是執行不安全的)

Qt對執行緒提供了支援,基本形式有獨立於平臺的執行緒類、執行緒安全方式的事件傳遞和一個全域性Qt庫互斥量允許你可以從不同的執行緒呼叫Qt方法。 這個文件是提供給那些對多執行緒程式設計有豐富的知識和經驗的聽眾的。推薦閱讀: 警告:所有的GUI類(比如,QWidget和它的子類),作業系統核心類(比如,QPr

Qt 執行之間的通訊 例項 emit

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

qt執行以及事件投遞的理解

用QThread啟動執行緒的良好方法以及理解。 1) 用原始的QThread的started訊號觸發自定義的slot啟動執行緒,而不是派生QThread的類過載run函式啟動執行緒。 將一個類派生自QObject,然後實現所有的signal/slot,然後通過呼叫movetothread函式來使他們執行在

Qt 執行的一個例子

(1)用VC6.0新建個Win32 Console Application工程(2)Project Settings裡面Link標籤頁面新增qtmain.lib qt-mt320.lib   Project Settings裡面C/C++標籤頁面新增QT_THREAD_SUP

Qt執行(一)

  Qt 中的多執行緒  QT通過三種形式提供了對執行緒的支援。它們分別是,一、平臺無關的執行緒類,二、執行緒安全的事件投遞,三、跨執行緒的訊號-槽連線。這使得開發輕巧的多執行緒Qt程式更為容易,並能充分利用多處理器機器的優勢。多執行緒程式設計也是一個有用的模式,它用於解