自動化控制之執行緒池的使用

2022-01-12 05:33:17 字數 3773 閱讀 3140

昨天反編譯看了公司專案首席架構師實現的執行緒池。非常之驚訝,在沒有.net 4可用的年代。那思想和那技術是相當的可以啊。佩服。

這裡說的執行緒池是乙個類我總覺得這樣叫有點不名副其實。其實就是乙個類內部實現了fifo佇列,把臨時資料放到這個佇列裡,「執行緒池類」按照入隊的先後次序觸發乙個負責解析校驗等的事件,並且把資料傳遞個這個事件。

好了,上**:

/// /// 自定義執行緒池類,不依賴.net queue實現了先進先出處理佇列裡資料

///

public class corethreadpool : idisposable

public pooldata(object data)

public pooldata(corethreadpool.poolcommand cmd)

}protected enum poolcommand

protected safefilehandle complateport;

/// /// 執行緒池主線程

///

protected thread thread;

protected volatile bool isopened;

[method: compilergenerated]

[compilergenerated]

public event actionexceute;

[method: compilergenerated]

[compilergenerated]

public event actionexitexceute;

/// /// 執行緒池是否正在執行

///

public bool isopened

set}

[dllimport("kernel32.dll", charset = charset.auto, setlasterror = true)]

private static extern safefilehandle createiocompletionport(intptr filehandle, intptr existingcompletionport, intptr completionkey, uint numberofconcurrentthreads);

[dllimport("kernel32.dll", charset = charset.auto, setlasterror = true)]

[dllimport("kernel32", charset = charset.auto)]

/// /// 啟動執行緒池的主線程

///

public void start()

complateport = createiocompletionport(new intptr(-1), intptr.zero, intptr.zero, 0u);

if (complateport.isinvalid)

", marshal.getlastwin32error().tostring()));

}thread = new thread(new parameterizedthreadstart(this.run));

thread.start(complateport);

}/// /// 外部提交資料物件到佇列

///

///

public void post(object data)

/// /// 執行緒池主線程執行邏輯

///

///

private void run(object completionportid)

raiseexecute(pooldata.data);}}

raiseexitexecute("執行緒池已經停止。");

isopened = false;

thread = null;

}/// /// 觸發execute事件

///

///

private void raiseexecute(object data)

/// /// 觸發exitexecute事件

///

///

private void raiseexitexecute(object data)

/// /// 結束執行緒池主線程

///

public void stop()

/// /// 內部提交資料到執行緒池佇列中

///

///

private void postdata(pooldata data)

gchandle value = gchandle.alloc(data);

postqueuedcompletionstatus(complateport, (uint)intptr.size, intptr.zero, gchandle.tointptr(value));

}public void dispose()}}

**亮點:佇列是使用作業系統的,使用windows api實現的。牛吧。

由於現在專案已經依賴.net 4了。於是進行了模仿,經過一番測試,發現差不多,不過還是覺得在多執行緒環境下使用 concurrentqueue會更好些呢。

/// /// 自定義執行緒池類,使用concurrentqueue實現了先進先出處理佇列裡資料

///

public class coolthreadpool

}public event actionexceute;

public event action stopedexceute;

/// /// 啟動執行緒池的主線程

///

public void start()

thread = new thread(run);

thread.start();

isopened = thread != null;

}/// /// 執行緒池主線程執行邏輯

///

private void run()

else break;

}isopened = false;

thread = null;

raisestopedexceute();

}/// /// 觸發execute事件

///

///

private void raiseexecute(t data)

/// /// 觸發停止execute事件

///

///

private void raisestopedexceute()

/// /// 結束執行緒池主線程

///

public void stop()

/// /// 外部提交資料物件到佇列

///

///

public void post(t data)

/// /// 內部提交資料到執行緒池佇列中

///

///

private void postdata(t data)

public void dispose()}}

測試**:

自動化控制 術語匯

1.rfid radio frequency identification devices 無線射頻識別裝置 2.plc programable logic controller 可程式設計邏輯控制器 3.servo 伺服 伺服電機的簡稱,屬於電機的一種,由伺服驅動器控制其工作。4.伺服系統 根據自...

python自動化 控制手機

python os庫和subprocess庫 python提供了os庫可以訪問系統資源,也能執行系統命令.這就和上面的adb連起來了.比如下面是我寫的一些adb方法 def click ok os.system adb path adb shell input keyevent 23 time.sl...

對自動化控制的理解

在自動化控制領域,控制的模式可能很相似,像我現在實習公司的系統,可以分成資料採集,和資料處理兩個部分。對於資料的採集,主要通過前置機完成,和前置機相聯接的是許多電力裝置,這些電力裝置根據國家標準採用不同的協議向前置機傳送資料,在電力行業中有令牌協議,104協議等等。他們好像管這些協議叫做規約。這些硬...