Qt 與外部exe程序間通訊 共享記憶體

2021-08-22 02:36:20 字數 1673 閱讀 3603

一、程序間通訊的方法:

本質上就是建立聯絡。分為訊息傳遞(比如通過作業系統的訊息機制,把程序1的訊息傳遞給程序2)。另一種是共享儲存區域(比如共享記憶體,讀寫同乙個磁碟檔案,資料庫表等等)。訊息傳遞在我看來暫時只知道是通過作業系統的訊息機制來實現的,而作業系統的訊息機制內容較多(參考文獻:windows訊息機制 )。共享儲存區域或檔案的關鍵就是共享同乙個檔案,同時需要做到不斷的訪問,或者其他方式來判斷(還不清楚,只會用不斷訪問的方法)。

二、共享記憶體方法簡單介紹

1、基於qt的qsharedmemory類 

2、步驟:

程序a建立或分配共享記憶體,設定唯一的key來是識別該共享記憶體(該key會唯一標識一段共享記憶體,其背後的原理和作業系統的共享記憶體機制有關,並且不同的系統,其銷毀共享記憶體的條件也不一樣)。

鎖定共享記憶體,進行寫入操作。

解鎖共享記憶體。

程序b通過給qsharememory的物件設定於程序a一樣的key來建立聯絡,實現共享同一記憶體。

attach()到該共享記憶體,並且鎖定共享記憶體,進行讀入操作。

解鎖共享記憶體,並detach()該共享記憶體。

釋放共享記憶體--在window系統下,detach()函式在最後乙個程序下會釋放記憶體。

參考文件:qsharedmemory 共享記憶體 程序間通訊

三、**實現

程序a

//方法:共享記憶體的方法。

if (null == m_prkwebviewsharedmemory)

// 判斷該sm物件是否attch()該記憶體,是就解除

if (m_prkwebviewsharedmemory->isattached())

//寫入共享記憶體資料

char *from = qstrid.tolocal8bit().data();

m_prkwebviewsharedmemory->create(qstrid.tolocal8bit().size());

m_prkwebviewsharedmemory->lock();

char *to = (char*)m_prkwebviewsharedmemory->data();

memcpy(to ,from ,qstrid.tolocal8bit().size());

m_prkwebviewsharedmemory->unlock();

程序b 

//定時器的槽函式:實現不斷讀取共享記憶體,以判斷共享記憶體是否有新資料

void slotscanningsharedmemory()

//先讓sm物件attch()到共享記憶體

if (!m_psharedmemory->attach(qsharedmemory::readonly))

//從共享記憶體中讀取資料

m_psharedmemory->lock();

qbytearray buffer;

buffer.setrawdata((char*)m_psharedmemory->data(), m_psharedmemory->size());

qstring qstrhouseid = qstring(buffer);

m_psharedmemory->unlock();

//解除attch

m_psharedmemory->detach();

}

qt 程序間通訊

qt中仍可以利用傳統的程序間通訊方式 共享記憶體.在桌面環境中,在傳統的程序間通訊方式的基礎上發展了更為方便的物件導向的通訊方式 kde環境 dcop gnome環境 bonobo dbus freedesktop開源專案的linux ipc通訊機制,kde和gnome環境都能支援 qt embed...

qt 程序間通訊

qt中仍可以利用傳統的程序間通訊方式 共享記憶體.在桌面環境中,在傳統的程序間通訊方式的基礎上發展了更為方便的物件導向的通訊方式 kde環境 dcop gnome環境 bonobo dbus freedesktop開源專案的linux ipc通訊機制,kde和gnome環境都能支援 qt embed...

Qt程序間通訊

程序間通訊,就是在不同程序之間傳播或交換資訊。管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 named pipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semophor...