軟體開發(軟件開發)

網智數位主要提供套裝及客製化的軟體系統解決方案,專為客戶量身訂做客製化的軟體,達成客製化、智慧化及網路化的管理功能。

室內設計、裝潢、窗簾報價估算軟體

網智數位主要提供套裝及客製化的軟體系統解決方案,針對室內設計師、木工、裝潢業產業,量身訂做客製化的軟體,達成客製化、智慧化及網路化的商用軟體。

商用軟體-客製化設計

網智數位主要提供套裝及客製化的軟體系統解決方案,專為客戶量身訂做客製化的軟體,達成客製化、智慧化及網路化的管理功能。

IOT 物聯網-系統開發

根據客戶實際狀況,結合雲端與載具進行客製化物聯網IOT導入與軟體開發

雲端VPS虛擬主機租用

我們的雲端VPS虛擬主機是採用雲端(虛擬化)技術所開發之全新雲端伺服器服務,可以選擇多種作業系統(Windows、Linux等),客戶可載入自訂的應用環境,執行自己所要提供的網路服務,我們的雲端服務可為您的網站提供最完美的解決方案。

ERP軟體客製化導入

ERP軟體客製化導入,室內設計、營造業、裝潢、木作工程、系統櫃工程、會計系統,全面提升公司管理營運效率。

搜尋引擎最佳化SEO

搜尋引擎最佳化(SEO)不僅能提高網站在搜尋結果的排名,更能帶來大量對我們產品或服務真正有需求的訪客。SEO 最棒的特質之一就是不像廣告一樣亂槍打鳥而導致用戶的反感,反而更能提升點閱率跟成交率喔。

服務宗旨

網智數位主要提供套裝及客製化的軟體系統解決方案,專為客戶量身訂做客製化的軟體,達成客製化、智慧化及網路化的管理功能。

我們的成立宗旨就是要以最猛的IT技術讓這個世界更Smart,在我們貫徹我們裡想的同時,我們希望可以把我們所開發的系統帶給台灣的中小企業,除了要推薦好的東西之外,我們也希望做點改變,所以我們的第一目標就是要使用最好用的系統再加上您寶貴的創意,不僅僅可以節省你大量的荷包,還可以有一個像樣的網站。我們可以幫你做的有

企業管理
  • 策略管理
  • 目標管理
  • 行銷管理
  • 財會管理
  • ERP導入
  • 企業流程自訂
資訊管理
  • 網站架設
  • 虛擬化/雲端架設
  • 主機代管
  • 私有雲建制與導入
軟體開發
  • UML設計
  • 版本控管
  • 企業軟體開發
  • APP開發
  • 網頁設計
資訊安全
  • 網頁弱點掃描
  • 主機弱點掃描
  • 木馬檢測
  • 資安鑑識
  • 設計網路架構
  • 資安監控
行銷
  • 關鍵字SEO
  • 社群網路行銷
  • 部落格行銷
  • FaceBook 粉絲團
其他
  • 協助企業申請Google Email
好玩工具開發

講出你的創意吧!沒有甚麼是資訊辦不到的

顯示具有 技術 標籤的文章。 顯示所有文章
顯示具有 技術 標籤的文章。 顯示所有文章

2022年12月20日 星期二

紅外線異常監測 & 放電檢測報告 & 機電線材報價系統

    感謝新竹科技大廠 聯合機電股份有限公司 以及 啟洋科技工程股份有限公司  因為多次洽談合作,因為專業的信任 給網智數位軟體開發團隊 陸續進行開發 紅外線異常監測、紅外線異常統計表、紅外線異常趨勢圖、以及許多自動化統計報表,異常與檢測報告管理系統機電線材報價系統 ,也讓我們開發團隊更深入了 機電公司 的營運作業流程與產業知識。






          








    

    而服務了該知名產業公司後,更深深發覺客戶主管的經驗與機電專業知識、線材、環境感測專業水準,讓 Allen 我更有使命傳遞公司的企業價值,就是專業服務、與客戶共同努力透過 IT 資訊科技的技術、軟體研發能力,盡可能協助各產業客戶完成系統化管理、數字化管理、智慧化管理。
        【客戶介紹】 啟洋科技工程股份有限公司除了擁有優異的專業技術,能勝任各種高難度工程外,其豐富的經驗、用心的服務與完善的公司制度及人員組織,為客戶提供以最佳的事前規劃與售後服務,更以24小時待命狀態,立即支援客戶施予緊急搶修,以維護生產線之有效運轉,堅持專業技術並提供客戶具有競爭力的服務,是啟洋公司達成企業雙贏的基本理念,也正是您諮商洽詢、安心託付的最佳系統工程專業團隊,更是您信賴的最佳伙伴。



