CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Reakcja na zdarzenia w czasie trwania obliczeń

Reakcja na zdarzenia w czasie trwania obliczeń

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Reakcja na zdarzenia w czasie trwania obliczeń

Nowy postprzez szatek » wtorek, 15 marca 2011, 21:55

Witam. Robię w C++ Builderze 6 aplikacją która robi symulację korzystając z mechanizmu automatu komórkowego. Chciałbym, żeby po naciśnięciu start wykonywała się symulacja aż do naciśnięcia stop. Jednak nie jest to łatwe z tego względu że gdy wykonuje się symulacja forma nie reaguje na zdarzenia. Moje pytanie, potrzebny jest osobny wątek czy da się jakoś prościej obejść to w C++ Builderze? Z góry dziękuje za pomoc.
Avatar użytkownika
szatek
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Arch Linux
Windows XP SP2
Kompilator: C++ Builder 6
Gadu Gadu: 3401308
    Windows 7Chrome

Re: Reakcja na zdarzenia w czasie trwania obliczeń

Nowy postprzez Cyfrowy Baron » środa, 16 marca 2011, 12:37

Jeżeli zadanie realizowane jest w pętli to należy włączyć w nią kod odświeżający kolejkę komunikatów.

KOD cpp:     UKRYJ  
while(1) {
  Application->ProcessMessages(); /* odświeżenie kolejki komunikatów */
  if(stop) break; /* jeżeli warunek zostanie spełniony, przerywa działanie petli */
         }


Reakcja może być opóźniona w zależności od tego jakie operacje wykonywane są w pętli.

Bardziej praktyczny kod:

KOD cpp:     UKRYJ  
#include <limits>

BOOL stop = false;

void __fastcall TForm1::Button_RUN_Click(TObject *Sender)
{
 stop = false;

 for(int i = 0; i < std::numeric_limits<int>::max(); i++)
 {
  Caption = (String)i;

  Application->ProcessMessages();

  if(stop) break;
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button_STOP_Click(TObject *Sender)
{
 stop = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 stop = true;
}


Podana tutaj biblioteka limits Tobie się do niczego nie przyda, użyłem jej by określić maksymalny rozmiar zmiennej typu int, tak by długo wykonująca się pętla nie przekroczyła maksymalnej pojemności tej zmiennej, co jest sprawdzane poprzez kod: std::numeric_limits<int>::max()

W zdarzeniu OnClose dla formularza również umieściłem kod zmieniający stan zmiennej sterującej, tak by program dał się zamknąć, w przeciwnym razie pętla nie pozwoliłaby zakończyć programu aż do zakończenia działania.

Jeżeli chodzi tylko o zatrzymanie pętli to osobny wątek jest raczej zbędny.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
szatek
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
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


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

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

cron