Skocz do zawartości

[BCB6] Wstrzymanie symulacji


barti82

Polecane posty

Jestem w trakcie pisania programu, ktorego celem jest symulacja, mniej istotne czego, bo chodzi o to, ze chcialbym wstawic na plansze przycisk, po ktorego nacisnieciu symulacja wstrzymywalaby sie, moznaby w miedzy czasie odczytac i spisac z niej wyniki, a potem po nacisnieciu innego przycisku by znow wznawiala sie od stanu, w ktorym zostala zatrzymana, tylko nie wiem jak to zrobic sad.gif Ma ktos jakies pomysly? Moze sa juz gotowe funkcje w Builderze? Za wszelka pomoc z gory dziekuje! smile.gif

Link do komentarza
Udostępnij na innych stronach

Może po prostu po naciśnięciu na wstrzymanie zapisujesz aktualne parametry tego czegoś a po w znowieniu zaczynasz od nich. Albo po prostu masz jakaś pętle w której wykonywane są obliczenia tego czegoś co symulujesz i wsadzasz jedną zmienną BOOL i jak true to robisz obliczenia jak false to wszystko stoi. W czym problem ?

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

robisz tak:
w petli symulujace cos np:
Pascal
fSimulBreak = false;
for(int t=0;t<100000000;t++){
cos tam./..
......
.....
Application->ProcessMessages();
if (fSimulBreak == true) {break;}
}


//w kodzie gozika ktory ma przerywac powinno byc cos takiego
....
fSimulBreak = true;
....



Zmienna fSimulBreak powinna byc zmienna globalna (lub zmienna dla kolasy prowadzacej symulacje). Nie wiem czy w BorlandC jest procedura Application->ProcessMessages(); napisalem to na podstawie Delphi ale zakladam ze jest jakis podobny mechanizm ktory ci to umozliwi. Ogolna zasada jest taka:
1. Zerujesz zmienna mowiaca czy przerwac symulacje
2. wchodzisz do perli symulacji
3. W kazdym kroku sprawdzasz czy odpowiednia zmienna jest false/true jesli jest true to wyskakujesz z petli symulacji
4. wykonujesz kod ktory pozwala na przetworzenie komunikatow systemu (ProcessMessages)
5. W odpowiedniej procedurze obslugujacej klikniecie klawisza ustawiasz zmienna odpowiedzialna za przerwanie symulacji na true.

Inne podejscie (ale wydaje mi sie ze bedzie dla ciebie duzo trudniejsze) to zrobic proces symulacji na osobnym watku. Jesli bys chcial przerwac symulacje kilujesz wtedy watek.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

heh :)
ale zes wymyslil :)
najlepiej to na watkach bo mozesz sobie suspenda zrobic. albo robisz takie cos ze jak breakujesz symulacje to robisz jej dumpa do np pliku albo gdzies do pamieci. Gdy uzytkownik da continue to inicjujesz co tam potrzeba na podstawie tego dumpa i wskakujesz do petli symulacji.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Programuję w Delphi, ale BCB6 ma pewnie podobne funkcji, tylko składnia się różni. Jednakże spróbuje dostosować się do C++.

Zrobiłbym tak samo jak Toster ale zamiast

Pascal

if (fSimulBreak == true) {break;}

}




dałbym

Pascal

while (fSimulBreak == true)

{

Application->ProcessMessages();

}




I jak ktoś naciśnie guzik "Ponów" to trzeba fSimualBrak dać false.

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

nie taki dobry.
bo jak ktos kliknie symuluj pozniej wstrzymaj a pozniej znowu symulyuj to dostaniesz nieprzewidziane zachowanie. chyba ze na poczatku procki symuluj sprawdzisz jeszcze jaks flage ktora mowi o tym czy symulacja byla wczesniej rozpoczeta i trzeba ja wznowic czy rozpoczac od nowa.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Wg mnie to i tak mniej czasu i mniej skomplikowane jest dodanie zmiennej określającej stan symulacji niż pisanie wątków. Przy wątkach też by trzeba byłoby sprawdzać czy wątek już został stworzony i należy go wznowić, czy też go stworzyć. Najlepiej aby był jeden guzik, któremu zmienia się Caption, a Tag by określał stan. Wątki mi słabo wychodzą, co nie oznacza, że są złe biggrin.gif Raczej to ja jestem gorszy, choć jeszcze nigdy nie potrzebowałem pisać wątków

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

Przycisk uruchamiajacy symulacje dziala tylko raz po jego nacisnieciu sie deaktywuje, wiec tu problemu nie ma smile.gif Bo albo ktos po wstrzymaniu bedzie musial wznowic symulacje osobnym przyciskiem albo ja zakonczyc calkowicie innym smile.gif Ja tez jeszcze nigdy watkami sie nie bawilem, wiec ten pomysl nie dosc ze nie jest skomplikowany to przede wszystkim skuteczny, dlatego go zastosowalem i efekt podoba mi sie smile.gif Ale dziekuje Wam wszystkim za pomoc smile.gif

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...