我們先簡(jiǎn)單的了解一下什么是消息隊(duì)列(MSMQ)?消息隊(duì)列是 Windows (NT也有MSMQ WIN / /me/xp不含消息隊(duì)列服務(wù)但是支持客戶端的運(yùn)行)操作系統(tǒng)中通訊的基礎(chǔ) 也是用于創(chuàng)建分布式 松散連接通訊應(yīng)用程序的工具 這些應(yīng)用程序可以通過不同種類的網(wǎng)絡(luò)進(jìn)行通訊 也可以與脫機(jī)的計(jì)算機(jī)通訊 消息隊(duì)列分為用戶創(chuàng)建隊(duì)列和系統(tǒng)隊(duì)列 用戶隊(duì)列分為
成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),涿州網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:涿州等地區(qū)。涿州做網(wǎng)站價(jià)格咨詢:18982081108
· 公共隊(duì)列 在整個(gè)可傳遞消息的 消息隊(duì)列 網(wǎng)絡(luò)中復(fù)制并傳輸 并且有可能由網(wǎng)絡(luò)連接的所有站點(diǎn)訪問
· 專用隊(duì)列 不在整個(gè)網(wǎng)絡(luò)中發(fā)布 相反 它們僅在所駐留的本地計(jì)算機(jī)上可用 專用隊(duì)列只能由知道隊(duì)列的完整路徑名或標(biāo)簽的應(yīng)用程序訪問
· 管理隊(duì)列 包含確認(rèn)在給定 消息隊(duì)列 網(wǎng)絡(luò)中發(fā)送的消息回執(zhí)的消息 指定希望 MessageQueue 組件使用的管理隊(duì)列
· 響應(yīng)隊(duì)列 包含目標(biāo)應(yīng)用程序接收到消息時(shí)返回給發(fā)送應(yīng)用程序的響應(yīng)消息 指定希望 MessageQueue 組件使用的響應(yīng)隊(duì)列
系統(tǒng)隊(duì)列分為
· 日記隊(duì)列 可選地存儲(chǔ)發(fā)送消息的副本和從隊(duì)列中移除的消息副本
· 死信隊(duì)列 存儲(chǔ)無法傳遞或已過期的消息的副本
· 專用系統(tǒng)隊(duì)列 是一系列存儲(chǔ)系統(tǒng)執(zhí)行消息處理操作所需的管理和通知消息的專用隊(duì)列
現(xiàn)在大家對(duì)消息隊(duì)列有了簡(jiǎn)單的了解后 就該進(jìn)入主題了 要使用m *** q進(jìn)行軟件開發(fā)需要安裝m *** q 安裝完后就該進(jìn)入實(shí)際的開發(fā)階段 先打開vs net ide中的 服務(wù)起資源管理器 展開你想建立消息隊(duì)列的計(jì)算機(jī)名 再展開 消息隊(duì)列 右擊它在彈出菜單中選擇 新建 建立一個(gè)新的消息隊(duì)列 并為它指定一個(gè)名字 這個(gè)名字可以隨意 也可以通過編程來完成 代碼如下
system Messaging MessageQueue Create( \Private$\MyPrivateQueue ) 建立專用隊(duì)列System Messaging MessageQueue Create( myMachine\MyQueue ) 建立公共隊(duì)列
其實(shí)我認(rèn)為使用那中方法并不重要 重要的是搞清楚專用隊(duì)列和公共隊(duì)列的差別(其他隊(duì)列不是必須的) 在本例中是通過 服務(wù)器資源管理器 分別在服務(wù)器上建立了專用隊(duì)列和公共隊(duì)列
程序功能 本程序分為兩部分包括服務(wù)器程序(安裝在sql server服務(wù)器上)和客戶端程序 客戶端的作用是用來編寫t sql語句并將t sql語句放在消息中 并將消息發(fā)送到sql server服務(wù)器上的消息隊(duì)列中去 服務(wù)器程序檢查指定的消息隊(duì)列當(dāng)發(fā)現(xiàn)有新消息到達(dá)時(shí) 就開始執(zhí)行消息中的內(nèi)容 由于消息中的內(nèi)容是t sql語句所以服務(wù)器端實(shí)際上是執(zhí)行對(duì)數(shù)據(jù)庫的操作
客戶端程序
public Sub client()Dim tM As New System Messaging MessageQueue()tM Path = \Private$\jk FORMATNAME:PUBLIC= d dc c fd ce d b e d 與指定計(jì)算機(jī)中的消息隊(duì)列建立連接 Dim newMessage As New System Messaging Message(TextBox Text) 接受文本筐的t sql語句newMessage Label = This is the label 消息名字 tM Send(newMessage) 發(fā)送消息End Sub
服務(wù)端程序
public Sub server()Dim NewQueue As New System Messaging MessageQueue( \Private$\jk ) FORMATNAME:PUBLIC= d dc c fd ce d b e d 與指定計(jì)算機(jī)中的消息隊(duì)列建立連接 Dim m As System Messaging Message 查看消息隊(duì)列中的消息m = NewQueue Receive m Formatter = New System Messaging XmlMessageFormatter(New String() { System String mscorlib })Dim st As Stringst = m Body 消息隊(duì)列中消息的消息內(nèi)容 既sql語句Dim con As New OleDb OleDbConnection( 輸入自己的數(shù)據(jù)庫連接字符串 )con Open()Dim As New OleDb OleDbCommand(st con) 執(zhí)行消息中的sql語句 ExecuteNonQuery()con Close()End Sub
我為什么要使用消息隊(duì)列來處理數(shù)據(jù)庫的操作這個(gè)問題我一直沒回答 現(xiàn)在我就來回答這個(gè)問題 在本程序中你會(huì)發(fā)現(xiàn)在sub client()中我并沒連接數(shù)據(jù)庫和請(qǐng)求數(shù)據(jù) 而是通過發(fā)消息來操作數(shù)據(jù)庫的 這個(gè)好處是節(jié)省了兩部分時(shí)間
對(duì)數(shù)據(jù)庫連解請(qǐng)求數(shù)據(jù)的時(shí)間
從數(shù)據(jù)庫返回?cái)?shù)據(jù)的時(shí)間
在很多情況下其實(shí)我們并不需要看見具體的數(shù)據(jù)就知道該怎么修改數(shù)據(jù)庫中的數(shù)據(jù) 例如要?jiǎng)h除張三的記錄 就可以將一條簡(jiǎn)單的刪除語句放入消息中 發(fā)給服務(wù)器讓服務(wù)器程序去處理對(duì)數(shù)據(jù)的更改
此外消息隊(duì)列的另一個(gè)主要用途也就是當(dāng)前erp軟件中必不可少的 就是在斷開連接時(shí)保存信息 當(dāng)連接恢復(fù)時(shí)發(fā)送消息 消息在如下兩種情況中無法迅速地傳遞到它們的隊(duì)列 當(dāng)隊(duì)列駐留的計(jì)算機(jī)無法工作時(shí) 或當(dāng)路由消息所需的域控制器無法工作時(shí) 消息隊(duì)列 可讓您應(yīng)對(duì)這些情況 使得在從網(wǎng)絡(luò)上斷開連接或必要的計(jì)算機(jī)或控制器無法工作時(shí) 仍可以繼續(xù)發(fā)送消息 在這些情形下 消息暫時(shí)存儲(chǔ)在本地計(jì)算機(jī)或傳遞路由上的某個(gè)計(jì)算機(jī)的隊(duì)列中 直到完成傳遞所需的資源重新聯(lián)機(jī)
例如 假設(shè)有一個(gè)記錄所有在出差的銷售人員發(fā)送的訂單的中央隊(duì)列 這些銷售人員每天的大部分時(shí)間都以斷開連接的方式工作 記錄來自客戶站點(diǎn)的訂單信息 并且每天撥號(hào)連接一次 將所有這些信息傳輸?shù)街醒腙?duì)列中 因?yàn)橄⒃诎l(fā)送方斷開連接時(shí)仍可發(fā)送到隊(duì)列 所以銷售人員可以在記錄客戶信息時(shí)立即發(fā)送他們的消息 但系統(tǒng)會(huì)緩存這些消息直到晚間進(jìn)行撥號(hào)連接為止
在斷開連接時(shí)要怎么保存消息呢?向斷開連接的隊(duì)列發(fā)送消息同向可用隊(duì)列發(fā)送消息的過程幾乎完全相同 當(dāng)要向其發(fā)送的隊(duì)列不可用時(shí) 不必進(jìn)行任何特殊的配置以使組件將消息存儲(chǔ)在臨時(shí)隊(duì)列中 在client代碼的tM Path = \Private$\jk 后面有一條注釋語句 其實(shí)這條語句就是實(shí)現(xiàn)向斷開連接的隊(duì)列發(fā)送消息的功能 只要將tM Path = \Private$\jk 這條語句換成tM Path = FORMATNAME:PUBLIC= d dc c fd ce d b e d 其中PUBLIC后面的數(shù)字是要發(fā)送到計(jì)算機(jī)的guid數(shù)字 這個(gè)數(shù)字可以打開那臺(tái)計(jì)算機(jī)的消息隊(duì)列的屬性看見 使用這種方法就可以在斷開連接的情況下保證對(duì)服務(wù)器的操作是有效 現(xiàn)在運(yùn)行這個(gè)程序后 打開win 中的 開始 》 程序 》 管理工具 》 計(jì)算機(jī)管理 在 計(jì)算機(jī)管理 窗口中展開 服務(wù)和應(yīng)用程序 》 消息隊(duì)列 》 傳出隊(duì)列 你將在右邊的窗口中看見你建立的消息 (如果你使用tM Path = \Private$\jk 語句 在 計(jì)算機(jī)管理 窗口中展開 服務(wù)和應(yīng)用程序 》 消息隊(duì)列 》 專用隊(duì)列 可以看見你建立的隊(duì)列 )
其實(shí)消息隊(duì)列的編程并不復(fù)雜 但它在網(wǎng)絡(luò)環(huán)境的程序開發(fā)中是非常有用的 可以簡(jiǎn)化大量的開發(fā)過程和節(jié)省開發(fā)時(shí)間
其實(shí)消息隊(duì)列的編程有很大的靈活性 幾乎可以解決網(wǎng)絡(luò)編程的大部分問題 比如聊天程序 遠(yuǎn)程控制程序
本文針對(duì)消息隊(duì)列做了一個(gè)簡(jiǎn)單的介紹 并舉了一個(gè)例來說明怎么在 net下使用消息編程 達(dá)到快速高效穩(wěn)定的對(duì)數(shù)據(jù)庫進(jìn)行操作 最后補(bǔ)充要說的是在internet中也一樣可以使用消息隊(duì)列 只需要將tM Path = FORMATNAME:PUBLIC= d dc c fd ce d b e d 語句后面的數(shù)字變成消息隊(duì)列所在服務(wù)器的數(shù)字就可以了 但是要提醒大家的是使用消息在傳輸時(shí)將占有大量的帶寬 所以在不是必須的時(shí)候 internet下的編程不要使用消息
lishixinzhi/Article/program/net/201311/15668
ARRAYLIST,
Insert 將元素插入 ArrayList 的指定索引處。
Remove 從 ArrayList 中移除特定對(duì)象的第一個(gè)匹配項(xiàng)。
RemoveAt 移除 ArrayList 的指定索引處的元素。
RemoveRange 從 ArrayList 中移除一定范圍的元素。
Add 將對(duì)象添加到 ArrayList 的結(jié)尾處。
AddRange 將 ICollection 的元素添加到 ArrayList 的末尾。
BinarySearch 已重載。 使用對(duì)分檢索算法在已排序的 ArrayList 或它的一部分中查找特定元素。
Clear 從 ArrayList 中移除所有元素。
Reverse 已重載。 將 ArrayList 或它的一部分中元素的順序反轉(zhuǎn)。
Sort 已重載。 對(duì) ArrayList 或它的一部分中的元素進(jìn)行排序。
IndexOf 已重載。 返回 ArrayList 或它的一部分中某個(gè)值的第一個(gè)匹配項(xiàng)的從零開始的索引。
看了你說遞歸的效率低。那么你可以不用的。
給出的方法就是先生成第一個(gè)排列,然后每次調(diào)用下面的函數(shù)給出下一個(gè)排列,這樣生成的效率很高,這個(gè)函數(shù)可以內(nèi)聯(lián)。
這個(gè)是很經(jīng)典的排列組合算法啊?在網(wǎng)上能搜到一大堆。
大概是那種帶指向的移動(dòng)的算法。我給你搜一個(gè)吧。
我找了幾個(gè),這個(gè)是我覺得說的比較清楚的,你可以仔細(xì)參考一下,看不懂的話再搜點(diǎn)別的好了。。
全排列的算法跟這個(gè)不太一樣的。需要有點(diǎn)改動(dòng)的。
至于語言的話,應(yīng)該不會(huì)有太大問題吧。。basic版的確實(shí)比較少,現(xiàn)在我也比較懶不想動(dòng)手寫。。還是要靠你自己啦。
★生成排列的算法:
比如要生成5,4,3,2,1的全排列,首先找出一個(gè)最小的排列12345, 然后依次調(diào)用n!次STL算法中的next_permutation()即可輸出所有的全排列情況。所以這種算法的細(xì)節(jié)就是STL algorithm中next_permutation()的實(shí)現(xiàn)機(jī)制。詳細(xì)的實(shí)現(xiàn)代碼,大伙可以參考侯捷的《STL源代碼剖析》,在這里我只說一下我的理解:
1 首先從最尾端開始往前尋找兩個(gè)相鄰元素,令第一個(gè)元素為*i,第二個(gè)元素為*ii,且滿足*i*ii,找到這樣一組相鄰的元素后。
2 再從最尾端開始往前檢驗(yàn),找出第一個(gè)大于*i的元素,令為*k,將i,k元素對(duì)調(diào)。
3 再將ii及ii之后的所有元素顛倒排列,此即所求之"下一個(gè)"排列。
prev_permutation()算法的思路也基本相同,只不過它們尋找的"拐點(diǎn)"不同,在next_permutation()算法中尋找的是峰值拐點(diǎn),而在prev_permutation()算法中尋找的是谷值拐點(diǎn)。另外,在第二步中,prev_permutation()要找的是第一個(gè)小于*i的元素而不是第一個(gè)大于*i的元素。
具體例子,有空再舉,現(xiàn)在時(shí)間太晚了:)
★生成組合的算法:
如下面截圖所示,分全組合和r-組合兩種情況。
這里有一段核心代碼:
//--------------------------------------------------------
// Generate next combination (algorithm from Rosen p. 286)
//--------------------------------------------------------
public int[] getNext () {
if (numLeft.equals (total)) {
numLeft = numLeft.subtract (BigInteger.ONE);
return a;
}
int i = r - 1;
while (a[i] == n - r + i) {
i--;
}
a[i] = a[i] + 1;
for (int j = i + 1; j r; j++) {
a[j] = a[i] + j - i;
}
numLeft = numLeft.subtract (BigInteger.ONE);
return a; //這里返回的a數(shù)組,存儲(chǔ)的就是下標(biāo)的排列組合。
}
到這里,也許大伙會(huì)有一個(gè)疑問,假如要求的不是數(shù)字的排列組合,而是字符或字符串的排列組合呢?怎么辦?其實(shí)很簡(jiǎn)單,你只要拿數(shù)組的下標(biāo)來做排列組合,返回他們下標(biāo)的排列組合,然后再到原數(shù)組中讀取字符串值,就可以輸出全部的排列組合結(jié)果。
VB.Net中的隊(duì)列類在System.Collections.Generic命名空間中,名字叫Queue,是一個(gè)泛型類。
實(shí)例化該類:
Dim myQueue As QueueInt32
myQueue = new QueueInt32();
然后可以通過Queue中的Enqueue和Dequeue函數(shù)進(jìn)行入隊(duì)出隊(duì)操作:
With myQueue
.Enqueue(1)
.Enqueue(2)
.Enqueue(3)
.Enqueue(4)
.Enqueue(5)
End With
For i = 0 To 5 Step 1
Console.WriteLine(myQueue.Dequeue())
Next i
顯示結(jié)果:
1
2
3
4
5
如上面所說,你可能還不太了解類、函數(shù)等的作用。
類可以用來封裝一系列操作,或者是一類對(duì)象的特性。像上面的描述,有可能是濫用類了。
建議你這樣,弄一個(gè)專門的運(yùn)算類,里面有四個(gè)運(yùn)算的函數(shù),比如:
Class 運(yùn)算
Shared Function 加(ByVal 加數(shù)1 As Decimal, ByVal 加數(shù)2 As Decimal) As Decimal
'舉個(gè)例子
Return 加數(shù)1 + 加數(shù)2 '百度打不出英文加號(hào),你自己改一下
Exit Function
End Function
Shared Function 減(ByVal 被減數(shù) As Decimal, ByVal 減數(shù) As Decimal) As Decimal
'舉個(gè)例子
Return 被減數(shù) - 減數(shù)
Exit Function
End Function
End Class
上面我寫了兩個(gè)例子,你可以照抄然后自己寫乘除的,總之不要濫用類就行。
PS:Shared函數(shù)的使用不需要類被實(shí)例化,可以直接這樣使用:
Msgbox(運(yùn)算.加(1,2).ToString)
你會(huì)發(fā)現(xiàn)“運(yùn)算”是藍(lán)色的