全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1194
推到 Plurk!
推到 Facebook!

程序架構規劃?

缺席
Eigen
初階會員


發表:19
回覆:36
積分:26
註冊:2002-12-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-11-08 11:32:30 IP:59.125.xxx.xxx 訂閱
這是設備廠商提供的範例程式,主要就是 DeviceInit()
DeviceCreateRxThread()
CreateThread()
RxThread() 最後會產生一個執行緒
範例會抓取設備傳來的資料,再用 printf 顯示在螢幕上。

我將整個程式改寫到 BCB 上,我建一個 form_main, 利用 button 來執行 DeviceInit()
並且刪除了 RxThread()中 printf 的程式,整個compile 都會過。


※重點在於,我要抓取設備的資料,並做相對應的處理。
所以我又建了一個 form_data ,用來顯示抓取到的資料、處理過的資料
我又宣告一個非常大的全域變數
RxThread 抓取到的資料,經過處理後,會丟到 全域變數
form_data 從 全域變數 中抓取資料,處理後再顯示在 form_data 之中。
這中間的程序傳遞、資料的傳遞,應該怎麼處理會比較好?
整個資料的流量最快會到達 100k 筆/ 每秒,我覺得以現在電腦的速度來看,資料並不算快、也不多
但是我在RxThread()收到資料後,立刻更新 form_main 上面的 label->Caption ,資料量卻會多到讓畫面亂碼。
處理程序上我也覺得我寫的不好,我是在 form_data 上使用 timer,每一秒去 全域變數 內將資料抓出來顯示、整理。
總覺得有更好的處理方式,但是我就是想不到。
請教一下,資料的傳遞應該朝什麼方向做效率會比較好?程式架構會比較完整性高?
我對我目前寫出來的東西,感覺是東拼西措出來的。(上不了台面)

ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-12-14 09:40:51 IP:122.147.xxx.xxx 訂閱
1) 初步看你的問題,我覺得你主要是想把從printf 輸出的資訊改寫在TLabel 上顯示
如果不想改寫廠商提供的程式,那可以考慮使用 CreatePipe , 將printf 的輸出導向至 Pipe 再取出來顯示,如範例所示

2) TLabel 以100k 筆/ 每秒 更新要一直重繪耗費資源,用於顯示可以偷吃步,以人眼所及的範圍內顯示即可(看起來有流暢就行了)

3) 也可以使用memory-mapped file



AnsiString __fastcall RunDosCommand(AnsiString sCmdline)
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
SECURITY_ATTRIBUTES sa;
HANDLE hReadPipe ;
HANDLE hWritePipe;
AnsiString sOutput,sBuffer;
long ret;
bool sPipe;
unsigned long lngBytesRead;
char cBuffer[256];
ZeroMemory( &si, sizeof(si) );
ZeroMemory( &sa, sizeof(sa) );
ZeroMemory( &pi, sizeof(pi) );
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
sPipe=CreatePipe(&hReadPipe, &hWritePipe,&sa, 0); //Create Pipe
if (!sPipe)
{
sOutput="CreatePipe failed. Error: " AnsiString(GetLastError());
return sOutput;
}
si.cb = sizeof(STARTUPINFOA);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.hStdOutput = hWritePipe;
si.hStdError = hWritePipe;
si.wShowWindow = SW_HIDE;
sBuffer = sCmdline;
ret =CreateProcess(NULL, sBuffer.c_str(), &sa, &sa, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
if (ret == 0)
{
sOutput="Bad command or filename";
return sOutput;
}
CloseHandle(hWritePipe);
frmMain->lblOutput->Caption = String(cBuffer);
Application->ProcessMessages();
} while (ret != 0 );
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hReadPipe);
}

編輯記錄
ddy 重新編輯於 2010-12-13 18:42:22, 註解 無‧
ddy 重新編輯於 2010-12-13 18:42:41, 註解 無‧
系統時間:2024-03-29 13:35:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!