程序架構規劃? |
缺席
|
Eigen
初階會員 發表:19 回覆:36 積分:26 註冊:2002-12-05 發送簡訊給我 |
這是設備廠商提供的範例程式,主要就是 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 發送簡訊給我 |
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); } |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |