Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Come evitare che il programma si blocchi?
Forum - C/C++ - Come evitare che il programma si blocchi?

Avatar
Dany (Member)
Pro


Messaggi: 129
Iscritto: 03/05/2012

Segnala al moderatore
Postato alle 22:02
Giovedì, 16/08/2012
Ciao a tutti.......vi spiego qualè il problema:
Praticamente sto lavorando ad un programma che per compiere determinate operazioni nel WM_PAINT (o anche ne WM_TIMER) impiega svariati secondi....il problema è che quando impiega un tot numero di secondi (meno di una decina)il programma non risponde e sono costretto a terminarlo tramite taskmanager. Il fatto è che una volta che si blocca lo si può lo stesso fermare per analizzarlo in debug mettendo un BreakPoint nella WM_TIMER e ciò mi insospettisce! in pratica il programma continua a funzionare non da segni.....ecco....credo di essermi spiegato. avete suggerimenti?

S.O. Windows 7 Professional 32 bit
Compilatore/IDE: Sia DevC++ 5 che MSVC++2010Express
Sto utilizzando le API di Win32.

Grazie in anticipo.....:k:

PM Quote
Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Segnala al moderatore
Postato alle 13:52
Venerdì, 17/08/2012
Potrei dire una cavolata ma forse eseguendo il codice in un thread separato funziona.
Comunque se ho capito bene la finestra si "congela" ?

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 14:02
Venerdì, 17/08/2012
mostra il codice del WM_PAINT altrimenti non si capisce nulla

PM Quote
Avatar
Dany (Member)
Pro


Messaggi: 129
Iscritto: 03/05/2012

