logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Delphi 4: Jak wykonać procedurę co 1s i zrealizować opóźnienie?

heyka 07 Lut 2006 12:40 3315 15
REKLAMA
  • #1 2271070
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    w jaki sposob w Delphi 4 zrobic procedure ktora co np 1 s wykonywała by coś, dokładnie chodzi mi o sprawdzenie czy z podłączonego do PC mikrokontrolera przyszły jakies dane, czy robi sie to na Timerze jeśli tak to jak, i jeszce jedno pytanko, jak zrealizować opóźnienie jaka funkcją, w tej chwilo zrobiłem to pętla for ale to na każdym kompie działa inaczej w zależności od procesora a mi chodzi o to żeby zawsze było takie samo

    pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 2271314
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    1. Użyj do tego oddzielnego wątku (TThread) aby nie obciążać głównej aplikacji. TThread jest lepszym rozwiązaniem niż zastosowanie zdarzenia OnTimer komponentu TTimer.
    2. Sprawdź czy D4 posiada funkcję Sleep(czas w ms).

    Pozdrawiam...
  • #3 2271798
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    dzieki Jaca, dodaje punkcik, mam tylko maly problem nie doczytalem jeszcze o watkach:?:

    Dodano po 5 [minuty]:

    do Jaca jak wygląda funkcja Sleep tzn tak? sleep 20 , czy jakos inaczej sie podaje opoznienie?
  • #4 2271908
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Napisałem szybkie demo odnośnie wątku. Wyświetlany jest zegar a jednocześnie możemy korzystać z aplikacji głównej (przy użyciu buttona losujemy liczby). Co do Sleep to wpisujesz:



    Pozdrawiam...
    Załączniki:
    • Thread_Demo.zip (204.46 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #5 2272281
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    COS PROBUJE SOBIE PRZERABIAC, CZY TYCH WSZYSTKICH DEKLARACJI NIE DAŁO BY SIE TROCHE UPROSCIC, CZY WSZYSTKO TO JEST NIEZBEDNE, PRZEPRASZAM JEZELI TO PYTANIE JEST GŁUPIE
  • REKLAMA
  • #6 2272403
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Zrobiłem to najprościej jak się dało. Otwórz unit Watek i dodaj swój kod w miejscu podanym niżej:

    procedure TWatek.Execute;
    begin
      SetName;
      while not Terminated do
      begin
    
        //tutaj umieść swój kod
    
      end;
    end;


    W unit Main (zdarzenie OnShow) zawarta jest instrukcja stworzenia/uruchomienia wątka oraz instrukcje zatrzymania i destrukcji wątka (zdarzenie OnClose).

    Pozdrawiam...
  • #7 2272632
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Bardzo dziekuje za pomoc, przepraszam ze sie czepiam ale oprocz tego ze chce zeby to chodzilo to jeszcze chcialbym poznac zasade tworzenia watku, a tu jeszcze wiele nie rozumiem, powstawialem kod swoj tak jak mi napisaleś i DZIAŁA!!!!!, odpytuje mikroprocesor a stany portow wyswietla mi w okinku memo, dzieki i pozdrawiam.


    Zamykam temat dzieki Jack-owi się udało
  • #8 2273705
    kloszi
    Poziom 21  
    Posty: 547
    Pomógł: 34
    Ocena: 89
    Jesli nie potrzebne ci dokladne odnierzanie czasu to uzyj TTimer. Na zakladce "system" jest zegarek. Kladziesz go na Formie i klikasz 2 razy i wyskakuje ci procedura ktora bedzie wywolywana co 1 sec. Na zakladce "propertis" ustawiasz czas co ktory ma byc wywolywana twoja funkcja (standardowo 1 sekunda)"interwal" (w milisekundach) no i standardowo Enable.
  • #9 2274806
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    mam jeszce jedno pytanko, program odpytuje mikrokontroler, mikrokontroler wysyła do programu komunikaty o stanie portow, czy sa włączone czy nie, program na PC wyswietla mi te komunikaty w memo i jest ok, chcialbym zrobic cos takiego ze stan kazdego portu jest pokazywany w PC w postci np kontrolki, wszystkie komunikaty z mikrokontrolera sa ładowane do bufora, w jaki sposób najlepiej przesyłać informację z mikrokontrolera aby potem mozna ja był obrobic w programie i miec dostep do tego który port w jakim jest stanie, mam nadzieje ze zrozumiecie o co mi chodzi
  • #10 2274864
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Tak jak napisałeś :) Metodą zapytań i odpowiedzi. Utwórz swój protokół wymiany danych, np: KOMENDA - PARAMETR(Y) -> ODPOWIEDŹ uC. Wysyłasz do uC np: PA co uC interpretuje jako:
    P - odczytaj stan portu
    A - port A (lub 1, nie wiem jakiego uC używasz)
    W odpowiedzi uC wysyła bajt danych, który program PC rozbija na poszczególne bity i wyświetla, czy to w postaci symboli graficznych, czy to w postaci np CheckBox'ów. Możesz zrobić serię komponentów TImage i w zależności od stanu pinów uC ładować do nich (z komponentu TImageList) stosowne symbole np diod LED.

    Pozdrawiam...
  • #11 2275545
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    odczytuje bajt czyli np 11001100(dane np z portu b), czyli trzeba to wziąść z bufora potraktować jako łańcuch znaków rozbic na pojedyncze bity i się znimi rozprawić, taka mam koncepcję, nie wiem czy dobra i jak rozbić łańcuch na pojedyncze bity, wiem że to śa podstwowe informacje, ale jak do tej pory to zajmowąłem sie głownie programowaniem mikroprocesorow, a i zrobilem program w delphi do pisania faktor z bazami danych
  • REKLAMA
  • #12 2275598
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Przewidziałem to i napisałem Ci prosty przykład :) ...

    Pozdrawiam...
    Załączniki:
    • Ledy.zip (212.25 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #13 2275778
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    wiem, ze przynudzam, ale:
    Bit: byte;
    Bajt: byte;
    begin
    Bajt:=StrToInt(Edit1.Text);
    for Bit:=0 to 7 do
    begin
    with TImage(FindComponent('L'+IntToStr(Bit))) do
    begin
    with Picture,Bitmap do
    begin
    FreeImage;
    Create;
    ImageList1.GetBitmap(Bajt mod 2,Bitmap);
    Update;
    end;
    end;
    Bajt:=Bajt div 2;
    end;
    end;

    tzn
    wartość nie jest brana w postaci 0101010 tylko jest brana jako cyferka np 123-ok

    potem dzieli sie ja przez 2
    jezeli reszta z dzielenia 0 to jakis obrazek a jak nie 0 to inny obraze?-ok
    robi t 8 razy-ok

    with TImage(FindComponent('L'+IntToStr(Bit))) do- to nie wiem co to co to za L?

    i wogóle ta cała procedura jest dla mnie za prosta tzn, ze ja bym to pewnie zrobił ale w sposób o wiele bardziej skomlikowany, i tu sie różnimy ja jestem partaczem i mam małą wiedzę, a Ty przewyższasz mnie bardzo:cry:

    postaram sie to wszystko zebrac i zbudowac działający programik

    dzieki za pomoc, jak mie cos nie bedzie chodzilo, to pozawracam Ci jeszcze glowe

    POZDRAWIAM
  • #14 2275969
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    TImage(FindComponent('L'+IntToStr(Bit))):

    Legenda:
    TImage(...) - rzutowanie typów;
    FindComponent(...) - odnajdowanie komponentu po nazwie;
    'L'+IntToStr(Bit) - nazwa komponentu. Całość jest umieszczona w pętli for Bit:=0 to 7, która utworzy kolejno nazwy komponentów TImage: L0,L1,...L7. Zerknij jak się nazywają komponenty TImage umieszczone na formatce i wszystko zrozumiesz :)

    Pozdrawiam...
  • #15 2279477
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    Rzutowanie typów, aha nie baedzo wiem co to :cry:
    ale moze kiedys sie dowiem, dluga zajmujesz sie programowaniem w Delhi?
  • #16 2279553
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Tak na "chłopski rozum" to rzutowanie typów to nic innego jak konwersja typów. Zauważ, że funkcja FindComponent() zwraca wynik typu TComponent, który nie posiada metod TImage (Picture, Bitmap,FreeImage,itp). TImage(FindComponent()) "mówi" kompilatorowi, że znaleziony komponent jest typu TImage i jako taki powinien być traktowany w programie.

    Pozdrawiam...

Podsumowanie tematu

✨ W dyskusji omówiono sposób realizacji procedury wykonywanej co 1 sekundę w Delphi 4, służącej do sprawdzania danych z mikrokontrolera podłączonego do komputera. Zalecane jest użycie osobnego wątku (TThread) zamiast komponentu TTimer, aby nie obciążać głównej aplikacji. Funkcja Sleep(czas w ms) służy do realizacji opóźnień, np. Sleep(20). Przykładowa implementacja wątku pokazuje umieszczenie kodu w metodzie Execute klasy dziedziczącej po TThread, a tworzenie i niszczenie wątku powinno odbywać się w zdarzeniach OnShow i OnClose formularza. Alternatywnie, jeśli nie jest wymagane precyzyjne odmierzanie czasu, można użyć komponentu TTimer z ustawionym interwałem 1000 ms i zdarzeniem OnTimer.

W kwestii komunikacji z mikrokontrolerem zaproponowano protokół zapytań i odpowiedzi, gdzie PC wysyła komendy do uC, a ten zwraca bajt danych reprezentujący stan portów. Otrzymany bajt można rozbić na pojedyncze bity i wizualizować ich stany za pomocą komponentów TImage, zmieniając obrazki w zależności od wartości bitów. Przykład pokazuje użycie pętli do iteracji po bitach bajtu, dzielenie przez 2 i wybór odpowiedniego obrazka. Wyjaśniono także pojęcie rzutowania typów (typecasting) na przykładzie TImage(FindComponent('L'+IntToStr(Bit))) służącego do dynamicznego odnajdywania i obsługi komponentów graficznych na formularzu.

Podsumowując, efektywne odpytywanie mikrokontrolera co 1 sekundę w Delphi 4 realizuje się najlepiej przez wątek z funkcją Sleep, a wizualizację stanów portów można wykonać przez interpretację bajtu danych i dynamiczną zmianę obrazków komponentów TImage.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA