Blokowanie formy na czas pętli

dział ogólny

Blokowanie formy na czas pętli

Nowy postprzez marnowak » sobota, 17 lipca 2010, 11:46

Witam!
W zdarzeniu onClick przycisku Radio mam uwarunkowaną pętle. W czasie jej wykonywania program blokuje mi przyciski formy. Jak tego uniknąć. Chciałbym np, aby po wciśnięciu jakiegokolwiek przycisku na formie program opuszczał pętle.
Avatar użytkownika
marnowak
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): piątek, 16 lipca 2010, 23:42
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows XPFirefox

Re: Blokowanie formy na czas pętli

Nowy postprzez Cyfrowy Baron » sobota, 17 lipca 2010, 13:46

Ten temat był już wielokrotnie poruszany na tym forum. Musi użyć funkcji Application->ProcessMessages() do odświeżenia kolejki komunikatów. Co do wyjścia z pętli to potrzebna jest zmienna sterująca, w zależności od stanu której pętla będzie przerywała działanie:

Kod: Zaznacz cały

bool przerwij 
= false; // zmienna stetująca
void __fastcall TForm1::Button1Click(TObject *Sender) // uruchomienie pętli po kliknięciu na Button1
{
 przerwij = false;
 for(int i = 0; i < 10000; i++)
 {
  // jakieś zadanie w pętli

  Application->ProcessMessages(); // odświeżenie kolejki komunikatów
  if(przerwij == true) break; // wyjście z pętli jeżeli zmienna przerwij ma wartość true
 }
}
//------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) // przerwanie działania pętli po kliknięciu na Button2
{
 przerwij = true; // zmiana stanu zmiennej sterującej
}
 
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Blokowanie formy na czas pętli

Nowy postprzez Darek_C++ » niedziela, 18 lipca 2010, 16:14

Zastosuj wątki których implementacja w BCB jest bardzo prosta.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Blokowanie formy na czas pętli

Nowy postprzez janek2012 » poniedziałek, 19 lipca 2010, 12:04

Darek_C++ napisał(a):Zastosuj wątki których implementacja w BCB jest bardzo prosta.

Dokładnie, a żeby zasygnalizować pracę programu, użyj Screen->Cursor = crHourGlass :)
Avatar użytkownika
janek2012
Bladawiec
Bladawiec
 
Posty: 30
Dołączył(a): poniedziałek, 12 lipca 2010, 22:56
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows 8 x64
Kompilator: C++ Builder XEe
SKYPE: janek2012
Gadu Gadu: 1489603
    Windows 7Opera

Re: Blokowanie formy na czas pętli

Nowy postprzez Cyfrowy Baron » poniedziałek, 19 lipca 2010, 12:07

Ze stosowaniem wątków do jednej pętli jest jak z zaprzęganiem kombajnu do skoszenia jednego ara pszenicy. Jeżeli podczas działanie pętli program nie wykonuje żadnych innych zadać, to oddzielny watek jest zbędny, gdyż odświeżenie kolejki komunikatów w każdym obiegu pętli wystarczy, by odblokować okno programu i przerwać działanie tejże pętli.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Blokowanie formy na czas pętli

Nowy postprzez kwgrkwgr » czwartek, 12 maja 2011, 22:55

Nie znam się na wątkach. Z tego co jest wyżej napisane widzę że w moim przypadku wystarczy:
KOD cpp:     UKRYJ  
Application->ProcessMessages(); // odświeżenie kolejki komunikatów
w pętli w której przetwarzam obiekt w Timage.
Ale obecnie nie mam w kompie procka 1 rdzeniowego i chciałbym polepszyć wykorzystanie procka na zasadzie że np: 1 proces przetwarza 0-50% obrazka a 2 proces 50-100% obrazka w przypadku gdy to jest możliwe.
Ale dla uproszczenia wczytane 2 obrazki do 2 Timage i chcę je przetwarzać jednocześnie każdy na osobnym rdzeniu.
Funkcja przetwarzająca ma postać PrzetawrzajOrazek( in_img , out_img).
A dodatkowo jak dodać progressbar by było widać jak postęp?
W jakimś przeczytałem że z OpenCV pod Embarcadero RAD Studio 2010 jest niezaciekawie, ciężko dodać i używać. Czy już jest lepiej?
Pytam ponieważ najnowsza wersja oferuje operacje na CUDA bez zbytniego zgłębiania się w specyfikacje.
Avatar użytkownika
kwgrkwgr
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 13 kwietnia 2011, 16:37
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WinXP Win7
Kompilator: C++ Builder 6;
C++ Builder 2010;
MS Visual 2008 C#;
Gadu Gadu: 9692051
    Windows XPOpera

Re: Blokowanie formy na czas pętli

Nowy postprzez Cyfrowy Baron » piątek, 13 maja 2011, 16:15

Nie ma uniwersalnej metody na dodanie ProgressBar do funkcji przetwarzającej grafikę. Klasa TImage nie udostępnia takich metod. poza tym TImage nie przetwarza grafiki. Jedyne co robi TImagte to udostępnia powierzchnię do rysowania grafiki, i automatycznie odświeża tą grafikę, gdy zachodzi taka potrzeba. Jeżeli chcesz dodać ProgressBar, to jak i gdzie go dodasz zależy już od tego jak masz skonstruowane funkcje. Dodatkowe obrazowanie przetwarzania z wykorzystaniem ProgressBar to dodatkowe obciążenie.

kwgrkwgr napisał(a):Ale obecnie nie mam w kompie procka 1 rdzeniowego i chciałbym polepszyć wykorzystanie procka na zasadzie że np: 1 proces przetwarza 0-50% obrazka a 2 proces 50-100% obrazka w przypadku gdy to jest możliwe.


O tym który rdzeń jest wykorzystywany to decyduje chyba system, gdy pierwszy rdzeń jest zajęty, to pozostałe operacje wykorzystuje rdzeń drugi. Być może jednak w Windows 7 już to zmienili i można tym sterować - nie wiem...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Blokowanie formy na czas pętli

Nowy postprzez Slynx » wtorek, 17 maja 2011, 23:25

W Windows 7 jest w menedżerze zadań opcja "ustaw koligację" która umożliwia wybranie procesora(-ów) na których będzie wykonywany proces. Ale z tego co zauważyłem to tylko teoria, wymaganie jest wsparcie aplikacji. 90 % aplikacji i tak będzie pracować na 1 rdzeniu, tak jak u mnie. Nie dało się zmusić systemu np. do pracy Chrome-a na 2 rdzeniu, a systemu na 1;
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

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 4 gości

cron