Segnala al moderatore
Postato alle 21:38
Venerdì, 17/08/2012
Intanto grazie, comunque per XBarboX:
Non ho idea di cosa sia un thread, mi pare di aver letto che permette di svolgere istruzioni in contemporanea???:-?
Per Lorenzo:
Ecco il codice:
Codice sorgente - presumibilmente C/C++

  1. case WM_PAINT:
  2.             PAINTSTRUCT ps;
  3.             HDC hdcWindow;
  4.             hdcWindow = BeginPaint(hwnd, &ps);
  5.             //Questo serve a ridisegnare le varie assonometrie dello spazio 3d se si //preme una freccia direzonale.
  6.             if (rot%3==0)
  7.                DrawGriglia1(hdcWindow);
  8.                
  9.             if (rot%3==1)
  10.                DrawGriglia2(hdcWindow);
  11.                
  12.             if (rot%3==2)
  13.                DrawGriglia3(hdcWindow);
  14.             if (rpn!="")  
  15.                         funpress++;
  16.                        
  17.                 /**************************************************************/
  18. /*Il Programma disegna grafici 3D di funzioni   .*/
  19.               hdcWindow = GetDC(hwnd);
  20.                           for (k=-Mz;k<=Mz+(2*Mz/prec);k=k+2*Mz/prec)
  21.                           {
  22.                   percentuale=int((k+Mz)*100/(2*Mz));
  23.                   SendMessage(pro, PBM_SETPOS, percentuale, 0);
  24.                                   for (j=-My;j<=My;j=j+2*My/prec)
  25.                                   {
  26.                       for (i=-Mx;i<=Mx;i=i+2*Mx/prec)
  27.                       {
  28.                           result=SolveRPN(rpn,i,j,k);
  29.                           result2=SolveRPN(rpn2,i,j,k);
  30.                           if (fabs(result-result2)<Mx/100)
  31.                           {
  32.                                penna=CreatePen(PS_SOLID,3,RGB(fabs(k*255/Mz),255-fabs(k*255/Mz),fabs(k*255/Mz)));
  33.                                            SelectObject(hdcWindow,penna);
  34.                                if (rot%3==0)
  35.                                /*ADATTAMENTO ALL'ASSONOMETRIA*/
  36.                                {
  37.                                   x=i/2;
  38.                                   y=j/1.4142135-k;
  39.                                   ballX=int(500-x*500/Mx);
  40.                                   ballY=int(500+y*500/My);
  41.                                   pp[1].x=ballX;
  42.                                                               pp[1].y=ballY;
  43.                                                               if ((pp[0].x>0)&&(pp[0].y>0)&&(dist(pp[1],pp[0])<350)&&(ckx==BST_CHECKED))
  44.                                                                 Polyline(hdcWindow,pp ,2);
  45.                                       pp[0].x=ballX;
  46.                                                               pp[0].y=ballY;
  47.                                                               if (ckx!=BST_CHECKED)
  48.                                                               {
  49.                                       if (((i<0)||(j<0)||(k<0))||((i<0)&&(j<0)&&(k<0)))
  50.                                       {
  51.                                           SetPixel(hdcWindow,ballX,ballY,RGB(255,0,255));  
  52.                                           SetPixel(hdcWindow,ballX+1,ballY,RGB(255,0,255));
  53.                                           SetPixel(hdcWindow,ballX-1,ballY,RGB(255,0,255));
  54.                                           SetPixel(hdcWindow,ballX,ballY+1,RGB(255,0,255));
  55.                                           SetPixel(hdcWindow,ballX,ballY-1,RGB(255,0,255));      
  56.                                       }
  57.                                       if ((i>0)&&(j>0)&&(k>0))
  58.                                       {
  59.                                           SetPixel(hdcWindow,ballX,ballY,RGB(255,0,0));  
  60.                                           SetPixel(hdcWindow,ballX+1,ballY,RGB(255,0,0));
  61.                                           SetPixel(hdcWindow,ballX-1,ballY,RGB(255,0,0));
  62.                                           SetPixel(hdcWindow,ballX,ballY+1,RGB(255,0,0));
  63.                                           SetPixel(hdcWindow,ballX,ballY-1,RGB(255,0,0));  
  64.                                       }
  65.                                   }
  66.                                }                        
  67.                                if (rot%3==1)
  68.                                {
  69.                                   x=(i-(j/1.73205))*1.73205/2;
  70.                                   y=(j*2/1.73205)+((i-(j/1.73205))/2)-k;
  71.                                   ballX=int(500-x*500/Mx);
  72.                                   ballY=int(500+y*500/My);
  73.                                   pp[1].x=ballX;
  74.                                                               pp[1].y=ballY;
  75.                                                               if ((pp[0].x>0)&&(pp[0].y>0)&&(dist(pp[1],pp[0])<350)&&(ckx==BST_CHECKED))
  76.                                                                 Polyline(hdcWindow,pp ,2);
  77.                                       pp[0].x=ballX;
  78.                                                               pp[0].y=ballY;
  79.                                                               if (ckx!=BST_CHECKED)
  80.                                                               {
  81.                                       if (((i<0)||(j<0)||(k<0))||((i<0)&&(j<0)&&(k<0)))
  82.                                       {
  83.                                           SetPixel(hdcWindow,ballX,ballY,RGB(255,0,255));  
  84.                                           SetPixel(hdcWindow,ballX+1,ballY,RGB(255,0,255));
  85.                                           SetPixel(hdcWindow,ballX-1,ballY,RGB(255,0,255));
  86.                                           SetPixel(hdcWindow,ballX,ballY+1,RGB(255,0,255));
  87.                                           SetPixel(hdcWindow,ballX,ballY-1,RGB(255,0,255));      
  88.                                       }
  89.                                       if ((i>0)&&(j>0)&&(k>0))
  90.                                       {
  91.                                           SetPixel(hdcWindow,ballX,ballY,RGB(255,0,0));  
  92.                                           SetPixel(hdcWindow,ballX+1,ballY,RGB(255,0,0));
  93.                                           SetPixel(hdcWindow,ballX-1,ballY,RGB(255,0,0));
  94.                                           SetPixel(hdcWindow,ballX,ballY+1,RGB(255,0,0));
  95.                                           SetPixel(hdcWindow,ballX,ballY-1,RGB(255,0,0));  
  96.                                       }
  97.                                   }
  98.                                }
  99.                                if (rot%3==2)
  100.                                {
  101.                                   x=(i-(j/2))/2;
  102.                                   y=(i-j/2)/(1.73205/2)+(2*j/1.73205)-k;
  103.  
  104.                                   ballX=int(500-x*500/Mx);
  105.                                   ballY=int(500+y*500/My);
  106.                                   pp[1].x=ballX;
  107.                                                               pp[1].y=ballY;
  108.                                                               if ((pp[0].x>0)&&(pp[0].y>0)&&(dist(pp[1],pp[0])<350)&&(ckx==BST_CHECKED))
  109.                                                                 Polyline(hdcWindow,pp ,2);
  110.                                       pp[0].x=ballX;
  111.                                                               pp[0].y=ballY;
  112.                                                               if (ckx!=BST_CHECKED)
  113.                                                               {
  114.                                       if (((i<0)||(j<0)||(k<0))||((i<0)&&(j<0)&&(k<0)))
  115.                                       {
  116.                                           SetPixel(hdcWindow,ballX,ballY,RGB(255,0,255));  
  117.                                           SetPixel(hdcWindow,ballX+1,ballY,RGB(255,0,255));
  118.                                           SetPixel(hdcWindow,ballX-1,ballY,RGB(255,0,255));
  119.                                           SetPixel(hdcWindow,ballX,ballY+1,RGB(255,0,255));
  120.                                           SetPixel(hdcWindow,ballX,ballY-1,RGB(255,0,255));      
  121.                                       }
  122.                                       if ((i>0)&&(j>0)&&(k>0))
  123.                                       {
  124.                                           SetPixel(hdcWindow,ballX,ballY,RGB(255,0,0));  
  125.                                           SetPixel(hdcWindow,ballX+1,ballY,RGB(255,0,0));
  126.                                           SetPixel(hdcWindow,ballX-1,ballY,RGB(255,0,0));
  127.                                           SetPixel(hdcWindow,ballX,ballY+1,RGB(255,0,0));
  128.                                           SetPixel(hdcWindow,ballX,ballY-1,RGB(255,0,0));  
  129.                                       }
  130.                                   }
  131.                               }
  132.                           }
  133.                       }
  134.                   }
  135.               }
  136.               pp[0].x=0;
  137.               pp[0].y=0;
  138.              
  139.               funpress=0;
  140.              
  141.             EndPaint(hwnd, &ps);
  142.                  break;


PM Quote
Avatar
Dany (Member)
Pro


Messaggi: 129
Iscritto: 03/05/2012

Segnala al moderatore
Postato alle 21:39
Venerdì, 17/08/2012
In pratica il problema sta nei tre cicli annidati che in totale si ripetono 343000volte.
MI SCUSO SE IL CODICE è ESTREMAMENTE SCOMMENTATO MA DOVREBBE ESSERE ABBASTANZA INTUITIVO, PER QUALSIASI CHIARIMENTO CHIEDI PURE ;)

Ultima modifica effettuata da Dany il 17/08/2012 alle 21:41
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 21:59
Venerdì, 17/08/2012
Secondo me dovresti porti 3 domande:

1) ad OGNI repaint della finestra deve essere eseguita tutta quella roba? Non si può ottimizzare in qualche modo? Magari ridisegnando solo la parte invalidata...

2) varrebbe la pena di usare il double buffering? Potrebbe aumentare la velocità di esecuzione.

3) si può usare un thread? Se la GUI principale deve smistare i dati, non può certo essere utilizzata per fare calcoli. Il thread esegue "a parte" tutti i calcoli, passando poi alla GUI il risultato(magari usando il punto 2)


PM Quote
Avatar
Dany (Member)
Pro


Messaggi: 129
Iscritto: 03/05/2012

Segnala al moderatore
Postato alle 17:35
Sabato, 18/08/2012
Grazie, ma ora ti spiego:
Il problema non sta nel fatto che WM_PAINT deve ripetersi ogni volta ma sta nel fatto che deve fare tutta quella roba e fa "congelare il programma"....inoltre Potresti spiegarmi gentilmente cosa sia il double buffering? credo venda usato nei programmi tipo MSPaint....mi accontento anche di un link....:k:

PM Quote
Avatar
Dany (Member)
Pro


Messaggi: 129
Iscritto: 03/05/2012

Segnala al moderatore
Postato alle 11:02
Giovedì, 23/08/2012
Comunque ho risolto, è bastato creare una funzione che corrispondeva alla DoEvents in VB ed eliminare la penna=CreatePen(...); che evidentemente se ripetuta troppe volte in un ciclo portava al blocco dell'applicazione...Grazie lo stesso;)

PM Quote