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

如何做到時間同步

答題得分者是:malanlk
Fm
初階會員


發表:19
回覆:66
積分:37
註冊:2003-10-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-02 09:51:45 IP:220.130.xxx.xxx 未訂閱
大家好 我想"同時"開了兩個執行緒,並讓這兩個緒做取樣的動作,我的寫法如下, 但是,這樣的寫法無法使得每個取樣週期一致(一定要),大約會有1~2 mili ssecond 的差異,希望前輩可以給些建議。  
 
//---------------------------------------------------------------------------    #ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include <Forms.hpp>
#include 
using namespace std;
typedef struct Check
{
    //放資料的地方
    bool b;
    vector v;
}_check;
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:        // IDE-managed Components
    TButton *Button1;
    TMemo *Memo1;
    TButton *Button2;
    TMemo *Memo2;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Button2Click(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private:        // User declarations
public:                // User declarations
    __fastcall TForm1(TComponent* Owner);
    Check c1;
    Check c2;
    HANDLE h1,h2;
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
#include 
using namespace std;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------    //--------
void __stdcall Count1(Check *c1)
{
    DWORD d1,d2;//=GetTickCount();
    d2=GetTickCount();
    while(c1->b)
    {
        d1=GetTickCount();
        if((d1-d2)>10)
        {
    //do something.......                        
c1->v.push_back(d1);
            d2=d1;
        }
        Sleep(0);
    }
}
//---------------------------------------------------------------------------
void __stdcall Count2(Check *c2)
{
    clock_t d1,d2;
    d2=clock();
    while(c2->b)
    {
        d1=clock();
        if((d1-d2)>10)
        {
    //do something.......            
c2->v.push_back(d1);
            d2=d1;
        }
        Sleep(0);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    c1.b=true;
    c2.b=true;
    SetThreadPriority(h1,THREAD_PRIORITY_TIME_CRITICAL);
    SetThreadPriority(h2,THREAD_PRIORITY_TIME_CRITICAL);
    h1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Count1,(LPVOID)&c1,true,0);
    h2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Count2,(LPVOID)&c2,true,0);
    ResumeThread(h1);    ResumeThread(h2);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    c1.b=false;
    c2.b=false;
    for(int n=0;nLines->Add(c1.v[n]);
    }
    for(int n=0;nLines->Add(c2.v[n]);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    CloseHandle(h1);
    CloseHandle(h2);
}
//---------------------------------------------------------------------------    
謝謝
//新手上路,請多包涵。
/*青青子矜,悠悠我心。但為君故,沈吟至今。*/
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-02 10:51:56 IP:203.69.xxx.xxx 未訂閱
    h1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Count1,(LPVOID)&c1,true,0);
    h2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Count2,(LPVOID)&c2,true,0);
    SetThreadPriority(h1,THREAD_PRIORITY_TIME_CRITICAL);
    SetThreadPriority(h2,THREAD_PRIORITY_TIME_CRITICAL);
寫反了吧, h1 h2 都沒 Create 如何設 Priority?
Fm
初階會員


發表:19
回覆:66
積分:37
註冊:2003-10-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-02 14:34:43 IP:220.130.xxx.xxx 未訂閱
感謝malanlk前輩的回應 更改成你的說法後,UI跟著遲緩下來, 我將c1.v.size()以及c2.v.size()顯示出來卻發現兩者不一樣(在實驗機台上測的),更改執行緒的priority與c1.v.size()以及c2.v.size()的關係如下 //---------------- priority                         c1.v.size()           c2.v.size() THREAD_PRIORITY_TIME_CRITICAL        約400                 約1000 THREAD_PRIORITY_ABOVE_NORMAL        約900 約1000 ///// 我想我在執行緒回圈中的計算量都不會超過50ms,但是我不了解兩個質性序曲出來的樣本點不一樣?? 謝謝
//新手上路,請多包涵。
/*青青子矜,悠悠我心。但為君故,沈吟至今。*/
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-02 19:24:45 IP:203.69.xxx.xxx 未訂閱
UI 慢下來是必然的, 因為UI 的主執行緒 優先權 只有 normal 當然搶不過 你的兩個執行緒.... 若以數字表示 優先權的等級 THREAD_PRIORITY_TIME_CRITICAL = 15 THREAD_PRIORITY_NORMAL = 0 THREAD_PRIORITY_ABOVE_NORMAL = 1 THREAD_PRIORITY_IDLE = -15 所以你的數據 400 900 是不是上下列反了? 因為以上述的等級數來看, 若 THREAD_PRIORITY_IDLE=1 則 THREAD_PRIORITY_ABOVE_NORMAL=17 THREAD_PRIORITY_TIME_CRITICAL 就是 31 400:900 約略匹配 17:31 你用 GetTickCount(), 及 clock() 也要把他們的精確度考慮進去 我印象中 這兩個函數的誤差都超過 10 msec http://delphi.ktop.com.tw/QuickSearch.exe/QuickView?topicid=23297 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=23951
Fm
初階會員


發表:19
回覆:66
積分:37
註冊:2003-10-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-02 19:54:42 IP:220.130.xxx.xxx 未訂閱
malanlk前輩你好 1.數據應該是沒有寫反,我想表達的是在兩個都設為THREAD_PRIORITY_TIME_CRITICAL的執行緒所取出來的樣本數的差異性大於 同樣設為THREAD_PRIORITY_ABOVE_NORMAL的兩個執行緒 很不解這個 2.GetTickCount(), 及 clock() 精度真不好,我會再試試 你附的連結 謝謝    
//新手上路,請多包涵。
/*青青子矜,悠悠我心。但為君故,沈吟至今。*/
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-02 20:42:44 IP:210.68.xxx.xxx 未訂閱
如果你沒寫反, 那就表示你的交錯表上下兩列沒有關聯.... 也證實我以前看過的經驗, clock() 比 GetTickCount() 更不準. 因為你的條件是 (d1-d2)>10 , 我也推測你的 do somthing 落於 10 ms 內. 因為 clock() 精確度差, 所以 (d1-d2)>10 的機會比 GetTickCount() 大, 執行緒越快, 這個差異越明顯.... 這就是上下兩列差異之所在...
Fm
初階會員


發表:19
回覆:66
積分:37
註冊:2003-10-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-02 21:40:25 IP:220.130.xxx.xxx 未訂閱
嗯嗯 用clock這各函數是參考"C程式設計500個應用範例....." 內容說道這是使用CPU處理器的時間,所以我想會比GetTickCount準些 現在程式已經改用 QueryPerformanceCount來處理(不錯用)    謝謝你的回答    
//新手上路,請多包涵。
/*青青子矜,悠悠我心。但為君故,沈吟至今。*/
系統時間:2024-04-30 8:09:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!