1. 程式人生 > >【Qt】Qt之程序間通訊(共享記憶體)【轉】

【Qt】Qt之程序間通訊(共享記憶體)【轉】

簡述

上一節中,我們分享下如何利用Windows訊息機制來進行不同程序間的通訊。但是有很多侷限性,比如:不能跨平臺,而且必須兩個程序同時存在才可以,要麼程序A發了訊息誰接收呢?

下面我們來分享另外一種跨平臺的進行間通訊的方式-Shared Memory(共享記憶體)。

注意事項

初始化QSharedMemory時,必須指定一個唯一的標識Key,程序的Key必須保持一致。可以使用setKey來設定。

載入進記憶體

說明

程序A-寫

分為下面幾步:

  1. 檢測該程序是否連線到共享記憶體段,如果連線,則將該程序與共享記憶體段分離。
  2. 從系統足夠大的記憶體中得到一個新的共享記憶體段。
  3. 鎖定該共享記憶體段,以阻止第二個對話方塊程序訪問,將緩衝區中的圖片複製進共享記憶體段。
  4. 將共享記憶體段解鎖,然後第二個對話方塊程序就可以訪問了。

實現

void Dialog::loadFromFile()
{
    if (sharedMemory.isAttached())
    {
        // 將該程序與共享記憶體段分離
        if (!sharedMemory.detach())
            qDebug() << "Unable to detach from shared memory.";
    }

    QString fileName = QFileDialog::getOpenFileName(0, QString(), QString(),
                                        tr("Images (*.png *.xpm *.jpg)"));
    QImage image;
    if (!image.load(fileName))
    {
        qDebug() << "Selected file is not an image, please select another.";
        return;
    }

    // 將資料載入到共享記憶體中
    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);
    QDataStream out(&buffer);
    out << image;
    int size = buffer.size();

    // 建立共享記憶體段
    if (!sharedMemory.create(size))
    {
        qDebug() << sharedMemory.errorString() << "\n Unable to create shared memory segment.";
        return;
    }
    sharedMemory.lock();
    char *to = (char*)sharedMemory.data();
    const char *from = buffer.data().data();
    memcpy(to, from, qMin(sharedMemory.size(), size));
    sharedMemory.unlock();
}

從記憶體中讀取

說明

程序B-讀

分為下面幾步:

  1. 將該程序與程序A建立的共享記憶體段繫結
  2. 鎖定共享記憶體段,複製資料到緩衝區,然後寫入到QImage中。
  3. 將共享記憶體段解鎖,然後將該程序與共享記憶體段分離。

實現

void MainWindow::loadFromMemory()
{
    // 將共享記憶體與該程序繫結
    if (!sharedMemory.attach())
    {
        qDebug() << "Unable to attach to shared memory segment.";
        return;
    }

    // 從共享記憶體中讀取資料
    QBuffer buffer;
    QDataStream in(&buffer);
    QImage image;

    sharedMemory.lock();
    buffer.setData((char*)sharedMemory.constData(), sharedMemory.size());
    buffer.open(QBuffer::ReadOnly);
    in >> image;
    sharedMemory.unlock();

    sharedMemory.detach();
    m_pLabel->setPixmap(QPixmap::fromImage(image));
}



相關推薦

QtQt程序通訊共享記憶體

簡述 上一節中,我們分享下如何利用Windows訊息機制來進行不同程序間的通訊。但是有很多侷限性,比如:不能跨平臺,而且必須兩個程序同時存在才可以,要麼程序A發了訊息誰接收呢? 下面我們來分享另外一種跨平臺的進行間通訊的方式-Shared Memory(共享記憶體)。 簡述 注意事項

QtQt程序通訊Windows訊息

簡述 通過上一節的瞭解,我們可以看出程序通訊的方式很多,今天分享下如何利用Windows訊息機制來進行不同程序間的通訊。 效果 傳送訊息 自定義型別與接收窗體 包含所需庫,定義傳送的自定義型別、接收訊息的窗體標題。自定義型別可以處理訊息過多情況下,對訊息的區分,如果不需要也可以去掉。

Linux 程序通訊共享記憶體

上篇部落格我們講了,匿名管道,命名管道,訊息佇列,並使用了他們,初步瞭解了程序間通訊的概念。下面我們要說共享記憶體。 共享記憶體函式 shmget函式 功能:用來建立共享記憶體 原型 int shmget(key_t key,size_t si

Qt 程序通訊Windows 訊息

簡述 通過上一節的瞭解,我們可以看出程序通訊的方式很多,今天分享下如何利用Windows訊息機制來進行不同程序間的通訊。 | 效果 傳送訊息 自定義型別與接收窗體 包含所需庫,定義傳送的自定義型別、接收訊息的窗體標題。自定義型別可以處理

QtQt程序通訊QProcess

簡述 前幾節裡,分享了程序通訊的幾種方式:Windows訊息機制、Shared Memory(共享記憶體),本節講解下關於程序通訊的另外一種方式-QProcess。 簡述 命令列讀取 說明 實現 更多參考 命令列引數啟動 說明 程序A-帶參啟動

QtQt程序通訊IPC

簡述 程序間通訊,就是在不同程序之間傳播或交換資訊。那麼不同程序之間存在著什麼雙方都可以訪問的介質呢?程序的使用者空間是互相獨立的,一般而言是不能互相訪問的,唯一的例外是共享記憶體區。但是,系統空間卻是“公共場所”,所以核心顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪問的外設了。在這個意義上,兩

Qt 程序通訊QProcess

簡述 QProcess可以在應用程式內部與其它程序通訊,或啟動其它應用程式。與在終端機之類的命令輸入視窗上使用名稱和引數是一樣的,可以使用QProcess提供的函式start()啟動程序。可以註冊QStringList處理程序後的引數。 | 命令列引數啟

Linux的程序程式設計-二-程序通訊訊息佇列

1.1         系統V訊息佇列 訊息佇列中的每個訊息都有如下的資料結構: struct msgbuf { long mtype;         // 訊息型別 char mtext[n];      // 訊息內容,n由使用者自己定義 }; 1.1.1      

Linux程序通訊(七)---共享記憶體shmget()、shmat()、shmdt()及其基礎實驗

概述   可以說,共享記憶體是一種最為高效的程序間通訊方式,因為程序可以直接讀寫記憶體,不需要任何資料的複製。為了在多個程序間交換資訊,核心專門留出了一塊記憶體區,這段記憶體區可以由需要訪問的程序將其對映到自己的私有地址空間。因此,程序就可以直接讀寫這一段記憶體區而不需要進

Linux系統程式設計——程序通訊共享記憶體

概述 共享記憶體是程序間通訊中最簡單的方式之一。共享記憶體允許兩個或更多程序訪問同一塊記憶體,就如同 malloc() 函式向不同程序返回了指向同一個實體記憶體區域的指標。當一個程序改變了這塊地址中的內容的時候,其它程序都會察覺到這個更改。 共享記憶體的特點: 1)共

程序通訊IPC機制精煉詳解

一、前期基礎知識儲備IPC定義:IPC是intent-Process Communication的縮寫,含義為程序間通訊或者跨程序通訊,是指兩個程序之間進行資料交換的過程。IPC不是Android所獨有的,任何一個作業系統都需要有相應的IPC機制,比如Windows上可以通過

程序通訊共享記憶體程式碼實現

共享記憶體:1.共享記憶體就是允許兩個不相關的程序訪問同一個邏輯記憶體;                     2.共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種最有效的方式;                     3.不同程序之間共享的記憶體通常安排為同一段

程序通訊PIPE呼叫

看過了高階的popen呼叫之後,我們來了解一下底層的pipe函式。popen函式用過啟動一個shell來解釋請求的命令。而pipe不需要啟動shell來解釋。 #include<unistd.h> int pipe(int file_descriptor[2]

Linux程序通訊——IPC共享記憶體學習筆記

一、什麼是共享記憶體 共享記憶體就是允許兩個不相關的程序訪問同一個邏輯記憶體。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段實體記憶體。程序可以將同一段共享記憶體連線到它們自己的地址空間中,所有

Linux程序通訊--mmap共享記憶體

 共享記憶體可以說是最有用的程序間通訊方式,也是最快的IPC形式。兩個不同程序A、B共享記憶體的意思是,同一塊實體記憶體被對映到程序A、B各自的程序地址空間。程序A可以即時看到程序B對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,

Linux環境程序通訊共享記憶體

共享記憶體簡介 共享記憶體允許兩個或多個程序共享一給定的儲存區。因為資料不需要在客戶程序和伺服器程序之間複製,所以這是最快的一種IPC。共享記憶體的方式有兩種:mmap()系統呼叫和系統V共享記憶體。 mmap()系統呼叫 mmap()系統呼叫使得程序之間通過對映同一個普通

IPC程序通訊訊息佇列

基本概念訊息佇列提供了一個從一個程序向另外一個程序傳送一塊資料的方法。每個資料塊都被認為是有一個型別,接收者程序接收的資料塊可以有不同的型別值。訊息佇列與管道同樣有缺陷,就是每個訊息的最大長度是有上限的(MSGMAX),每個訊息佇列的總的位元組數是有上限的(MSGMNB),系

程序通訊方式——共享記憶體

1.什麼是共享記憶體? 共享記憶體就是允許兩個或多個程序共享一定的儲存區。就如同 malloc() 函式向不同程序返回了指向同一個實體記憶體區域的指標。當一個程序改變了這塊地址中的內容的時候,其它程序

QT程序程序通訊IPC

程序是作業系統的基礎之一。一個程序可以認為是一個正在執行的程式。我們可以把程序當做計算機執行時的一個基礎單位。關於程序的討論已經超出了本章的範疇,現在我們假定你是瞭解這個概念的。 在 Qt 中,我們使用QProcess來表示一個程序。這個類可以允許我們的應用程式開啟一個新的外部程式

Linux程序通訊IPC訊號量詳解與測試用例

學習環境centos6.5 Linux核心2.6 程序間通訊概述 1. 程序通訊機制 一般情況下,系統中執行著大量的程序,而每個程序之間並不是相互獨立的,有些程序之間經常需要互相傳遞訊息。但是每個程序在系統中都有自己的地址空間,作業系統通過頁表