網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫行動號碼:0920-883-870
黃先生 Allen

2018年11月21日 星期三

Android APP 非同步下載圖片實作(背景服務)-APP開發教學

  此篇文章主要是示範教學如何開發Android APP時,利用背景服務來進行比較耗時的工作,使得使用者可以不會覺得APP停頓當掉的錯覺。

   背景服務程式(背景執行緒)主要在比較複雜的APP應用程式,它在執行運作時,例如從網路下載檔案、讀取後端資料庫的資料、讀取手機記憶卡的資料時,會需要較多時間,所以系統畫面沒辦法即時回應,甚至出現【應用程式沒有回應】的對話視窗,詢問使用者是否繼續等待或結束APP程式。

 

    而透過在背後另外建立自己的執行緒,去獨立執行比較耗時的工作任務,跟主畫面的執行緒沒有關聯,完全不會影響主畫面的更新與停頓狀態.

     這類性質的工作就適合利用 Android API 提供的 AyncTask 執行緒.

下面我在 res/laylout 設計一個簡單的APP主畫

繪圖

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#607D8B">

<!-- 顯示圖片的元件 -->

<ImageView

android:id="@+id/imageview"

android:layout_width="match_parent"

android:layout_height="match_parent" />

<!-- 開始下載圖片的按鈕元件 -->

<Button

android:id="@+id/download_btn"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentTop="true"

android:layout_margin="6sp"

android:onClick="clickDownLoadButton"

android:text="背後執行下載圖片"

android:textSize="24sp" />

<LinearLayout

android:id="@+id/op_panel"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBottom="@id/imageview"

android:layout_centerInParent="true"

android:background="@drawable/operation_drawable"

android:orientation="horizontal"

android:padding="6sp"

android:visibility="invisible">

<!-- 顯示前一張圖片 -->

<ImageButton

android:id="@+id/previous"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="1"

android:onClick="clickMoveButton"

android:src="@drawable/ic_keyboard_arrow_left_white_48dp" />

<!-- 顯示下一張圖片 -->

<ImageButton

android:id="@+id/next"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="1"

android:onClick="clickMoveButton"

android:src="@drawable/ic_keyboard_arrow_right_white_48dp" />

</LinearLayout>

</RelativeLayout>



程式解說:

上面主要畫面配置檔,提供一個按鈕,可以下載7張圖片,並將下載的圖片依序可以輪流顯示每張圖片,每張圖片都是透過背後執行緒進行下載,檔執行任務完成後,在將 LinearLayout容器顯示出來,這個容器很簡單放入兩個 ImageButton ,用來切換上一

張與下一張圖片。

現在回到 Java 主程式,宣告一個繼承

AppCompatActivity 的類別,

public class AsyncTaskDemo extends AppCompatActivity {

private ImageView imageview;

private LinearLayout op_panel;

private Bitmap[] images;

// 目前畫面顯示的圖片編號

private int position = 0;

// 顯示下載進度用的進度對話框

private ProgressDialog progressDialog;




程式解說:

在上面主要宣告幾個欄位 Fields , 用來對應之前的配置畫面元件,還有 Bitmap[] 陣列,存放下載的圖片,以及一個進度用的是從 PrgressDialog。

然後重點在 Button 圖片下載的程式碼邏輯:

public void clickDownLoadButton(View view) {

// 這邊可以讓下載按鈕消失

findViewById(R.id.download_btn).setVisibility(View.INVISIBLE);

// 建立下載圖片的AsyncTask物件

final DownloadImageTask downloadImageTask = new DownloadImageTask();

// 顯示 進度對話框

progressDialog = new ProgressDialog(this);

progressDialog.setTitle("Download");

progressDialog.setMessage("Please wait for download...");

progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

progressDialog.setProgress(0);

progressDialog.setCancelable(false);

// 加入取消工作的按鈕

progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel",

new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

// 取消AsyncTask的工作,參數指定為true,表示取消正在執行的工作

// 呼叫這個方法的AsyncTask物件,在結束doInBackground方法後,

// 不會呼叫onPostExecute方法,改為呼叫onCancelled方法

downloadImageTask.cancel(true);

}

});

