CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Dlaczego nie działa funkcja Sleep

Dlaczego nie działa funkcja Sleep

dział ogólny

Dlaczego nie działa funkcja Sleep

Nowy postprzez tomnar » środa, 3 kwietnia 2013, 23:09

Witam
Jestem początkującym w programowaniu w C++. Poniżej przedstawiam program testujący funkcję sleep

void __fastcall TForm1::WprowadzButtonClick(TObject *Sender)
{
Edit1->Text = "coś";
Sleep(WartoscCSpinEdit->Value);
Edit1->Text = "zmiana";
}

W edit pokazuje się tylko "zmiana" po czasie jaki wskazuje wartość w sleep.
Chcę otrzymać następujący efekt. Po kliknięciu na button ma się ukazać w edit jakiś napis a po
określonym czasie zmienić się na inny.
Avatar użytkownika
tomnar
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): środa, 3 kwietnia 2013, 22:13
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: winxp
Kompilator: Builder 6
Gadu Gadu: 0
    Windows XPChrome

Re: Dlaczego nie działa funkcja Sleep

Nowy postprzez Cyfrowy Baron » środa, 3 kwietnia 2013, 23:29

Funkcja Sleep() wstrzymuje aplikację na zadany czas, nie odświeża kolejki komunikatów. Kod powinien wyglądać tak:

KOD cpp:     UKRYJ  
void __fastcall TForm1::WprowadzButtonClick(TObject *Sender)
{
 Edit1->Text = "coś";

Application->ProcessMessages(); /* odświeżenie kolejki komunikatów */

 Sleep(WartoscCSpinEdit->Value);
 
Edit1->Text = "zmiana";
}
 
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Dlaczego nie działa funkcja Sleep

Nowy postprzez tomnar » czwartek, 4 kwietnia 2013, 10:17

Dziękuje za szybką pomoc.
Mam związku z tym jeszcze jedną prośbę.
Czy w poniższym przykładzie funkcja sleep() da odpowiedni efekt
i program po wysłaniu danych przez port Com poczeka określoną
ilość ms na odczyt danych.


KOD cpp:     UKRYJ  
 //-----------wysyłanie zapytania--------------------------------
   if (hCommDev == NULL)    
       MessageBox(NULL, sbuffer4, sbuffer2, MB_OK);
   else
       FlushFileBuffers(hCommDev);  //czyszczenie bufora
       for(i=0; i<9; i++) { bufferOut[i]= 0;}
       PurgeComm(hCommDev,PURGE_RXCLEAR);
       for(i=0; i<7; i++) { bufferOut[i]=Pytanie[i]; }
       int dlugoscRec = 7;
       if (AdresCSpinEdit->Value >= 340 && AdresCSpinEdit->Value <= 345)
           dlugoscRec = 6;

       writeSerialPort(hCommDev, dlugoscRec);
       Sleep(50);

      //----------odczyt danych---------------------------------------

       PurgeComm(hCommDev,PURGE_TXCLEAR);
       readSerialPort(hCommDev, &bufferIn[0], &bytesRead,
                      sizeof(bufferIn));
      //return;
    if (bytesRead == 0) MessageBox(NULL, sbuffer1, sbuffer2, MB_OK);
    else   // jeżeli odebrano jakieś bajty

     { for(i=0; i<IntToStr(comstat.cbInQue)-1; i++) Odpowiedz[i] = bufferIn[i];
Avatar użytkownika
tomnar
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): środa, 3 kwietnia 2013, 22:13
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: winxp
Kompilator: Builder 6
Gadu Gadu: 0
    Windows XPChrome

Re: Dlaczego nie działa funkcja Sleep

Nowy postprzez Corvis » czwartek, 4 kwietnia 2013, 10:21

