分類: 網頁設計

開發進銷存、ERP、PDM,物料欄位收集與建立重要性(ERP開發、軟體開發、進銷存)

     品名(物料、零件、產品)在進銷存、MRP、ERP開發時,我們通常可以用一個品名基本檔進行記錄歸檔,品名這個詞包含很多的性質(欄位),在開發商用軟體時,品名基本檔欄位的收集與建立重要性是一個基本關鍵。

timg

  品名或許稱物料這個詞包含很多的性質。我們平常所感受到它的物理屬性、自然屬性,但今天我想要特別談的是它的管理欄位開立的重要性。因為物料除了包含有形的實體外,其實還可以包括服務等無形的東西。在大型管理軟件中,與物料相關的東西,除了他的大小、形狀、重量等之外,還包括了他的價格、它的儲位、它的供應商等等,這些都是它的管理屬性。這些屬性關聯到我們如何有效地去管理它的採購、它的儲存、它的銷售。

    所以一般來說,大型ERP管理軟體對於物料(品名)這樣一個小元素就預留有幾乎近數百個控制項,才可以讓我們窺見這些ERP管理軟體嚴密的錯綜複雜的管理邏輯。
 
  我們可以從四個方面來分解品名物料的管理屬性:
 
  基本屬性
 
物料的基本屬性用於描述物料的設計特徵,這些屬性主要包括物料編碼、物料名稱、物料類型編碼、物料類型名稱、設計圖號、設計版次、生效日期、失效日期、品種規格(牌號、技術規格、技術條件和技術狀態)、默認計量單位、單位重量、重量單位、單位體積和體積單位等。
 
  物料編碼和物料名稱都是物料的標識,物料編碼用於唯一標識物料,而物料名稱用於物料的輔助識別。物料類型編碼和物料類型名稱主要用於物料的統計分析。品種規格屬性描述物料的品牌、規格等信息。
 
  庫存與採購屬性
 
物料的採購和庫存屬性主要描述與採購、庫存管理有關的信息,這些屬性包括物料製購類型、默認倉庫、默認庫位、物料條形碼、是否可用、ABC碼、盤點方式、循環盤點編碼、盤點週期、盤點日期、是否批次管理、批次號、批次有效天數、批次檢測週期、最新入庫日期、最新入庫量、最後出庫日期、最新出庫量、最新檢測日期、最新檢測結果、是否單件管理、是否限額領料、是否允許超採購訂單入庫、現有庫存量、最大庫存量、安全庫存量、物料平均日耗量、庫存金額、是否進價控制、物料計劃單價、進價上限率、默認供應商和在供方使用的編碼等。
 
  任何一家企業可以根據自身特點和條件來對物料的這一屬性進行管控。比如,物料製購類型包括自製件和採購件;企業可以有多個性質不同的倉庫,以便存儲不同的物料;如果公司物料管理方面採用了條形碼管理,那麼,可以在物料條形碼屬性中存儲該物料的條形碼數據。條形碼是否與物料編碼相同或關聯,也由公司的編碼規則確定。
 
  談到庫存,還有一項不可分割的活動就是庫存盤點。庫存盤點是對每一種庫存物料進行清點數量、檢查質量和登記盤點表,且對盤盈盤虧數量進行物料賬面調整、達到物料賬物相符目標的管理過程。批次管理也是生產管理的一種重要手段。當某個物料有存儲有效期限制時,或需要對該物料的每一批物料進行跟踪控制時,可以採用批次管理功能。
 
  計劃類屬性
 
  物料的計劃類屬性主要描述與生產計劃管理相關的信息,這些信息包括確定物料需求的方式和物料需求的各種期量數據。例如,是否獨立需求、補貨政策、補貨週期、訂貨點、訂貨批量、採購或加工提前期、生產已分配量、銷售已分配量、不可用量、庫存可用量、批量政策、批量週期、默認工藝路線編碼、默認工藝路線名稱、是否可以替換、可替換物料編碼以及是否虛擬件等。
 
  銷售類屬性
 
  物料的銷售類屬性主要描述與物料銷售有關的信息,包括銷售價格、銷售人員和銷售類型等內容。例如,銷售計劃價格、計價貨幣、折扣率、是否售價控制、銷價下限率、銷售成本科目、佣金、銷售人員編碼、默認的客戶編碼以及物料在買方使用的編碼等。
 
  以上僅僅是從一個物料,就已經剖析出近百個管理屬性。由此可見一個複雜的ERP管理軟件是有著多麼錯綜複雜的管理網狀結構。 ERP的管理對象的複雜性,需求的多變性決定了我們不可能像引進機器一樣引進ERP,引進ERP的管理思想。它必須立足企業,融入企業自身的管理特徵與管理條件才能發揮作用。


 
  我在多年協助企業導入與量身定做開發ERP管理軟體時,很多企業在考慮實施導入的時候,往往只注重到了他們現有看的到、感覺的欄位屬性,但無論是何種生產類型生產什麼產品,無論企業的規模大小,他們都是根據客戶的需求確定什麼時候生產什麼產品生產多少數量,從而確定什麼時間採購和生產什麼物料,採購和生產多少數量。他們要對供應鏈上的物流、資訊流、資金流進行優化控制和管理,使資源利用最大化。他們都追求共同的目標:最大限度的縮短產品的生產週期和採購提前期,最大限度的降低庫存資金佔用,降低生產成本,準時交貨,提高生產能力,快速響客戶的需求。



  但是決定ERP能否真正能給企業帶來經濟效益的,決定ERP實施成敗的,延展諮詢認為是它的專業屬性。製造業企業隨著他們的生產組織、生產批量、生產產品的不同,其管理需求是不盡相同的。一般ERP軟體產品將製造業企業分為離散製造業和流程工業兩類。又將離散製造分為單件生產、多品種小批量生產、大批量流水生產和大規模定制等四種類型,以及上述類型的混合製造模式。根據客戶定單介入生產過程的不同又分為按庫存生產、按定單裝配、按定單生產和按定單設計的管理模式。比較全面的ERP產品他們通過不同功能的配置可以滿足上述不同需求。但一個ERP產品要想把上述各種各樣的需求都包含在產品裡,那麼這個產品就是一個怪物,譬如我們還是以物料的屬性為例,有些物料的屬性是可以窮舉的,譬如成衣生產的規格;而有一些屬性是無法窮舉的,譬如布匹染廠的,布匹顏色、尺寸大小。所以,ERP產品有強烈的專業性,而對這一點認識和客戶化處理決定企業ERP實施的成敗,所以要導入一個好的成功地ERP管理軟體,必須和企業流程、企業產業特性進行徹底地了解與討論,整理出目前與未來要分析管理的品名欄位,才是一個導入與開發ERP的起始點。