// 顯示進度對話框

progressDialog.show();

// 啟動AsyncTask物件

downloadImageTask.execute();

}



上面程式主要宣告一個 DownloadImageTask ,
這個程式主要是繼承了 AsyncTask 類別

// 呼叫這個物件的execute方法後就會執行這個方法

// 參數是AsyncTask泛型指定的第一個型態的陣列

@Override

protected Void doInBackground(Void... args) {

// 讀取陣列資源,下載的圖片名稱

Resources res = getResources();

String[] imageNames =

res.getStringArray(R.array.android_icons_array);

// 讀取儲存圖片的網路位置

String baseUrl = getString(R.string.base_url);

// 設定進度對話框的最大進度數量

progressDialog.setMax(imageNames.length);

for (int i = 0; i < imageNames.length; i++) {

// 判斷是否取消工作

if (isCancelled()) {

break;

}

// 下載圖片的完整網址

String url = baseUrl + imageNames[i];

// 從網際網路下載圖片

downloads.add(loadBitmap(url));

// 執行進度處理,參數會傳送給onProgressUpdate方法

publishProgress(i + 1);

}

// 如果已經下載圖片

if (downloads.size() > 0) {

// 建立儲存圖片的Bitmap陣列

images = new Bitmap[downloads.size()];

// 把List物件轉換為陣列

downloads.toArray(images);

}

return null;

}



  

// 執行進度處理,參數是AsyncTask泛型指定的第二個型態的陣列

// 在doInBackground方法中,呼叫publishProgress方法後,

// 就會執行這個方法並接收放在publishProgress方法中的參數

@Override

protected void onProgressUpdate(Integer... values) {

// 設定進度對話框的進度

progressDialog.setProgress(values[0]);

// 設定ImageView使用的ImageView物件

imageview.setImageBitmap(downloads.get(downloads.size() - 1));

}

// doInBackground方法結束後就會執行這個方法

// 參數是AsyncTask泛型指定的第三個型態的陣列

// 接收doInBackground方法的回傳值

@Override

protected void onPostExecute(Void result) {

// 結束進度對話框

progressDialog.dismiss();

// 設定ImageView使用的ImageView物件

imageview.setImageBitmap(images[0]);

// 顯示上下張圖片的操作按鈕

op_panel.setVisibility(View.VISIBLE);

}

// 呼叫cancel方法後執行這個方法

// 參數是AsyncTask泛型指定的第三個型態的陣列

// 接收doInBackground方法的回傳值

@Override

protected void onCancelled(Void result) {

if (images != null) {

// 設定ImageView使用的ImageView物件

imageview.setImageBitmap(images[0]);

// 顯示上下張圖片的操作按鈕

op_panel.setVisibility(View.VISIBLE);

}

}

完成上面所有程式,就完成一個非同步的下載圖片實作案例,這邊我是預期看這篇實作教學的本身對 Android 開發有一定的經驗,如果對於這篇教學有任何問題,可以寄發郵件向我詢問。

程式執行結果

繪圖2

繪圖3


  





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

2018年7月25日 星期三

Xamarin 跨平台程式開發-訊息傳遞 - 軟體開發 教學

   在 Xamarin 開發 IOS、Android、UWP APP時,常常會遇到訊息接受與訊息傳遞,那麼這邊我想簡單示範如何在 Xamarin 實作一個訂閱訊息程式開發技巧。

Android 執行結果畫面
螢幕快照 2018-07-25 下午10.27.43螢幕快照 2018-07-25 下午10.28.49螢幕快照 2018-07-25 下午10.29.10


   Xamarin 透過 MessagingCenter 這個靜態類別來支援訂閱/通知訊息,這個類別主要需要知道三個 Methods ,分別為 Subscribe<TSender, TArgs> 與 Send<TSender, TArgs>、Unsubscribe<TSender, TArgs>。
