Wykres użycia procesora (TCanvas)

Wykres użycia procesora (TCanvas)
Pepe
  • Rejestracja:ponad 22 lata
  • Ostatnio:około godziny
  • Postów:496
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


edytowany 1x, ostatnio: olesio
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
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.


edytowany 1x, ostatnio: Patryk27
MA
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 2 godziny
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.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12169
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.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 5x, ostatnio: flowCRANE
pelsta
Nie załapałem :(. Jakie kontrolki mają metody BeginUpdate/EndUpdate. Ja najczęściej rysuję po TImage.
flowCRANE
Sam nie wiem skąd mi to na myśl przyszło... a przecież gdzieś ostatnio coś rysowałem... Cholera, to nie przy rysowaniu! <ajajaj>
Pepe
  • Rejestracja:ponad 22 lata
  • Ostatnio:około godziny
  • Postów:496
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


flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12169
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;


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
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?

flowCRANE
Ja też mam nadzieję, że uda mi się coś ciekawego zaimplementować ;)
vpiotr
W terminologii managerskiej zwie się to zdaje się "challengowanie" - czyli sprawienie że obiekt-cel lub obiekt-świadek-zdarzenia samodzielnie wykonuje pracę której nawet się nie zleciło... Widziałem to kilka razy w praktyce ale nigdy nie trafiłem na żadną teorię na ten temat.
Pepe
  • Rejestracja:ponad 22 lata
  • Ostatnio:około godziny
  • Postów:496
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


MA
"Zatem, jeśli ktoś z Was ma w miare gotowe rozwiązanie, proszę o kod..." - no faktycznie, wcale nie liczyłeś na gotowy kod...:)
flowCRANE
Zawsze możesz machnąć w pseudojęzyku ;)
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12169
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.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
Pepe
  • Rejestracja:ponad 22 lata
  • Ostatnio:około godziny
  • Postów:496
0

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


Opi
  • Rejestracja:ponad 20 lat
  • Ostatnio:8 dni
  • Postów:1029
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.

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
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ć
edytowany 2x, ostatnio: vpiotr
flowCRANE
Dlatego od dłuższego już czasu nie rozdaje się gotowców, a zmusza do samodzielnej pracy (i w sporej części takich przypadków udaje się).
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)