網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen


軟體對企業的價值(軟體開發、軟件開發、客制化軟體)

    這半年,我發覺委託我們開發軟體的客戶,幾乎都再次委託我們進行擴充功能,而且或許值得開心的,除了以往企業管理軟體系統(ERP、進銷存、CRM、POS)等,開始很多客戶為了創造原來產品的價值,開始重視軟體可以帶來的價值。

aa   

    例如,其中一個客戶工業設備空調大廠原本在自有的產品,具有一定的市場競爭性,但客戶董事長,認為如果可以透過軟體來提升使用設備的效益,所以再次委託我們開發軟體,來偵測使用設備的用電量趨勢圖、溫度的變化、散熱效果等,來產生各種圖表、趨勢圖,給客戶不止使用硬體設備,還可以因為使用硬體設備,透過軟體來增加附加價值,給客戶建議用電量使用狀況,而且可以透過軟體管理界面來管理大量的設備,例如批次關閉設備、開啟設備、設定警示音效,當達到某個電量數據、溫度數據,可以發出警報。

    上面我提客戶只是近來一個案例,這個客戶董事長非常有前瞻性思維,他把軟體直接附贈給購買設備的終端客戶,讓原本已經具有競爭性產品設備、更因為軟體的價值,來建立與競爭同業更大的產品優勢,其他競爭廠商還幾乎停留在設備跟價格定價的商業手法。


網智數位-軟體開發(軟件開發)

針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰

業務合作、軟體委外開發

業務窗口:allen@netqna.com

聯繫電話:0920-883-870

公司電話:02-55991310

公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓

skype: netqna

line:netqna

微信:netqna

黃先生 Allen

產品成本計算系統(軟體開發、軟件開發、客製化軟體)

今年7月份由一家多年在越南設廠的文具用品的台商,委外我量身定做開發屬於他們的ERP系統,該廠商在未委外給我開發軟體時,也在其他知名的套裝軟體有多年的使用經驗,但因為市面上的套裝軟體事實上無法真正的負荷他們的流程以及產品與用料成本計價方式,所以透過 Skype 與我洽談很久(談了2個月),確定我們開發團隊可以了解他們目前工廠遇到的問題就正式放心交個我進行開發設計了。


  不過難度比我想象的還複雜,不是一般BOM表可以用來克服成本計算,所有要分析他們所有會產生成本的各種因素,如材料、人力、耗材、製程,下面系統畫面是一個部分使用者操作畫面,可以用來自動計算單一個產品的所有影響成本的統計計算,未來他們就只要填寫報價單,轉正式訂單,系統就會把複雜的成本計算自動算好,帶入報價與訂單系統。


aaa


一個好的軟體系統,可以有效提升企業與工廠內部管理,讓企業專注於客戶接單、產品研發、而流程整合與數據分析就交給好的軟體系統。




網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

紡織業機器設備Arduino 軟體開發、圖控軟體自動化控制

