線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2167
推到 Plurk!
推到 Facebook!

關於兩時間相差問題

答題得分者是:gemi0305

中階會員


發表:36
回覆:142
積分:70
註冊:2003-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-28 15:50:56 IP:211.23.xxx.xxx 未訂閱
各位前輩們: 小弟想知道 Client 端連線的時間 除了用 Timer 做計時外 應該能有兩時間相減的動作 小弟記錄開始連線時間,還有持續連線的時間 兩者該怎麼相減,而能得到正確的進位 FormatDateTime("hh:nn:ss",Now()); 不曉得上述得到時間的語法行不行的通 或者有什麼方法呢? 感謝回答 發表人 - 流 於 2003/08/28 15:54:41
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-28 16:08:47 IP:210.66.xxx.xxx 未訂閱
計時的功能: < 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-28 17:56:29 IP:211.23.xxx.xxx 未訂閱
gemi0305 版主您好 小弟的 Client 連線不止一台 所以連線時間是不一定 您給的語法會將所有的開始時間給固定了 恕小弟才疏學淺,沒能將您給的語法給發揚光大 要是開始定義的時間能由連線時開始 或許小弟比較知道怎麼著手 前輩是否還有別的方法 ^^" 感謝回答
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-28 18:37:27 IP:61.218.xxx.xxx 未訂閱
流 您好:    
試試看這個方法:
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-29 14:32:36 IP:210.66.xxx.xxx 未訂閱
利用中午休息時間寫的,

中階會員


發表:36
回覆:142
積分:70
註冊:2003-07-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-01 09:19:30 IP:211.23.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-09-01 10:33:41 IP:61.218.xxx.xxx 未訂閱
引言: 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 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
LARGE_INTEGER litmp;
double frq, Tfrq1, Tfrq2, Value;
String SecStr;
void inline TStart();
void inline TEnd();
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void inline TStart()
{
        QueryPerformanceFrequency(&litmp);
        frq=litmp.QuadPart;
        QueryPerformanceCounter(&litmp);
        Tfrq1=litmp.QuadPart;    }    void inline TEnd()
{
        QueryPerformanceCounter(&litmp);
        Tfrq2=litmp.QuadPart;   //1.39682557420007E-6
        Value=((Tfrq2-Tfrq1)/frq)-1.3E-6;
        SecStr.sprintf(".6f", Value);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TStart();
  for(int x=0;x<=1000;x  )
    {
     Form1->Caption=IntToStr(x);
    }
  TEnd();
  ShowMessage(SecStr);    }
//---------------------------------------------------------------------------
/*開心的事情別隱藏在心裡,分享給別人知道會更快樂的*/
/*得到新知識別隱藏在心裡,分享給別人了解會更清楚的*/

中階會員


發表:36
回覆:142
積分:70
註冊:2003-07-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-09-01 12:30:06 IP:211.23.xxx.xxx 未訂閱
 //---------------------------------------------------------------------------
#include 
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
  TForm1 *Form1;
  LARGE_INTEGER litmp;
  double frq, Tfrq1, Tfrq2, Value;
  String SecStr;
  void inline TStart();
  void inline TEnd();
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
void inline TStart()
  {
    QueryPerformanceFrequency(&litmp);
    frq=litmp.QuadPart;
    QueryPerformanceCounter(&litmp);
    Tfrq1=litmp.QuadPart;      }
void inline TEnd()
  {
    QueryPerformanceCounter(&litmp);
    Tfrq2=litmp.QuadPart;   //1.39682557420007E-6
    Value=((Tfrq2-Tfrq1)/frq)-1.3E-6;
    SecStr.sprintf(".6f", Value);
  }
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
  {
    TStart();
    Edit1->Text = "0" ;
    Timer1->Enabled = true ;
  }
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
  {
    TEnd();
    Edit2->Text = SecStr;
    Timer1->Enabled = false ;
  }
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
  {
    Edit1->Text = StrToInt(Edit1->Text)   1 ;
  }
//---------------------------------------------------------------------------
axsoft前輩您好: 小弟藉由前輩給的語法與 Timer 相比較 其實兩者計時的功能是差不多的,如果以秒計算的話 曾經在一些討論中看到 Timer 的計時區間設為 1 的話就不精準 所以才會想藉機也測試看看 小弟認為是前輩的程式比較精準 感謝前輩指導,今天又獲益良多了 謝謝前輩熱心回答

中階會員


發表:36
回覆:142
積分:70
註冊:2003-07-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-09-01 13:56:47 IP:211.23.xxx.xxx 未訂閱
中午前藉著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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-09-01 15:48:07 IP:210.66.xxx.xxx 未訂閱
其實不難解決, (以下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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-09-01 16:28:05 IP:211.23.xxx.xxx 未訂閱
gemi0305 前輩您好:    嗯,前輩果然厲害,一語道破我最大問題所在 小弟問之前已經想到用 ListBox 去存每一筆數字 只是小弟覺得有點麻煩,還要去加一個分隔的符號"&" 以 String.Length 和 String.pos 做分割,取出所需,判斷 不過最大的問題還不是在這...而是有很多煩人的if與for判斷 剛剛就一直在想怎麼減化,確定是寫的出來,只是很麻煩 所以不久前才又問前輩是否有權宜之計    我會繼續把程式想好寫好,再將所得 idea 的 code 回貼 取之於此,還之於此 希望下個發問的人也能從前輩的 idea 裡找到理想的答案    今天真是麻煩了兩位前輩了,多虧了兩位前輩的指導    謝謝
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-09-02 00:35:50 IP:61.224.xxx.xxx 未訂閱
範例: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=36767    其實只要儲存Socket的RemotePort和開始連線時間就可以了~ 國泰平安
系統時間:2024-04-26 21:25:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!