Subscribe<TSender, TArgs> 方法用來訂閱訊息,當有訊息接受到時,可以通知使用者,例如出現對話訊息、畫面顯示訊息。
Send<TSender, TArgs> 方法用來通知訊息,已告知那些訂閱訊息者。
Unsubscribe<TSender, TArgs> 原先進行訂閱訊息接受,現在進行取消訂閱,後續如果有訊息通知,都不進行接受訊息。


程式範例示範
image

public class MainPageViewModel
    {
        public ObservableCollection<string> Greetings { get; set; }


        public MainPageViewModel ()
         {
            Greetings = new ObservableCollection<string> ();


           MessagingCenter.Subscribe<MainPage> (this, "哈嘍", (sender) => {
                Greetings.Add("哈嘍");
             });


            MessagingCenter.Subscribe<MainPage, string> (this, "哈嘍", (sender, arg) => {
                Greetings.Add("哈嘍 " + arg);
            });

        }
    }

在上面程式範例 宣告 一個 MainPageViewModel Class,這個作為 ViewModel 用途,在建構式裡實作訂閱服務,這個機制可以減少程式物件耦合度。


下面這行程式碼,主要是用於實作一個名叫 “哈嘍”的訂閱服務  MessagingCenter.Subscribe<MainPage> (this, "哈嘍", (sender) => {  Greetings.Add("哈嘍"); });





在底下的主程式 MainPage ,實作訂閱通知服務,主要程式邏輯,我透過註解程式說明

public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();


            //這邊我綁定一個ViewModel
            BindingContext = new MainPageViewModel();


            //宣告一個按鈕物件,當點選按鈕時,觸發一個發送訊息
            var button1 = new Button { Text = "Say 哈嘍" };
            button1.Clicked += (sender, e) =>
            {
                MessagingCenter.Send<MainPage>(this, "哈嘍");
            };


            //宣告一個按鈕物件,當點選按鈕時,觸發一個發送訊息,並傳遞內容參數,傳遞的內容是 Allen 

            var button2 = new Button { Text = "Say Hi to Allen" };
            button2.Clicked += (sender, e) =>
            {
                MessagingCenter.Send<MainPage, string>(this, "哈嘍", "Allen");
            };


            //宣告一個按鈕物件,當點選按鈕時,觸發一個取消訂閱服務,並取消對話視窗訊息!
            var button3 = new Button { Text = "取消訂閱服務,並取消對話視窗訊息!" };
            button3.Clicked += (sender, e) =>
            {
                MessagingCenter.Unsubscribe<MainPage, string>(this, "哈嘍");
                 DisplayAlert("取消訂閱服務",
                    "This page has stopped listening, so no more alerts; however the ViewModel is still receiving messages.",
                    "OK");
             };


            //訂閱服務(背後的ViewModel還是仍然保持本身實作的訂閱服務),並出現對話視窗訊息
            MessagingCenter.Subscribe<MainPage, string>(this, "哈嘍", (sender, arg) =>
            {
                DisplayAlert("訊息已接受", "參數訊息 為 " + arg, "OK");
            });

            //綁定接受到的訂閱訊息
            var listView = new ListView();
             listView.SetBinding(ListView.ItemsSourceProperty, "Greetings");

            //放置物件內容
            Content = new StackLayout
             {
                Padding = new Thickness(0, 20, 0, 0),
                Children = { button1, button2, button3, listView }
            };
        }




在 iPhone X 執行畫面如下
螢幕快照 2018-07-25 下午10.20.29螢幕快照 2018-07-25 下午10.20.46






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

2017年9月5日 星期二

在非同步作業時,如何取消非同步任務(軟體開發、程式設計、軟件開發)

      在之前我寫過一篇關於用 Task 類別來撰寫非同步化作業(使用 Task 自行控制非同步任務作業),來利用多CPU、多核心處理器的優勢,這樣可以避免某些邏輯需要較長的時間去執行,而造成主界面程式停頓卡卡,讓使用者誤以為當機、或程式有問題,所以透過.Net 的 Task 任務,可以讓系統自行的調度限制可以用的執行緒(Thread)。

   既然有了 Task 任務類別的支援,可以讓我們輕易的撰寫多工、非同步作業的程式,讓長時間執行的程式透過另外一個執行緒(Thread)在背後執行,例如我常幫工廠或企業寫物料需求計算(MRP、MPS計算)、業績獎金計算、APS先進排程規劃,這些都是需要執行讀取大量的系統資料來進行運算,這就可以充分利用 ThradTask的技術再背後另外一個執行緒去執行,使用者,在前端主畫面還可以繼續執行其他作業,而不用只能等待程式執行完畢。
    不過我們也常常遇到常時間執行的程式,我們可以提供一個按鈕讓使用者去選擇【取消】背後執行的任務,那麼這篇技術文章我就是想講解,如何在.Net 平台取消非同步化作業的任務 ,.net 平台裡有個類別專門跟 Task 、Task<TResult> 類別搭配使用,使得完成取消非同步任務作業的執行,這個類別就是 CancellationTokenSource 類別

我在這邊一樣透過 Step By Step 來建立一個範例程式,來說明整個程式的撰寫技巧…


1.這邊我簡單為了好示範,我建立一個 Windows Form 視窗專案,命名為 CancellationTokenSource_Demo,如下圖:

繪圖

2.在 Form1 表單,我設計了一下畫面
繪圖2
在Form1表單,我為了示範,所以放置了2個 Label (分別顯示 輸入一個正整數、運算結果顯示),2個 Button 按鈕(分別為 進行運算、取消非同步任務),還有一個 ProgressBar (作用於非同步任務執行時,可以顯示進度條狀態)。

3.在 Form1.cs 的後端程式,是最重要的,我把程式標註註解,這樣大家就可以容易理解了。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }


    /// <summary>
    /// 宣告一個 用於支援取消非同步任務的變數
    /// </summary>
    private CancellationTokenSource cts = null;


    private void btnCalc_Click(object sender, EventArgs e)
    {
        //取得的正整數
        int currNum = 0;
        if (!int.TryParse(txtInputInt.Text, out currNum))
        {
            MessageBox.Show("必須輸入一個正整數數字!");
            return;
        }


        //清楚執行結果
        txtFinalResult.Clear();


        btnStartCalc.Enabled = false; //將【進行運算】按鈕啟用狀態取消
        btnCancel.Enabled = true; //將【取消非同步任務】按鈕啟用狀態啟用


        //用於顯示報告進度條的變數
        IProgress<int> progRpt = new Progress<int>((p) =>
        {
            this.progressBar1.Value = p;
        });


        //如果 CancellationTokenSource 物件變數不是為 null , 比較進行釋放(務必)
        if (cts != null)
         {
            cts.Dispose();
        }


        //實體化 CancellationTokenSource 物件
        cts = new CancellationTokenSource();


        //宣告一個任務變數
        Task<string> task = new Task<string>(() =>
        {
            BigInteger bint = new BigInteger(1d);
            double totalProgress = (double)currNum;


            //如果CancellationTokenSource 物件的 IsCancellationRequested 值為 true ,代表使用者已經將非同步任務進行取消
            for (int i = 1; i <= currNum && !cts.IsCancellationRequested; i++)
            {
                 bint *= i; //相乘
                double progressVal = Convert.ToDouble(i) / totalProgress * 100d;


                //顯示非同步任務執行的進度表
                progRpt.Report(Convert.ToInt32(progressVal));
            }


            //傳回執行結果
            return bint.ToString();


        }, cts.Token, TaskCreationOptions.LongRunning);

        //開始執行非同步任務
        task.Start();


        //等待任務操作完成,等待1秒
        while (!task.Wait(1000))
        {
            Application.DoEvents();
        }


        //顯示運算結果
        txtFinalResult.Text = task.Result;
        btnStartCalc.Enabled = true;
        btnCancel.Enabled = false;
    }


    private void btnCancel_Click(object sender, EventArgs e)
    {
         //使用者執行取消非同步任務
        if (cts != null)
        {
             cts.Cancel();
        }
    }
}


1
2
3

4

4.經過步驟3核心程式碼後,就可以編譯執行,執行結果畫面如下:
4-1.
執行運算中…
r1

4-2.
中途,我執行【取消非同步任務】按鈕
r2
完成上述這樣的示範,就可以撰寫讓使用者中途取消任務的執行。


參考文章
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

2017年7月8日 星期六

在.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

2017年7月6日 星期四

透過 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-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
     

2017年7月3日 星期一

在 .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 類別來操作多執行作業,後續我還會抽出時間講解不同的非同步多工作業方式,分成不同的文章來一一描述。