今天我跟公司的研發顧問前往從事多年紡織業的老闆跟協力廠商老闆談如何利用 Arduino 搭配機械手臂的軟體開發,來協助紡織業的生產效率提高與人力成本降低。

 

LINE_ALBUM_AI產生圖_240211_96LINE_ALBUM_AI產生圖_240211_152

 

  在合作對談中硬體整合廠商的研發經理也已經在工研院有多年的硬體驅動開發經驗、而我們網智數位-開發團隊也在 Arduino 軟體開發(台灣第一本Arduino 開發書籍,也是由我們開發1團隊出版多本書籍)與控制、機械手臂、圖控軟體(皆完全量身定做從無開到有發出的圖款軟體產品,目前許多領導廠商都委託我們進行開發)皆有多年的成功案例,開發團隊也跟工研院有多年的影像辨識、自動化控制、PLC控制都有合作。

 

 

   而網智數位-軟體開發團隊的優勢,就是有在商業軟體(ERP、進銷存、MRP、MES、CRM)也有長期涉獵、再結合工業硬體控制經驗,我們可以完全的在商業流程、工廠製程完全地跟客戶討論與建議,如何真正的發揮好的硬體與軟應用的價值。

 

 

我們開發團隊顧問研發的 Arduino 機械手臂在南港展覽的影片介紹

 

 

 

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

企業數位化轉型所依賴的物聯網平台(軟體開發、軟件開發、物聯網開發、智能設備)

     今天我們都知道物聯網在任何化規模企業的轉型中扮演著重要角色,但如果可以透過實行適當的整合現有的物聯網平台資源,那麼就可以在既有的設備資產和IT基礎設施之間充當一座重要的橋樑,例如一家企業可以充分地利用物聯網來改善供應鏈管理和物料資源規劃(MRP)的效率、甚至SCM(供應鏈管理)、上下游資訊系統、訊息傳遞的整合。

LINE_ALBUM_AI產生圖_240211_216LINE_ALBUM_AI產生圖_240211_260

 

     導入與建置企業一個好的物聯網平台,我們必須好好的從頭規劃、重新深思,如何與現有的企業資源規劃(ERP)、MRP(物料需求計劃)、甚至是已有的商業智慧(BI)等系統統統整合起來,才能真正地有效為制定決策的高階主管來提供最有用的洞察力、戰略儀表板,再來用來實施物聯網戰略與部署一個全面的企業應用軟體整合(EAI)專案是一樣複雜與困難地。

       因為由於企業的物聯網現在都備受關注,眾多平台廠商與系統資訊整合廠商正在大力投資於端到端(P to P)解決方案,而這些平台可幫助企業組織連接設備、採集數據、分析趨勢和管理資產。
下面是你可以考慮為物聯網戰略採用的幾個主要平台。

 

微軟(Microsoft)
微軟是少數幾家提供一整套物聯網解決方案的公司之一。 Windows 10物聯網版本可以安裝到資源有限的設備上。運行Windows 10或其他任何操作系統的這些設備很容易連接到Azure物聯網平台。微軟構建了核心服務,可為物聯網提供必要的功能。連接到物聯網Hub的設備可以通過事件Hub攝取數據。 Stream Analytics和HD Insight為傳感器數據提供了大數據和分析功能。 Azure機器學習很容易整合起來,以便對數據流執行預測分析。 Power BI用於儀表板和可視化。微軟還構建了Azure物聯網套件這款客戶可以部署的交鑰匙解決方案。

在此我也要特別強調,近年來網智數位陸續透過微軟的技術與平台,幫台灣的許多行業的領域廠商如工業馬達製造業、工業風扇設備大廠透過微軟平台建置可以同時管理數萬台風扇、建立數位儀錶板、也踏入越南廠商的合作建置 Power BI 的可視化即時圖表軟體。

 

 

IBM
企業物聯網可謂是IBM Watson平台的基石。 IBM是這個市場的早期先行者之一,它將機器學習和認知計算的威力引入到物聯網。 Watson物聯網與Bluemix緊密整合,擁有一整套廣泛的功能。開發人員可以使用SDK和API,自動將設備導入到平台上。 IBM注重區塊鏈,還將幫助客戶將物聯網與基於HyperLedger的新興分佈式賬本技術集成起來。由於最近投入30億美元,IBM對物聯網、認知技術和機器學習寄予厚望。客戶可以訂購基於雲的物聯網服務,也可以在本地部署平台。


亞馬遜(Amazon)

在過去的十年間,亞馬遜網絡服務(AWS)已添加了基礎設施的關鍵構建模塊,包括計算、存儲和數據庫。由於IaaS達到了穩定狀態,AWS於是調整重心,致力於提供充分利用底層構建模塊服務的平台服務。 2014年,亞馬遜收購了2lemetry,這家物聯網初創公司的業務主攻M2M,後來成為了AWS物聯網服務。 AWS物聯網平台充分利用現有的雲服務來提供高級功能。從設備管理到虛擬化,AWS擁有企業需要的一切服務。其服務包括AWS Lambda、亞馬遜EMR、亞馬遜DynamoDB、亞馬遜Redshift、亞馬遜Kinesis以及最近發布的亞馬遜QuickSight,可以處理數據攝取、存儲、處理和可視化。 AWS的現有客戶很容易將物聯網與其云解決方案整合起來。

思科(Cisco)
思科將整個公司押寶於企業物聯網上。由於在數據中心領域有相當大的實力,思科旨在成為物聯網邊緣設備的首選廠商。思科在大力推行其霧計算(Fog Computing)項目,利用其在企業數據中心的傳統強項發力。該公司針對企業物聯網場景優化網絡設備。思科收購Jasper幫助這家公司向電信公司交付一款白標物聯網平台。該平台非常適合跟踪連接至蜂窩網絡的基於SIM的設備。該公司還與英特爾和微軟結為合作夥伴,大力推動邊緣分析方面的創新。

 

平台技術來源整理
reference:Building a Real-Time Device Management System  & Can Alhas

 

 

 

 

 

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

如何利用管理軟體來協助企業的銷售統計和分析(軟體開發、系統分析、管理軟體、客製化軟體)

     一家公司隨著營運的時間越久,所擁有的客戶資料、訂單資料、出貨資料、銷售成本資料等等,這些有價值的資料訊息,如果會很好地透過資訊系統、管理軟體來加以利用與分析,那麼可以有效協助企業進行更有競爭力的營運面向,而今天所謂銷售統計和分析是指對企業實際銷售的事後歸納與產出建議分析,這樣一來不僅可判別實際工廠生產經營是否已達到預期的目標、或者商品買賣利潤是否最大化,而且我們可以透過資訊管理軟體從中可以發現企業營運流程存在的各種問題,例如,實施的策略是否正確、組織機構是否適應、應變措施是否得當等。


240475-140H10JR530


      然而再進行銷售統計分析的依據是具體而準確的每日日常銷售記錄,而好的管理軟體,如 ERP系統就會為各種訂單、出貨記錄資訊進行有效收集和維護,也提供了有力支持。 


  銷售的統計分析可以根據需要採用不同的思考方式來進行,例如我舉例我歷年幫客戶比較常進行的分析項目有大致如下:


       ·分類帳目分析:將分類帳目中所列各種銷售費用帳目的數值,如:運輸費用、委外加工費、差旅費、廣告費、郵電費、網路行銷費用、銷售佣金和特殊費用(如接待費等)進行加總統計,計算出各類費用佔總銷售額的百分比,然後進行分析對比,如:各類費用年內變化情況、各類費用比例與以往不同年度對比、各類費用比例與同行業對比、各類費用之間比例關係對比、歷年費用交叉分析比對等等。


  ·具體銷售功能與成本分析:將分類帳目所列銷售費用帳目按功能分類,然後再予以分析。至於功能如何劃分則常因企業不同而異。


  (一)直接銷售費用:如各門市部、維修服務部的辦公費用、銷售人員工資、差旅費、伙食費等。


  (二)間接銷售費用:如銷售人員的在職教育培訓費用、管理人員的薪水及市場研究費、銷售統計費等。


  (三)其它銷售費用:如廣告費、運輸費、存儲費、分期付款所佔資金的利息等。


  ·市場單位銷售成本分析:將銷售費用按照不同的市場單位進行分析,然後與上述兩類分析進行聯合對比,以分析各類市場對企業經營狀況的影響。市場單位的劃分可採用銷售地區、產品類別、客戶類型、訂貨量的大小等不同方法,要根據需要而定。


  銷售分析必須蒐集各種必要的統計資料。統計報表提供的主要資訊可能包括些許項目:交運資料( 交運地點、日期、交運額)、銷售數量、銷售額、銷售成本、稅務信息,銷售代理商及銷售物料資料等等等。統計的時間範圍一般為 l~5年,可以按年度進行匯總比較,也可以按時段(通常為月度)進行  比較。這是一類時間序列型縱向統計資料,適用於趨勢分析。


統計的口徑根據不同的目標可選用:按客戶分類統計、按銷售代理分類統計、按銷售物料代碼分類統計、按銷售地區代碼分類統計、按市場領域進行分類統計(如行業分類) 以及按交運日期、地點等分類統計。分類統計的目的是為了進行橫向比較分析,以利於進行市場研究決策、制訂銷售戰略。


 

  銷售統計報表的資料不僅與SD模塊有關,而且還依賴於成本核算中的各種開票接口資訊。因而,銷售統計報表不但反映了實際銷售完成的情況、檢驗計劃的合理性,而且還有利於分析銷售管理的投入產出關係,進行各種策略下的盈虧分析。如:增加廣告宣傳費用對銷售的影響、採用效益掛鉤或數量折扣政策對銷售的影響等。



(其他參考文章)
MPS主生產計畫專文介紹(一)
MRPⅡ/ERP 能力需求計畫原理
庫存管理-概念與釐清
庫存管理探討-VMI
真正的庫存量形成探討
庫存管理的中樞控管法則(上)
庫存管理的中樞控管法則(下)
BOM表管理與設定﹣輔料是否需輸入BOM
何謂 進銷存、ERP、WMS?三者差異性【軟體開發、軟件開發、程式設計】
ERP 產品成本管理與計算
庫存量正確性衡量法則
粗能力需求計畫(RCCP) – 專文介紹
如何利用軟體來協助企業銷售統計和分析



網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

在.Net 透過 Parallel 類別操控多任務平行作業(二)【軟體開發、軟體設計、系統開發、客製化軟體】

    這篇主要是再次講解 Parallel 類別並行作業的其他支援方法,主要是延續上一篇教學文章 3-1.透過 Parallel 類別操控多任務平行作業(一)。 

    這邊我將透過WPF專案實作一個使用 Parallel.ForEach 方法來支援的循環平行作業任務,它的概念就好比我們常在寫的 for(i=0;i<=10;i++)、或 foreach 迴圈,只是Parallel 類別是充分利用多個處理器、多個核心同時進行作業,執行速度當然效率就快很多。



步驟1:

在 Visual Studio 一樣建立一個WPF 專案

wpf

步驟2:

在 MainWindows.xmal 界面設計成如下結果

parellel

主要是使用了 3個 textbox 控制項,用於讓使用者輸入 資料夾路徑 、想建立的檔案數量、以及每個檔案的大小,再來使用一個 button 按鈕(開始執行 Parallel.Foreach 多任務運算), 來撰寫主要的 並行作業邏輯程式碼。


xaml 程式碼部分畫面
xaml2


步驟3:

在 Button.Click 事件撰寫主要程式碼


程式碼如下:

private void OnClick(object sender, RoutedEventArgs e)
{
     if (string.IsNullOrWhiteSpace(txtDir.Text))
     {
         MessageBox.Show(“請輸入目標存放文件的資料夾!!");
         return;
     }


    //如果目標資料夾不存在,就建立一個新的資料夾
     if (!Directory.Exists(txtDir.Text))
     {
         Directory.CreateDirectory(txtDir.Text);
     }


    int fileNum = 0;
     if (!int.TryParse(txtFileNum.Text, out fileNum))
     {
         MessageBox.Show(“請輸入檔案的數量!!"); return;
     }


    long fileSize = 0L;
     if (long.TryParse(txtSize.Text, out fileSize) == false)
     {
         MessageBox.Show(“請輸入預計每個檔案的大小!!");
         return;
     }


    //記錄要產生新的檔案名稱清單
     List<string> fileNames = new List<string>();


    for (int n = 0; n < fileNum; n++)
     {
         //檔案名稱
         string _filename = “file_" + (n + 1).ToString();


        //資料夾的絕對路徑
         string _dirpath = System.IO.Path.GetFullPath(txtDir.Text);


        //新的檔案的完整路徑
         string fullPath = System.IO.Path.Combine(_dirpath, _filename);


        //加入清單
         fileNames.Add(fullPath);
     }


    txtDisplay.Clear();


    //宣告一個Random 亂書產生器,目的待會用來產生每個檔案的隨機內容
     Random rand = new Random();


    //宣告一個 Action 委派任務,來產生每個檔案與檔案內容
     Action<string> act = (file) =>
         {
             FileInfo fileInfo = new FileInfo(file);


            //如果文件已經存在,就把它刪除
             if (fileInfo.Exists)
                 fileInfo.Delete();


            //開始進行隨機寫入內容
             byte[] buffer = new byte[fileSize];
             rand.NextBytes(buffer);


            using (FileStream fs = fileInfo.Create())
             {
                 BinaryWriter sw = new BinaryWriter(fs);
                 sw.Write(buffer);
                 sw.Close();
                 sw.Dispose();
             }


            //顯示執行結果
             string msg = string.Format(“檔案{0}已經建立完成!!\n", fileInfo.Name);
             this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => txtDisplay.AppendText(msg)));


        };


    //開始進行 Parallel 的循環平行任務作業
     Parallel.ForEach<string>(fileNames, act);


}



重點程式碼講解:

1.使用 Random rand = new Random();  ,來隨機產生每個檔案的內容。

2.宣告一個 Action 委派任務,來產生每個檔案與檔案內容。

Action<string> act = (file) =>
     {
         FileInfo fileInfo = new FileInfo(file);


        //如果文件已經存在,就把它刪除
         if (fileInfo.Exists)
             fileInfo.Delete();


        //開始進行隨機寫入內容
         byte[] buffer = new byte[fileSize];
         rand.NextBytes(buffer);


        using (FileStream fs = fileInfo.Create())
         {
             BinaryWriter sw = new BinaryWriter(fs);
             sw.Write(buffer);
             sw.Close();
             sw.Dispose();
         }


        //顯示執行結果
         string msg = string.Format(“檔案{0}已經建立完成!!\n", fileInfo.Name);
         this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => txtDisplay.AppendText(msg)));


    };

3.使用 Parallel.ForEach<string> 來開始進行 Parallel 的循環平行任務作業。

參考文章

C#多工作業與平行處理技術講解

1.透過 Thread 類別撰寫多執行緒多工作業。

2.透過 Delegate 委託支援的方法,撰寫非同步任務。

3-1.透過 Parallel 類別操控多任務平行作業(一)。

3-2. 透過 Parallel 類別操控多任務平行作業(二)。
4.使用 Task 自行控制非同步任務作業。
5.在非同步作業時,如何取消非同步任務。
6.多執行緒多任務存取相同變數,但卻各自隔離保留各自任務的值。
7.非同步存取變數的問題。
8.非同步資源鎖定解決方式。




網智數位-軟體開發(軟件開發)

針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

在.Net 透過 Parallel 類別操控多任務平行作業(一)【軟體開發、軟體設計、系統開發】

   此篇文章主要是延續之前的文章 【C#多工作業與平行處理技術講解】,講解與實作如何在利用強大的 透過 Parallel 類別支援的方法,撰寫非同步任務,這裡一樣我會透過簡單程式碼進行實作教學。


   在並行任務與建立一個新的執行緒過程來執行一個非同步作業的操作是非常相似地,但是在這邊的並行任務卻是可以更好地發揮多個CPU處理器或者多核心處理器的強大優勢,進而充分地利用CPU的可用資源來執行非同步作業任務,更方便地是,在 .Net 並行任務的操作過程被封裝地很好,身為程式開發人員只需要調用呼叫對應的類別與相關成員方法就可以很輕鬆地建立與執行並行任務了,至於任務是在那個CPU處理器執行,操作系統的底層會自動進行調用配置。


    在這邊我使用一個 WPF 的專案範例進行講解,來說明如何利用 .Net 的 Parallel 類別執行非同步作業。


步驟一 :

在 Visual Studio 2017 建立一個 WPF 專案,

wpf


步驟二:

在 主要的 MainWindow.xaml 畫面,用xaml 語法宣告了一下界面結果


2017-07-08_17-12-48


主要是有 提供 3 個讓使用者輸入整數值的 TextBox , 以及對應 3 個顯示執行結果的 TextBlock ,還有一個 Button (執行 Parallel 運算平行任務)的按鈕。


部分xaml 語法如下:

xaml

步驟三:

在 Button 的 Clieck 事件,進行撰寫主要的核心程式碼邏輯….

(Code)

private void OnClick(object sender, RoutedEventArgs e)
{
     int num1 = default(int);
     if (!int.TryParse(txtInput1.Text, out num1))
     {
         MessageBox.Show(“輸入第一個正整數值:");
         return;
     }
     int num2 = default(int);
     if (!int.TryParse(txtInput2.Text, out num2))
     {
         MessageBox.Show(“輸入第二個正整數值:");
         return;
     }
     int num3 = default(int);
     if (!int.TryParse(txtInput3.Text, out num3))
     {
         MessageBox.Show(“輸入第三個正整數值:");
         return;
     }


    //宣告第一個並行作業的委派實體
     Action act1 = () =>
         {
             int sum = 0;
             for (int x = 1; x <= num1; x++)
             {
                 sum += x;
             }


            //顯示執行結果
             this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => run1.Text = sum.ToString()));
         };


    //宣告第二個並行作業的委派實體
     Action act2 = () =>
     {
         int sum = 0;
         for (int x = 1; x <= num2; x++)
         {
             sum += x;
         }


        //顯示執行結果
         this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => run2.Text = sum.ToString()));
     };


    //宣告第三個並行作業的委派實體
     Action act3 = () =>
     {
         int sum = 0;
         for (int x = 1; x <= num3; x++)
         {
             sum += x;
         }


        //顯示執行結果
         this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => run3.Text = sum.ToString()));
     };



    //使用 Parallel 類別來執行 並行任務
     Parallel.Invoke(act1, act2, act3);


}


程式碼重點講解:

1.這邊我主要用了 3 個 Action 的委派實體,分別用來進行整數的累加運算任務。

2.使用了 Dispatcher.BeginInvoke() 方法,和Windows Form 專案一樣,WPF 在平行作業模式下,也分為主UI的主執行緒,和多個任務的各別執行緒,而在任務的執行緒要改變主執行緒控管的主畫面下,必須透過 Dispatcher.BeginInvoke ,在不會發生一個 UnauthorizedAccessException 例外錯誤。

3.也是最重要的程式碼邏輯,利用 Parallel類別的 Invoke 方法呼叫,分別傳入多個委派實體,在這邊我宣告了3個 Action 委派實體,我一次傳入 Parallel.Invoke(act1,act2,act3), 這樣程式就自動進行3個平行作業任務了。


