Wykres użycia procesora (TCanvas)

0

Witam,
Potrzebuję na szybko zaimplementować w swojej aplikacji wykres, który prezentuje
użycie procesora (lub pamięci, użycie dysku etc...).
Załóżmy, że jest to procesor. Miałoby to wyglądać jak w menedżerze zadań windows.
Przykład: http://www.meggamusic.co.uk/shup/1361393557/Wykres_Uzycia.png

W związku z tym, że w sumie wieki nie bawiłem się grafiką w Delphi (nie chcę używać
żadnych zewnętrznych komponentów, tylko TCanvas), pozwalam sobie zapytać Was
o rozwiązanie tego problemu.
Wykres powinien przesuwać się z prawej do lewej, być skalowalny (zmiana rozmiaru
okna automatycznie zmienia wielkość wykresu), odświeżać się co 1s i kreślić
dane w sposób jak na obrazku.

Zatem, jeśli ktoś z Was ma w miare gotowe rozwiązanie, proszę o kod, lub
w ostateczności jakiś algorytm implementacji.
Pozdr,
-Pawel

2

TCanvas to imho niezbyt dobry wydajnościowo-estetycznie pomysł.
Lepsze byłoby tutaj natomiast skorzystanie z OpenGL (bezpośrednio lub za pośrednictwem jakiegoś silnika) z handle ustawionym na kontrolkę TPanel.

0

Jak wspomniał Patryk27, stworzenie przesuwanego i skalowanego wykresu przy użyciu TCanvas będzie wymagało trochę roboty, więc ja proponuję użyć komponentu TChart. Może nie warto upierać się przy TCanvas.

Co do % użycia procesora, to musisz wykorzystać funkcję NtQuerySystemInformation (ntdll.dll) i uwzględnić ilość rdzeni procesora.

0
Patryk27 napisał(a)

Lepsze byłoby tutaj natomiast skorzystanie z OpenGL (bezpośrednio lub za pośrednictwem jakiegoś silnika) z handle ustawionym na kontrolkę TPanel.

marogo napisał(a)

Jak wspomniał Patryk27, stworzenie przesuwanego i skalowanego wykresu przy użyciu TCanvas będzie wymagało trochę roboty, więc ja proponuję użyć komponentu TChart. Może nie warto upierać się przy TCanvas.

No co Wy, chłopaki? Nie wiecie przecież czy pytacz w ogóle korzystał kiedykolwiek z OpenGL i innych API; A jeśli faktycznie nie zna tych API to jeszcze dołożycie mu roboty... Napisał jasno, że otrzeba mu szybko to zrobić, a w OpenGL szybciej nie będzie;

Wbrew pozorom zaimplementowanie takiego wykresu to rzecz bardzo prosta:

  1. ustawiasz TTimer z interwałem na 1000,
  2. wykorzystujesz zdarzenie OnTimer do aktualizowania wykresu wywołując odpowiednio przygotowaną procedurę, przekazując jej w argumencie wartość aktualnego obciążenia:
  3. wypełniasz tło kanwy (metoda Rectangle),
  4. rysujesz w pętli siatkę (metody MoveTo i LineTo),
  5. na podstawie macierzy z wartościami obciążenia procesora rysujesz linię łamaną wykresu (metoda Polyline),
  6. ewentualnie wypełniasz pole pod wykresem - jeśli siatka jest statyczna to sprawa jest prosta - metodą FloodFill wypełniasz odpowiednie kratki, jednak jeśli jest ruchoma, trzeba znać ich pozycje i także w pętli wypełniać je po kolei;
    Jeśli chodzi o rozciąganie formularza i tym samym zmianę rysowania w kontrolce - należy zarówno gęstość siatki jak i skalę wykresu przeliczać w metodzie rysującej przed samym rysowaniem;

Mając przećwiczony proceder pobierania wartości obciążenia procesora jesteś w stanie zaimplementować taki wykres w godzinę, góra dwie na spokojnie; Ja to tak widzę, szkoda, że nie mam czasu bo spróbowałbym takie cuś zaimplementować (może jutro z wieczora);

EDIT: Tylko nie zapomnij przed rozpoczęciem rysowania wywołać metodę BeginUpdate, a po zakończeniu EndUpdate - wtedy przemalowanie kontrolki (formularza) odbędzie się raz, a bez nich po każdym narysowanym elemencie; Proponuję wykorzystać siatkę statyczną - zaoszczędzisz trochę czasu, skoro masz go tak mało.

0