Sorry, ale to jest tragiczne podejście do tematu transmisji danych :(

Zrób sobie timer działający w następujący sposób ( działający np co 20 ms )

KOD cpp:     UKRYJ  
if(Nadawanie) {
 // Wysylanie danych na port
  Nadawanie = false;
} else {
// Odbieranie danych
  int ileDanych = Com->InQueCount(); // czy jaka funkcja która powie ile jest danych w buforze odbiorczym
 
  // W zależności od transmisji czekasz np na na główek w którym jest zapisane ilość danych do odczytu albo
  if( ODEBRANO TYLE ILE CHCESZ )
  Nadawnie = true;
}
 


Coś takiego za mało info podałeś, czy transmisja jest OnWire ??
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Dlaczego nie działa funkcja Sleep

Nowy postprzez Cyfrowy Baron » czwartek, 4 kwietnia 2013, 10:34

Jak już pisałem, funkcja Sleep() wstrzymuje aplikację, a więc nie będzie ona nasłuchiwała komunikatów. Zrób jak napisał Corvis.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Dlaczego nie działa funkcja Sleep

Nowy postprzez tomnar » czwartek, 4 kwietnia 2013, 11:08

Transmisja między PC a urządzeniem jest następująca.
* program wysyła zapytanie do urządzenia
* urządzenie w ciągu 5 ms potwierdza przyjęcie zapytania
* po następnych 5 ms urządzenie odpowiada na zapytanie
i czeka do 50ms na potwierdzenie programu że otrzymał
poprawne dane. Jeżeli potwierdzenia nie otrzyma
wysyła co około 5ms odpowiedź powtarzając ją 10 razy.

Dotychczas programowałem w Baskomie (mikrokontrolery AVR). Widzę że muszę przestawić się na inne podejście do programowania.
W mikrokontrolerach sterowanie prowadziłem poprzez zgłaszane przerwania. W C++ zrobić to chyba należy poprzez zdarzenia
(nie wiem jak to nazwać). Nie bardzo jeszcze rozumiem określenia np, "odświeżenie kolejki komunikatów "; "czekasz np na na główek" itp.
Zdaje sobie sprawę że sposób nauki programowania poprzez przystosowania przykładów znalezionych
w internecie nie jest właściwy ale od czegoś należy zacząć.
Jeszcze raz dziękuje za pomoc.
Avatar użytkownika
tomnar
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): środa, 3 kwietnia 2013, 22:13
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: winxp
Kompilator: Builder 6
Gadu Gadu: 0
    Windows XPChrome

Re: Dlaczego nie działa funkcja Sleep

Nowy postprzez Cyfrowy Baron » piątek, 5 kwietnia 2013, 09:21

Posłuż się obiektem typu TTimer i jego zdarzeniem OnTimer. Właściwość Interval obiektu określa częstotliwość z ją zegar tyka, wartość 1000 = 1 sekunda. Właściwość Enabled określa stan zegara false - zegar nie tyka, true - zegar tyka.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Dlaczego nie działa funkcja Sleep

Nowy postprzez polymorphism » piątek, 5 kwietnia 2013, 10:18

Nie bardzo jeszcze rozumiem określenia np, "odświeżenie kolejki komunikatów "

Każda aplikacja okienkowa posiada kolejkę komunikatów*), do której spływają komunikaty zgłaszane przez system lub kontrolki. Komunikaty na bierząco odbierane są w tak zwanej pętli komunikatów, która w wersji podstawowej składa się z wywołań trzech funkcji: GetMessage, TranslateMessage i DispatchMessage. Pierwsza funkcja pobiera komunikat z kolejki, ostatnia - przekazuje komunikat do właściwego okna, do właściwej procedury obsługi, czyli np. OnClick, OnTimer itp. Stąd prosty wiosek, że twój kod wykonuje się w trakcie obsługi jakiegoś komunikatu, zatem nie ma możliwości, żeby w tym samym czasie były odbierane inne komunikaty (Sleep usypia cały proces, czyli także pętle komunikatów). ProcessMessages pozwala na obsłużenie zalegających komunikatów z poziomu obsługi innego komunikatu, dzięki czemu da się zniwelować niekorzystny efekt blokowania aplikacji. Choć nie zawsze to działa, czasem trzeba użyć wątków.

*) prawdę mówiąc, to każdy proces i wątek z założenia posiada kolejkę komunikatów, niezależnie od tego, czy jest to aplikacja okienkowa czy nie. W sumie to jeden z mechanizmów komunikacji międzyprocesowej (IPC).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 14 gości

cron