Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
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
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.
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.
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:
ustawiasz TTimer z interwałem na 1000,
wykorzystujesz zdarzenie OnTimer do aktualizowania wykresu wywołując odpowiednio przygotowaną procedurę, przekazując jej w argumencie wartość aktualnego obciążenia:
wypełniasz tło kanwy (metoda Rectangle),
rysujesz w pętli siatkę (metody MoveTo i LineTo),
na podstawie macierzy z wartościami obciążenia procesora rysujesz linię łamaną wykresu (metoda Polyline),
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.
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
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;
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ć.
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.
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
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.
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.
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
vpiotr
vpiotr
Rejestracja:prawie 14 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ć