2010-09-17 37 views
0

我正在構建一個數據可視化系統,在一段時間內可視化超過100,000個數據點(訪問網站)。然後將時間段(例如1周)轉換爲模擬時間(1周=模擬2分鐘),並且在模擬時間(每次訪問的時間)發生的特定時間對每一段數據執行任務在一週內實時發生)。跟我? = P如何在不同的定義時間將數萬個任務設置到每個觸發器?

在其他編程語言(例如,Java的)我想簡單地設置對每個數據點的定時器。每個計時器完成後,它會觸發一個回調,允許我在我的應用程序中顯示該數據點。我是C++的新手,不幸的是,回調的定時器似乎並不是內置的。例如,我會在ActionScript中完成的另一種方法是使用在特定時間段後觸發的自定義事件。但是,我不認爲C++也支持自定義事件。

簡而言之,比如說我有1000條數據跨越了60秒的時間。每一段數據都有自己的時間與60秒的時間相關。例如,一個需要在1秒觸發的東西,另一個在5秒等

我要對這個正確的方式,或者是有一個更簡單的方法來做到這一點?

Ps。我使用的是Mac OS X,而不是Windows

回答

1

你自己做一個「定時器」機制,這是最好,最快和最靈活的方式。

- >使事件(鏈接到每個對象的事件發生到)(在C的std ::矢量++/STL) 的陣列 - >上的時間排序的陣列(標準::排序在C++/STL) - >然後只是在數組上循環並在一定範圍內隨時觸發對象動作/方法。

粗略地給出在C++:

// action upon data + data itself 
class Object{ 
public: 
    Object(Data d) : data(d) { 

    void Action(){display(data)}; 

    Data data; 
}; 

// event time + object upon event acts 
class Event{ 
public: 
    Event(double t, Object o) time (t), object(o) {}; 

    // useful for std::sort 
    bool operator<(Event e) { return time < e.time; } 


    double time; 
    Object object; 


} 
//init 
std::vector<Event> myEvents; 

myEvents.push_back(Event(1.0, Object(data0))); 
//... 
myEvents.push_back(Event(54.0, Object(data10000))); 

// could be removed is push_back() is guaranteed to be in the correct order 
std::sort(myEvents.begin(), myEvents.end()); 

// the way you handle time... period is for some fuzziness/animation ? 
const double period = 0.5; 
const double endTime = 60; 
std::vector<Event>::iterator itLastFirstEvent = myEvents.begin(); 
for (double currtime = 0.0; currtime < endTime; currtime+=0.1) 
{ 
    for (std::vector<Event>::iterator itEvent = itLastFirstEvent ; itEvent != myEvents.end();++itEvent) 
    { 
    if (currtime - period < itEvent.time) 
     itLastFirstEvent = itEvent; // so that next loop start is optimised 
    else if (itEvent.time < currtime + period) 
     itEvent->actiontick(); // action speaks louder than words 
    else 
     break; // as it's sorted, won't be any more tick this loop 
    } 
} 

PS:關於自定義事件,您可能希望瞭解在C代表/搜索++和函數/方法指針。

+0

感謝團恩!代碼很有意義,而且非常簡單,並且很好。這是我正在編寫的代碼的完美擴展,所以我會看看它是如何發展的。 – robhawkes 2010-09-17 15:07:12

0

如果您正在使用原生C++,你應該看看MSDN網站上的Windows API的計時器部分。他們應該告訴你到底你需要知道什麼。

+0

謝謝。我正在使用OS X進行開發。這仍然是相關的嗎? – robhawkes 2010-09-17 10:13:34

+0

哦。不可以。但是,您可以查看POSIX計時器 - 它們應提供相同的功能,給予或採取。但我從來沒有用過它們,也沒有鏈接給你。 – Puppy 2010-09-17 10:22:33

4

我不會使用計時器來做到這一點。聽起來你有太多的事件,他們可能彼此太靠近。定時器的性能和準確性可能很差。

模擬通常幹過這樣的: 你simly做環(或迭代)。並且在每一個循環中,您都會爲仿真時間添加(實時)或常量(非實時)量。 然後您手動檢查所有事件並在必要時執行它們。 在你的情況下,它會幫助他們對執行時間進行排序,因此你不必在每次迭代中循環遍歷它們。

TME測量可以與gettimer()c函數來完成對低精度或有更好的功能更高的精度例如QueryPerformanceTimer()在Windows上 - 不知道Mac的等價物。

+0

這種情況下,您也可以計算到第一個事件的延遲時間,然後使用納秒睡眠進行睡眠,而不是仿真通用的時間延遲方法。 – stefaanv 2010-09-17 10:55:33

+0

或像遊戲一樣在顯示時間間隔內休息。這有助於不消耗所有處理器時間。 – 2010-09-17 11:58:16

+0

我選擇了Tuan對我的問題的「答案」,但我完全同意你說定時器不是最好的選擇。我現在發現這一點,我需要使用基於幀的錄製。計時器系統不會因幀速下降而減慢速度。我打算將它轉換成像你所建議的基於幀的時序系統,這似乎是唯一的方法。 – robhawkes 2010-09-20 10:14:09

相關問題