參考文章
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


2017年5月26日 星期五

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

    在現行 CPU 都是多核心的、甚至多顆 CPU 硬體條件下,在我們開發軟體撰寫程式時,就可以好好利用多工作業、平行處理、非同步模型了,所以這次我想好好介紹一下,如何在 .Net C# 平台環境下,撰寫多執行緒平行作業與非同步 程式撰寫技巧與概念。




   
     以往軟體操作使用者,在執行比較耗時的作業時,例如需要大量運算、影像處理等,系統主要使用畫面很容易出現"卡主"、"頓頓"、"當機的感覺",這個很容易造成使用者的抱怨,認為應用程式已經當機,甚至沒有耐心地到【工作管理員】來強制將應用程式關閉,但事實上這會導致造成兩個影響層面,一是,原本應用程式要執行的功能操作,沒有徹底執行完成;二是,如果應用程式一旦被強制關閉時,有可能造成資料的遺失,例如在執行會計系統轉帳功能時,如果只轉部分資料成功、或者盤點作業更新大量庫存成本與數量時,被強制關閉,這時候的資料有可能造成遺失(當然我在開發時這類型,我會用交易處理(Transaction)進行Commit與Rollback,這是另外議題,有機會再來談),所以如果我們可以在需要執行耗時的作業時,就必須考慮使用非同步作業(多工作業、平行處理)技術來撰寫程式,當將比較耗時的作業任務放到另外一個執行緒(Thread),這樣在執行複雜耗時作業時,不會影響到主要的使用者界面(因為使用者界面是另外一個獨立的執行緒),所以使用者可以繼續點選界面、用滑鼠拖移視窗表單都可以,這樣就不會出現卡卡的、要當機的假象。

    原理解釋,當一個使用者執行一個執行檔程式(.exe)時,程序指令就會自動加載到記憶體中去執行,這個就是所謂的應用程式的實例(Instance),而在操作系統中被稱為"Process 行程(大陸用語為 進程 )",Process 與 Process 互相獨立隔離,A Process 不會影響到 B Process 的執行,而每個 Process 又可以包含多個 Thread(執行緒,大陸用語為 線程)。一個 Process 都至少包含一個 Thread (執行緒/線程),主要的 Thread 我們又稱為 Main Thread (主執行緒),當主執行緒被結束終止時,Process(行程/進程)也會跟隨之被關閉,整個應用程式就會被關閉結束。


    經過我上面的解釋,希望讀者可以比較清楚 非同步作業(多工、平行處理)的好處,但是說實在我專案經歷也不淺,跟不同程式開發人員合作也非常頻繁,真正可以把多工平行處理寫得好的真的也算少數,因為本身控制非同步的邏輯思考以及資源鎖定釋放就必須深入的進行了解各種程式技術,不過身為 .Net 開發陣營的我,已經覺得非常幸福,因為 .Net 框架已經把非同步、多工作業封裝成相關類別,程式開發人員不必花太多時間去管理執行緒的底層模型,我們只有好好地學會如何使用這些類別,就可以把多執行緒多工作業寫得很好。


那麼,我想分幾篇文章來講解如何使用 .Net C# 支援的撰寫技巧來介紹,非同步作業的實作方式



以上我會另外花時間各自寫文章來敘述與實作......





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



    
這封郵件來自 Evernote。Evernote 是您專屬的工作空間,免費下載 Evernote

2017年1月7日 星期六

VR/AR 軟體開發 ,CES國際展覽

      今天下午客戶傳訊息給我,告知我們參與開發的 VR/AR 虛擬實境管理軟體,在國際的 CES(全球最大科技展消費性電子展(CES)) 進行展覽,事實上看到這段國際展覽影片還滿開心,公司團隊開發的產品能夠幫助客戶在CES展覽有幫助,也是一點點的小成就感,希望網智數位-開發團隊,在各開發領域能夠繼續一直不斷向前、研發能力也能夠繼續突破,用資訊技術幫客戶達到各種企業競爭力、整合能力。

article-586f03d485601


  下列的 VR / AR 互動控制,就是我司團隊參與軟體開發
https://www.youtube.com/watch?v=PWiRs86DuKk






網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870 

公司電話:02-5599-1310
skype: netqna
line:netqna
微信:netqna
黃先生 Allen