最近做一個從網卡取資料包并實時更新到視窗上的程式,現在在更新到子視窗時遇到困難。
首先,我跟成熟的工具對比過,抓到的包應該沒有遺漏。
把抓到的包決議后存到一個動態陣列,然后在各個子視窗中實時去取最后一個資料然后更新,發現不同步。我用了兩種方法都有問題。
第一,我有一個抓資料包的執行緒組,每個監聽的埠都對應一個執行緒去獲取包,存入動態陣列,然后把動態資料指標存入到相應的TLIST組里,TLIST組是臨界區,用對應的分析執行緒去取TLIST,也就是說每個監聽的埠有兩個執行緒,一個取包,一個分析包并顯示出來。當只監聽一個埠時,幾乎感覺不到有問題。但是監聽兩個到三個埠時就有問題了,明顯延遲并且在顯示時丟了資料,而且這個方法在多個視窗顯示時問題更明顯,我估計是臨界區的原因。因為某些視窗不重繪這個資料了,我猜這是某些執行緒取不到資料了。
第二,不設分析執行緒和臨界區,只設抓包的執行緒組,把包存到動態資料里,然后在每個需要更新的指視窗里用TTimer組件去動態陣列里取資料,每次用Length函式來獲取動態資料的長度,再取最后一個資料,這種方法貌似好點(都是肉眼觀察),但依然存在資料更新不及時。
所以想請教一個思路,怎樣在多個子視窗去更新抓到的這個資料包?
uj5u.com熱心網友回復:
不知道是不是多個執行緒共享資料導致的問題,嘗試一下執行緒安全的TThreadList。uj5u.com熱心網友回復:
要使用資料庫包(池)技術。uj5u.com熱心網友回復:
可否提供一些資料或者鏈接參考一下
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59110.html
標籤:VCL組件開發及應用
下一篇:怎么提取資料里的內容
