Ĺadny brzuch
Załóżmy, że w programie mam dwa buttony (but_1 i but_2), kliknięcie but_1 powoduje rozpoczęcie wykonywania pętli nieskończonej natomiast zadaniem but_2 jest przerwanie tej pętli (jeśli oczywiście nastąpi wciśnięcie owego buttona). Jak to zrealizować ? Trochę się tym bawiłem, ale program na czas działania pętli nie reaguje na polecenia :/
Użytkownik OGGY_Lwiatko_89 edytował ten post 15 kwiecień 2008, 20:11
nie reaguje bo nie da sie wcisnac przycisku czy wiskasz i nic sie nie dizeje??
radzilbym zianteresowac sie watkami..
nie da się wcisnąć guzika. Program się wiesza, po przesunięciu nie odmalowuje okna. Zupełnie tak, jakby zajął się pracą nad pętlą i nic by go nie obchodziła cała reszta.
Co do wielowątkowości ... to miał być prosty program :P ... Pozatym, jeśli np kopiujemy jakiś większy plik z jednego miejsca w drugie to mamy do dyspozycji przycisk "Anuluj" (mam na myśli standradowe narzędzia windowsa) co powoduje przerwanie kopiowania i nie sądzę żeby w tak banalnej operacji wykorzystywana była wielowątkowość tylko i wyłącznie po to żeby dodać przycisk "Anuluj" :P
obawiam sie ze nawet do tak prostego zdarzenia trzbe posluzyc sie osobnym watkiem (np. przechwytujacym zdarzenia w tle)
wywolujac zdarzenie klikniecia (czyli najprosciej wywolujac funkcje) caly czas dzialasz na jendym watku, tym samym blokujesz dostep do czegokolwiek (nie wiem czy nawet mozesz wylaczyc program uzywajac "krzyzyka"), dopoki funkcja/zdarzenie nie skonczy dzialania..
A robisz w BCB? Jeśli tak, to do pętli wstaw Application->ProcessMessages();, app nie będzie się już wieszać. Co do przerwania, proponuję stworzyć zmienną boolowską i w niej zapisać czy przerwać. Ogólnie o coś takiego chodzi:
but_1Click:
while(true){ Application->ProcessMessages(); if(!halt){ //reszta kodu }}
but_2Click:
halt = true;
i w zmiennych:
bool halt = false;
Ale wątki będą na dłuższą metę lepsze jednak :)
Użytkownik Tomek92 edytował ten post 16 kwiecień 2008, 15:15
[C++ Error]program.cpp(113): E2451 Undefined symbol 'Application'
trzeba to zadeklarować, ale jak ?!
Użytkownik OGGY_Lwiatko_89 edytował ten post 24 kwiecień 2008, 21:55
Musisz to zdeklarować poprzez include.
Musisz to zdeklarować poprzez include.
domyślam się :) ... ale jaki konkretnie plik nagłówkowy mam includować ?
Jezeli chodzi o WinAPI to nie ma tam TApplication, jest to klasa VCL-owa. Ale wystarczy podejrzec kod metody ProcessMessages w zrodle i popatrzec jak tam jest to zrobione ;>
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Użytkownik OGGY_Lwiatko_89 edytował ten post 15 kwiecień 2008, 20:11
nie reaguje bo nie da sie wcisnac przycisku czy wiskasz i nic sie nie dizeje??
radzilbym zianteresowac sie watkami..
nie da się wcisnąć guzika. Program się wiesza, po przesunięciu nie odmalowuje okna. Zupełnie tak, jakby zajął się pracą nad pętlą i nic by go nie obchodziła cała reszta.
Co do wielowątkowości ... to miał być prosty program :P ... Pozatym, jeśli np kopiujemy jakiś większy plik z jednego miejsca w drugie to mamy do dyspozycji przycisk "Anuluj" (mam na myśli standradowe narzędzia windowsa) co powoduje przerwanie kopiowania i nie sądzę żeby w tak banalnej operacji wykorzystywana była wielowątkowość tylko i wyłącznie po to żeby dodać przycisk "Anuluj" :P
obawiam sie ze nawet do tak prostego zdarzenia trzbe posluzyc sie osobnym watkiem (np. przechwytujacym zdarzenia w tle)
wywolujac zdarzenie klikniecia (czyli najprosciej wywolujac funkcje) caly czas dzialasz na jendym watku, tym samym blokujesz dostep do czegokolwiek (nie wiem czy nawet mozesz wylaczyc program uzywajac "krzyzyka"), dopoki funkcja/zdarzenie nie skonczy dzialania..
A robisz w BCB? Jeśli tak, to do pętli wstaw Application->ProcessMessages();, app nie będzie się już wieszać. Co do przerwania, proponuję stworzyć zmienną boolowską i w niej zapisać czy przerwać. Ogólnie o coś takiego chodzi:
but_1Click:
while(true){ Application->ProcessMessages(); if(!halt){ //reszta kodu }}
but_2Click:
halt = true;
i w zmiennych:
bool halt = false;
Ale wątki będą na dłuższą metę lepsze jednak :)
Użytkownik Tomek92 edytował ten post 16 kwiecień 2008, 15:15
[C++ Error]program.cpp(113): E2451 Undefined symbol 'Application'
trzeba to zadeklarować, ale jak ?!
Użytkownik OGGY_Lwiatko_89 edytował ten post 24 kwiecień 2008, 21:55
Musisz to zdeklarować poprzez include.
Musisz to zdeklarować poprzez include.
domyślam się :) ... ale jaki konkretnie plik nagłówkowy mam includować ?
Jezeli chodzi o WinAPI to nie ma tam TApplication, jest to klasa VCL-owa. Ale wystarczy podejrzec kod metody ProcessMessages w zrodle i popatrzec jak tam jest to zrobione ;>