昨天反編譯看了公司專案首席架構師實現的執行緒池。非常之驚訝,在沒有.net 4可用的年代。那思想和那技術是相當的可以啊。佩服。
這裡說的執行緒池是乙個類我總覺得這樣叫有點不名副其實。其實就是乙個類內部實現了fifo佇列,把臨時資料放到這個佇列裡,「執行緒池類」按照入隊的先後次序觸發乙個負責解析校驗等的事件,並且把資料傳遞個這個事件。
好了,上**:
/// /// 自定義執行緒池類,不依賴.net queue實現了先進先出處理佇列裡資料**亮點:佇列是使用作業系統的,使用windows api實現的。牛吧。///
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()}}
由於現在專案已經依賴.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協議等等。他們好像管這些協議叫做規約。這些硬...