關於兩時間相差問題 |
答題得分者是:gemi0305
|
流
中階會員 發表:36 回覆:142 積分:70 註冊:2003-07-24 發送簡訊給我 |
|
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
計時的功能:
< class="code"> TDateTime start;
//-------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
start=Now();
}
//-------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Label1->Caption=(Now()-start).FormatString("hh:nn:ss");
} 國泰平安
|
流
中階會員 發表:36 回覆:142 積分:70 註冊:2003-07-24 發送簡訊給我 |
|
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
流 您好:
試試看這個方法: LARGE_INTEGER litmp; double frq, Tfrq1, Tfrq2, Value; String SecStr; inline TStart() { QueryPerformanceFrequency(&litmp); frq=litmp.QuadPart; QueryPerformanceCounter(&litmp); Tfrq1=litmp.QuadPart; } inline TEnd() { QueryPerformanceCounter(&litmp); Tfrq2=litmp.QuadPart; //1.39682557420007E-6 Value=((Tfrq2-Tfrq1)/frq)-1.3E-6; SecStr.sprintf(".6f", Value); } 把TStart() 貼到開始記錄量測時間的位置,把TEnd()貼到貼到結束記錄量測時 間的位置,然後秀出SecStr就好囉 ^^ /*開心的事情別隱藏在心裡,分享給別人知道會更快樂的*/ /*得到新知識別隱藏在心裡,分享給別人了解會更清楚的*/發表人 - axsoft 於 2003/08/28 18:39:53 |
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
|
流
中階會員 發表:36 回覆:142 積分:70 註冊:2003-07-24 發送簡訊給我 |
axsoft前輩您好: 小弟不知為何您給的code無法使用,出現以下錯誤 [C Error] Unit1.cpp(24): E2092 Storage class 'inline' is not allowed here
[C Error] Unit1.cpp(25): E2092 Storage class 'static' is not allowed here
[C Error] Unit1.cpp(25): E2141 Declaration syntax error
[C Error] Unit1.cpp(33): E2139 Declaration missing ;
[C Error] Unit1.cpp(33): E2190 Unexpected } 重覆兩次,分別是 inline TStart()、inline TEnd()
小弟對inline這部份不了解,是否編譯時我該加上什麼呢 gemi0305 前輩您好: 您說每個物件屬性裡都有 tag,型態是int
不曉得前輩知道 tag 的這個整數型態是否有上限,
小弟在help裡沒查到,因為怕如果整數太大時
不知道會不會對程式有什麼影響,例如當機或是出現錯誤
如果會,那小弟會再做別的權宜辦法
例如當 tag > 特定值,某數會加 1 , tag 再重頭計時
從您製作的範例中,小弟似乎有點領悟,知道該怎麼著手了 感謝兩位前輩熱情的回答
|
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
引言: axsoft前輩您好: 小弟不知為何您給的code無法使用,出現以下錯誤 [C Error] Unit1.cpp(24): E2092 Storage class 'inline' is not allowed here [C Error] Unit1.cpp(25): E2092 Storage class 'static' is not allowed here [C Error] Unit1.cpp(25): E2141 Declaration syntax error [C Error] Unit1.cpp(33): E2139 Declaration missing ; [C Error] Unit1.cpp(33): E2190 Unexpected } 重覆兩次,分別是 inline TStart()、inline TEnd() 小弟對inline這部份不了解,是否編譯時我該加上什麼呢流您好: 試試看可不可以編譯,我在C Builder 5下正常無誤的工作 //--------------------------------------------------------------------------- #include /*開心的事情別隱藏在心裡,分享給別人知道會更快樂的*/ /*得到新知識別隱藏在心裡,分享給別人了解會更清楚的*/ |
流
中階會員 發表:36 回覆:142 積分:70 註冊:2003-07-24 發送簡訊給我 |
//--------------------------------------------------------------------------- #includeaxsoft前輩您好: 小弟藉由前輩給的語法與 Timer 相比較 其實兩者計時的功能是差不多的,如果以秒計算的話 曾經在一些討論中看到 Timer 的計時區間設為 1 的話就不精準 所以才會想藉機也測試看看 小弟認為是前輩的程式比較精準 感謝前輩指導,今天又獲益良多了 謝謝前輩熱心回答 |
流
中階會員 發表:36 回覆:142 積分:70 註冊:2003-07-24 發送簡訊給我 |
中午前藉著gemi0305前輩的指導
以為把時差的程式寫好,想說下午可以進行下階段的工作
一覺醒來後,看了又看發現大大的不對勁了 (昏倒)...
因為只是單機測試的工作,所以才無誤
不過仔細的想一下,肯定多機連線會出錯 而axsoft前輩所用的方法也一定會行不通(對小弟的程式而言)
只要在Button1Click與Button2Click下個丟個TStart
而由於我程式的關係,必等同於兩個 Button 按下
那當小弟程序結束時,亦即執行TEnd後,其所顯示的時間
必是最後一個 TStart 與執行 TEnd 的時差
原因在於 axsoft 前輩將變數宣告成全域變數 小弟用的是 StringGrid 元件
顯示從多個 Client 端來的資料
在 StringGrid->Cells[4][i] 是顯示時差的欄位
以下是小弟寫在ServerSocket1ClientRead的片段程式
int temptime ; int s=0,m=0,h=0 ; String temptimestr ; if(StringGrid1->Cells[4][i]=="") { temptime = integer ; } if(StringGrid1->Cells[4][i]!="") { s = (integer - temptime) m = s/60 ; h = m /60 ; s = s % 60 m = m % 60 ; temptimestr.printf("d:d:d",h,m,s); } StringGrid1->Cells[4][i] = temptimestr;integer 是 Timer 的秒數計時 雖然沒有試過多機連線,但猜想就是會出問題 因為 temptime 會隨著連線(i)的不同而更改 就會變成所有的起始時間會最後一個連線的起始時間相同(temptime) 又開始苦無對策了,又厚著臉皮來跟前輩門請教了 感謝回答 發表人 - 流 於 2003/09/01 14:02:49 |
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
其實不難解決,
(以下client進入點就用你所謂的temptime表示) 你的問題只是在沒有Keep住每個client的temptime ,
所以只要能儲存這個temptime ,不就行了嗎?
就像是我那個範例用tag來存的道理是一樣的,
每個client都有自己專屬的temptime ,就能計算自己的時間~ 這時你可以要寫一個物件或結構來存,
存二個變數
client的RemoteAddress+RemotePort 可用String的型態或char[20以上],和
他專屬的temptime int型態, 再把這個物件或結構存到List裡去管理, 要取用時,就拿這個List來找,找RemoteAddress+RemotePort來取temptime
有RemoteAddress+RemotePort就不怕取錯了~ 你也可以用別的做法,只要能儲存每個client專屬的temptime 就可以了 國泰平安
|
流
中階會員 發表:36 回覆:142 積分:70 註冊:2003-07-24 發送簡訊給我 |
gemi0305 前輩您好: 嗯,前輩果然厲害,一語道破我最大問題所在
小弟問之前已經想到用 ListBox 去存每一筆數字
只是小弟覺得有點麻煩,還要去加一個分隔的符號"&"
以 String.Length 和 String.pos 做分割,取出所需,判斷
不過最大的問題還不是在這...而是有很多煩人的if與for判斷
剛剛就一直在想怎麼減化,確定是寫的出來,只是很麻煩
所以不久前才又問前輩是否有權宜之計 我會繼續把程式想好寫好,再將所得 idea 的 code 回貼
取之於此,還之於此
希望下個發問的人也能從前輩的 idea 裡找到理想的答案 今天真是麻煩了兩位前輩了,多虧了兩位前輩的指導 謝謝
|
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |