• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

c++ te same funkcje blokują się wzajemnie

Object Storage Arubacloud
0 głosów
335 wizyt
pytanie zadane 9 lipca 2015 w C i C++ przez katolik6 Dyskutant (8,140 p.)
edycja 9 lipca 2015 przez katolik6

Mam funkcję:

bool TForm1::strzal(int x, int y, int xd, int yd, int zasieg){//startowy, docelowy, zasięg
TImage *pocisk;
pocisk=new TImage(Form1);
if((xd==x)&&(y==yd))return 0;
int xr=0, yr=0, d, xb=xd-x, yb=yd-y, xw=1, yw=1;//reszta, dłuższy, boki, wektor
if(yb<0)yb=-yb;
if(xb<0)xb=-xb;
if(xd<x)xw=-1;
if(yd<y)yw=-1;
if(xb>yb)d=xb; else d=yb;

pocisk->Visible=true;
pocisk->Parent=Form1;
pocisk->AutoSize=true;
pocisk->Picture=bullet;
sndPlaySound("gun.wav", SND_ASYNC);
//przesuwanie<br>
for(int i=0; i<zasieg; i++){
    xr+=xb%d;
    if(xr>=d){xr-=d; x+=xw;}
    x+=(xb/d)*xw;
    yr+=yb%d;
    if(yr>=d){yr-=d; y+=yw;}
    y+=(yb/d)*yw;
    pocisk->Left=x-1;
    pocisk->Top=y-1;
//kolizja<br>
    if(trafienie(beczka1, x, y)){buum(beczka1); delete pocisk; return true;}//funkcja trafienie odejmie hp
    if(pixel[x][y]){delete pocisk; return false;}
    Application->ProcessMessages(); Sleep(10);
}}

i gdy wywołuję ją dwa razy, tak, że druga jest wywoływana zanim pierwsza zwróci wartość, to pierwsza się ,,zamraża'' na czas wykonania drugiej (co oczywiście nie jest porządane), widać to po obiekcie pocisk. Czy ktoś wie czym to jest spowodowane (może

Application->ProcessMessages(); Sleep(10);

, jednak nie umiem zatrzymać pętli inaczej bez wstrzymywania całej reszty programu, więc nie mam jak tego sprawdzić) i jak można ten problem obejść?

 

P.S. Zauważyłem, że blokują też wyłączenie programu.

2 odpowiedzi

+1 głos
odpowiedź 9 lipca 2015 przez hit02 Nałogowiec (33,970 p.)
wybrane 11 lipca 2015 przez katolik6
 
Najlepsza
Czy uruchamiasz funkcje w oddzielnych wątkach? Funkcja Sleep() zamraża cały wątek.

Warto by określić dokładnie, w którym miejscu funkcje się zamrażają. Możesz spróbować debuggerem lub wypisywać coś na konsolę i sprawdzać, czy tam już jest zamrożone, czy nie.
komentarz 10 lipca 2015 przez katolik6 Dyskutant (8,140 p.)
wywołuję ją w OnClicku przeźroczystego TImage rozciągniętego na całą formę. Funkcja okodowuje tor lotu pocisku , więc dość dokładnie widać kiedy kula się zatrzymuje: dokładnie w chwili wystrzału drugiej.
Co do wielowątkowości: pojedynczy OnClick na pewno ma oddzielny wątek, ale nie wiem jak jest w tej sytuacji, czyli dwukrotne jednoczesne jego wywołanie, ale wygląda na to, że to ten sam wątek.
komentarz 10 lipca 2015 przez hit02 Nałogowiec (33,970 p.)
Nie wiem, jak to wygląda dokładnie w tej sytuacji, więc pewnie da się to zrobić lepiej, ale ja bym poprostu zamiast wywoływać funkcję strzal() wywołał jakiś wrapper, ktury by wywoływał strzal() w oddzielnym wątku.

Możesz też pokombinować z synchronizacją czasu tj. nie uruchamiać wszystkich pocisków w oddzielnych wątkach, bo zbyt wydajne to to nie jest, ale stworzyć listę pocisków i w pętli robić obliczenia dla każdego z nich na podstawie czasu, który minął.
komentarz 10 lipca 2015 przez katolik6 Dyskutant (8,140 p.)
hmm... listę pocisków powiadasz? musiałbym robić listę funkcji... tfu! jak by to miało działać? Trzeba zrobić klasę pocisk. Dzięki, jakoś to ogarnę.
+1 głos
odpowiedź 10 lipca 2015 przez Pan Kulomb Pasjonat (18,630 p.)
Radzę ci chociaż trochę oczyszczać kod zanim go umieścisz na forum. Zrozumiegie go stanie się o wiele prostsze.
komentarz 11 lipca 2015 przez katolik6 Dyskutant (8,140 p.)
tia, sorry, zapomniałem i wkleiłem rzywcem ze środowiska :/

Podobne pytania

0 głosów
2 odpowiedzi 961 wizyt
pytanie zadane 28 lutego 2016 w C i C++ przez Picowaty91 Początkujący (270 p.)
+2 głosów
0 odpowiedzi 668 wizyt
pytanie zadane 8 stycznia 2016 w C i C++ przez Poczontkujący Początkujący (370 p.)
0 głosów
1 odpowiedź 495 wizyt
pytanie zadane 27 listopada 2015 w C i C++ przez niezalogowany

92,555 zapytań

141,402 odpowiedzi

319,539 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...