Dzięki za podpowiedzi.
Kolega Furious Programming napisał jednak dokładnie to czego oczekiwałem.
Jeśli miałbyś trochę czasu, chetnie zobaczę czy udało Ci się coś fajnego zaimplementować.

Dodam, że dane pobieram dzięki metodom WMI. I owszem, nie potrzebuję OpenGL do tak
prostego zadania. Ładnie proszę o pomoc, ponieważ ardzo dawno temu pisałem coś używając Canvas.
A ten czas wolę poświęcić na inne problemy (walczę teraz z pobieraniem i przetwarzaniem danych
z usługi WMI)...

Siatka musi być ruchoma, jak w Windows (TaskManager)
Pozdrawiam
-Pawel

0
Pepe napisał(a)

Jeśli miałbyś trochę czasu, chetnie zobaczę czy udało Ci się coś fajnego zaimplementować.

Nie rozumiem - Ty chcesz, żebym ten wykres zrobił za Ciebie..?

Wybacz, ale gotowca nie dostaniesz - zrób coś sam, pokaż kod to się coś podpowie; Ja mam swoje zajęcia i nie cierpię na nadmiar wolnego czasu, stąd nie poświęcę godziny czy dwóch na napisanie tego za Ciebie, bo Tobie się nie chce... Pomoc możesz uzyskać, jeśli się wykażesz, jeśli nie masz zamiaru nic zrobić - możemy dogadać się w inny sposób - przedstaw zlecenie a za odpowiednią kwotę zrobię Ci ten program;

0
Pepe napisał(a):

Dzięki za podpowiedzi.
Kolega Furious Programming napisał jednak dokładnie to czego oczekiwałem.
Jeśli miałbyś trochę czasu, chetnie zobaczę czy udało Ci się coś fajnego zaimplementować.

+5pkt za umiejętności delegowania :-D

SGH?

0

Witam,
Widzę, że powstają tu ciekawe teorie :)
Nie liczyłem na gotowy kod, jedynie na jakieś przykładowe fragmenty kodu, realizujące określone funkcje (jak na przykład wyrysowanie linii zmiennej w czasie i jej zakreślenie kolorem. Przepraszam, że się źle wyraziłem.
Oczywiście, dla chcącego nic trudnego :P Zatem, w weekend będę miał przyspieszony kurs grafiki w Delphi.
Pozdrawiam
-Pawel

0
Pepe napisał(a)

Nie liczyłem na gotowy kod, jedynie na jakieś przykładowe fragmenty kodu

Przykładowe fragmenty kodu są gotowym kodem;

Pepe napisał(a)

realizujące określone funkcje (jak na przykład wyrysowanie linii zmiennej w czasie i jej zakreślenie kolorem.

Opisałem Ci w moim poprzednim poście w jaki sposób można wykonać taki wykres, co należy wykorzystać i jakich metod klasy TCanvas trzeba użyć do rysowania poszczególnych elementów wykresu; Więc skoro dostałeś takie informacje, to nic innego tylko siadać przed IDE i próbować rysować - przecież nie dowiesz się, jak nie spróbujesz;

Jeśli teraz nie wiesz jak zrobić wszystkie elementy wykresu, to napisz sobie najpierw wersję okrojoną, a potem ją unowocześniaj o nowe funkcjonalności, ale zrób coś najpierw sam, a nie od razu sięgaj po gotowe "fragmenty" kodu.

0

Temat uważam za zamknięty. Dziękuję za wskazówki.
-Pawel

0

Kiedyś na tym forum, można było uzyskać przykłady. Potem za dużo narobiło się leni, ale ten temat nie jest powszechny i rysowanie wykresów nie należy do łatwych.
Nie mniej, każdy teraz oczekuje zapłaty za podpowiedzi... nie mam pojęcia, dlaczego takie zachowanie tutaj panuje.

3

@Opi: Może kiedyś na forum ludzie pytający nie byli tak bezczelni.

Przykłady z tego forum:

  • facet mówi "chętnie zobaczę jak sobie poradziłeś z moim zadaniem"
  • ktoś wrzuca treść zadania bez nawet słowa dodatkowego typu "cześć", "proszę" lub "pomocy!"
  • student udający blondynkę (dosłownie) wrzuca zadanie i prosi o pomoc dodając coś o ew. korepetycjach. Wyrachowanie i gra psychologiczna najwyższych lotów.
  • dzieciaki wrzucają zadania domowe i myślą że jak z kieszonkowego sypną 200 zł to ludzie się pozabijają żeby im pomagać

1 użytkowników online, w tym zalogowanych: 0, gości: 1