CYFROWY BARON • PROGRAMOWANIE • Zobacz wÄ…tek - Blokowanie formy na czas pÄ™tli
Strona 1 z 1

Blokowanie formy na czas pętli

Nowy postNapisane: sobota, 17 lipca 2010, 11:46
przez marnowak
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.

Re: Blokowanie formy na czas pętli

Nowy postNapisane: sobota, 17 lipca 2010, 13:46
przez Cyfrowy Baron
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
}
 

Re: Blokowanie formy na czas pętli

Nowy postNapisane: niedziela, 18 lipca 2010, 16:14
przez Darek_C++
Zastosuj wątki których implementacja w BCB jest bardzo prosta.

Re: Blokowanie formy na czas pętli

Nowy postNapisane: poniedziałek, 19 lipca 2010, 12:04
przez janek2012
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 :)

Re: Blokowanie formy na czas pętli

Nowy postNapisane: poniedziałek, 19 lipca 2010, 12:07
przez Cyfrowy Baron
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.

Re: Blokowanie formy na czas pętli

Nowy postNapisane: czwartek, 12 maja 2011, 22:55
przez kwgrkwgr
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.

Re: Blokowanie formy na czas pętli

Nowy postNapisane: piÄ…tek, 13 maja 2011, 16:15
przez Cyfrowy Baron
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...

Re: Blokowanie formy na czas pętli

Nowy postNapisane: wtorek, 17 maja 2011, 23:25
przez Slynx
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;