參考文章
C#多工作業與平行處理技術講解
1.透過 Thread 類別撰寫多執行緒多工作業。
2.透過 Delegate 委託支援的方法,撰寫非同步任務。
3-1.透過 Parallel 類別操控多任務平行作業(一)。
3-2. 透過 Parallel 類別操控多任務平行作業(二)。
4.使用 Task 自行控制非同步任務作業。
5.在非同步作業時,如何取消非同步任務。
6.多執行緒多任務存取相同變數,但卻各自隔離保留各自任務的值。
7.非同步存取變數的問題。
8.非同步資源鎖定解決方式。



網智數位-軟體開發(軟件開發)

針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

透過 Delegate 委託支援的方法,撰寫非同步任務(軟體開發、客製化軟體、系統設計)

      此篇文章主要是延續之前的文章 【C#多工作業與平行處理技術講解】,講解與實作如何在利用強大的 透過 Delegate 委託支援的方法,撰寫非同步任務,這裡一樣我會透過簡單程式碼進行實作教學。

       在.Net 平台的委派類型(Delegate)自身就可以很容易地使用非同步作業,因為只要是委派(Delegate)類型都一點有 BeginInvoke 以及對應的 EndInvoke() 這 2 個非同步操作方法,所以我們就可以非常容易地透過 委派實體 直接 使用非同步任務。

      在這邊我一樣使用 Windows Form 來做示範(因為比較單純可以講解程式技巧,所以不要問我為何不用 ASP.NET MVC),整個實作範例畫面為如下圖:


繪圖


步驟1 :

在 Visual Studio 新增一個 Windows Form 專案,我們準備拖拉幾個控制箱來達成 主要結果畫面,分別有

Label 控制箱 (Text = 基數)、Button 按鈕控制箱(Text = 進行計算作業 , Name = btnDelegateInvoke)、ProgressBar控制箱(用於顯示非同步作業的進度)、TextBox 文字方塊(Name = txtResult , 用於顯示執行計算結果)。

步驟 2:

在 Button 控制箱 (name = btnDelegateInvoke)的 Click 事件,撰寫主要核心代碼:

private void btnDelegateInvoke_Click(object sender, EventArgs e)
{
     int baseNum = default(int);
     if (!int.TryParse(txtBaseNum.Text, out baseNum))
     {
         MessageBox.Show(“請輸入一個正整數哦!");
         return;
     }


    txtResult.Clear();


    // 顯示進度表的狀態
     IProgress<int> progressReporter = new Progress<int>((p) =>
     {
         this.progressBar1.Value = p;
     });


    //  計算階乘的委派實體
     Func<int, BigInteger> ComputeNumValueAction = (bsNum) =>
         {
             BigInteger bi = new BigInteger(1);
             for (int i = 1; i <= bsNum; i++)
             {
                 bi *= i; //相乘
                 // 用於計算目前進度
                 double ps = Convert.ToDouble(i) / Convert.ToDouble(bsNum) * 100d;
                 progressReporter.Report(Convert.ToInt32(ps));
             }
             return bi;
         };


    // 開始呼叫使用
     btnDelegateInvoke.Enabled = false;
     ComputeNumValueAction.BeginInvoke(baseNum, new AsyncCallback(FinishedCallback), ComputeNumValueAction);


}


2017-07-06_01-01-56


程式碼邏輯講解:

1.在 Progress<T> 是實現 IProgress<T> 介面,所以這裡可以透過它支援的 Report()方法來報告目前非同步的操作進度數據,該對象在進度更新後,是允許使用者直接繼續操作主畫面的,例如拖拉。


2.Func<int,BigInteger> 委派,代表自身帶有一個 int 類型的參數,而返回的值類型為 BigInteger,這邊我特別用 BigInteger 類型,因為在計算階乘的計算結果,可能數字會非常大,會超出 long 類型的最大值。


3.在開始進行使用 委派(Delegate)支援的BeginInvoke方法時,必須再使用一個 AsyncCallback 委派,該委派主要是用於綁定一個方法,在檔非同步任務完成時,可以呼叫的回調方法,並且再回調方法中,再次調用 Delegate.EndInvoke方法來捕捉計算結果。


我們直接看 AsyncCallback 綁定的 FinishedCallback 方法。


private void FinishedCallback(IAsyncResult ar)
{
     // 取出委派變數
     Func<int, BigInteger> action = (Func<int, BigInteger>)ar.AsyncState;
     // 求得計算結果
     BigInteger res = action.EndInvoke(ar);
     this.BeginInvoke(new Action(() =>
     {
         btnDelegateInvoke.Enabled = true;
         // 顯示計算結果
         txtResult.Text = string.Format(“計算結果:{0}", res);
     }));
}


ddd



上述程式碼撰寫完畢後,就可以編譯執行,在 基數欄位輸入一個正整數,就可以進行非同步的計算階乘作業。





參考文章

C#多工作業與平行處理技術講解

1.透過 Thread 類別撰寫多執行緒多工作業。

2.透過 Delegate 委託支援的方法,撰寫非同步任務。

3.透過 Parallel 類別操控多任務平行作業。

4.使用 Task 自行控制非同步任務作業。

5.在非同步作業時,如何取消非同步任務。

6.多執行緒多任務存取相同變數,但卻各自隔離保留各自任務的值。

7.非同步存取變數的問題。

8.非同步資源鎖定解決方式。





網智數位-軟體開發(軟件開發)

針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna

黃先生 Allen

     

在 .Net 透過 Thread 類別撰寫多執行緒多工作業【軟體開發、軟件開發、客製化軟體】

     此篇文章主要是延續上一篇 【C#多工作業與平行處理技術講解】,講解與實作如何在利用強大的 Thread 類別,使用 C# 來撰寫多執行緒多工作業功能。

在 .Net 平台中 Thread 類別位於 System.Threading 命名空間中,此類別封裝了多執行緒許多方法與功能,可以讓我們快速建立新的執行緒,進而在新的執行緒執行所需要的程式碼邏輯,在我們建立一個 Thread 的實例(Instance)時,需要透過一個委派(Delegate)與新建立的 Thread 實例和一個現有的方法(Method)進行綁定,當執行緒(Thread)啟動後,就會立即執行這個綁定的方法。

傳遞給 Thead 的建構子的委派(Delegate)有 2 種,一種是不帶任何參數的委派方法;第二種是可以帶一個 object 參數的委派方法。在我們實體化 Thread 物件後,就可以開始調用 Thread.Start()方法,來啟動執行緒(也會開始執行綁定的方法),而在執行過程隨時可以調用 Thread.Abort()方法,來強制終止執行緒的執行,不過這個 Abort()方法會引發一個 ThreadStateException 例外錯誤。

現在我就帶一個實際範例來是示範如何 用 C# 使用 Thread 類別,建立一個執行緒作業,這邊為了簡單講解觀念,我使用最簡單的 Windows Form 專案來講解。

Step 1. 透過 Visual Studio 2017(舊版本 2015/2013/2012都行啦)新增一個 Windows Form 專案

2017-07-02_23-33-29

Step 2.在 Step 1建立的 Windos  Form 專案後,會產生一個 Form1的界面表單,打開此表單,然後從工具箱拖拉一個 ProgressBar 控制箱到 Form1 畫面,並排好版面。

step2

     Step 3. 從工具箱在拖拉一個 Button 到 Form1 的畫面,並將 name 屬性命名為 btnTread , Text 修改為【Thread 執行緒 啟動】step3

 Step 4. 在 Form1.cs 後置程式碼裡,我撰寫了一個 DoWok() 方法,裡面撰寫了一下邏輯,程式碼如下:

/// <summary>
/// 此方法將會透過委派(Delegate)指定給新的執行緒(Thread)
/// </summary>
private void DoWork()
{
  int p = 0;

  while (p < 100)
  {
    p++;
    Thread.Sleep(100);

    //更新進度表
    this.BeginInvoke(new Action(() =>
    {
       this.progressBar1.Value = p;
    }));
  }

  this.BeginInvoke(new Action(delegate ()
  {
   //再次啟用按鈕狀態
   btnTreadStart.Enabled = true;
   //重設定進度表為 0
   progressBar1.Value = 0;
   //顯示執行緒已完成
   MessageBox.Show(“執行緒已完成。", “執行緒已完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
  }));

}

step4

Step 5. 在 Form1 的 Button 按鈕,雙擊滑鼠 (button1_Click),在button1_Click 事件我撰寫了 核心的 操控 Thread 程式碼

private void button1_Click(object sender, EventArgs e)
{

  //宣告一個 Thread 類別,並將在傳入 Step 4 所宣告的 DoWord 方法
  //待會 Thead 執行時,就會立即執行 DoWord 方法
  Thread newThread = new Thread(DoWork);

  //停用按鈕
  btnTreadStart.Enabled = false;

  //啟用新的執行緒
  newThread.Start();

}

step5

Step 6. Compile 編譯執行(執行F5),就可以看到結果

step 5-1

step 5-2

 

程式碼補充解釋:
因為基於執行緒的安全考量和包含使用者界面完整性,一般而言,系統是限制跨執行緒去更新修改使用者界面,所以在 Step 4 的 DoWokd方法,我透過呼叫 this.BeginInvoke() 方法傳遞一個 委派,使得可以在使用者界面的主執行緒上面進行更新使用者界面的控制箱(ProgressBar1),所以可以看到進度表一直不斷更新。

透過這一篇文章希望可以說明如何利用 Thread 類別來操作多執行作業,後續我還會抽出時間講解不同的非同步多工作業方式,分成不同的文章來一一描述。

 

 

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen