使用微軟訊息佇列實現C 程序間通訊(二)

2021-05-11 13:54:51 字數 1696 閱讀 1489

列表e

messageenumerator enumerator = queue.getmessageenumerator2();

while (enumerator.movenext())

enumerator.removecurrent(); 

在使用getmessageenumerator2方法時,還要考慮另外乙個問題,即你要訪問佇列中增加的任何新訊息,即使它們是在你呼叫getmessageenumerator2後再增加的。這假定新訊息被新增到佇列末尾。

如果你只希望返回佇列中的第一條訊息,你應該使用messagequeue.receive方法。這個方法會領取佇列中的第一條訊息,在這個過程中將它從佇列中刪除。由於訊息在讀取的時候被刪除,你可以確保你的程序是唯一收到訊息的程序。receive方法的應用實例如列表f所示。

列表fsystem.messaging.message message = queue.receive(); 

可以用peek方法代替receive方法。peek方法像receive方法一樣領取佇列中的第一條訊息;但是,它在佇列中保留訊息備份。這允許你從佇列中刪除訊息之前檢查訊息內容。peek的語法與receive類似。

列表gsystem.messaging.message message = queue.peek(); 

傳送/接收序列化物件

雖然給佇列傳送文字的功能非常有用,但佇列還允許你傳送可序列化物件。這意味著你可以建立乙個自定義的.net類,例項化它的乙個例項,將其傳送給佇列以便其它應用程式使用。要完成這個過程,首先得使用xml serializer序列化被傳送的物件,然後對序列化物件放到訊息的正文中。

例如,假設我們希望給techrepublic訊息佇列傳送以下物件(列表h):

列表h[serializable()]

publicclassmessagecontent

privatedatetime _creationdate = datetime.now;

privatestring _messagetext;

public messagecontent()

public messagecontent(string messagetext)

_messagetext = messagetext;

publicstring messagetext

get

set

publicdatetime creationdate

get

set

給佇列傳送這個物件的乙個例項只需簡單呼叫messagequeue.send方法,並把乙個物件例項作為引數提交給這個方法。列表i說明了這種情況。

列表imessagecontent message = newmessagecontent("hello world!");

queue.send(message, "sample message"); 

如你所見,上面的**類似於我們前面傳送正文為乙個字串的訊息時使用的**。接收乙個包含序列化物件的訊息更加困難一些。我們需要告訴訊息它包含哪種物件。

為向訊息指出它包含哪種物件,我們必須建立訊息的格式化器(formatter)。給訊息的formatter屬性指定乙個 system.messaging.xmlmessageformatter物件即可建立格式化器。由於我們的訊息包含乙個messagecontent 物件,我們希望為它配置xmlmessageformatter。

C 使用SendMessage實現程序間通訊的方法

為了深入理解訊息機制,先來做乙個測試專案 在新建專案的form1的 中,加入方法 protected override void defwndproc ref message m else base.defwndproc ref m 此方法重寫了窗體的訊息截獲 執行後會發現,滑鼠一移向窗體就會彈窗 ...

C 程序間通訊 訊息佇列

訊息佇列是訊息的鏈結表,包括posix訊息佇列system v訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。訊息佇列a include include include ...

Linux訊息佇列實現程序間通訊

什麼是訊息佇列 訊息佇列提供了從乙個程序向另乙個程序傳送乙個有型別資料塊的方法。用這種方法可以避免命名管道的同步和阻塞問題。訊息佇列是基於訊息的,而管道是基於位元組流的,並且訊息佇列的讀取不一定是先入先出。訊息佇列的操作 訊息佇列的建立或者獲取 int msgget key t key,int ms...